[FFmpeg-devel] [PATCH] Default to using libraries when enabled

David Conrad lessen42
Mon May 24 00:33:58 CEST 2010


On May 23, 2010, at 6:04 PM, Baptiste Coudurier wrote:

> On 5/23/10 2:59 PM, Janne Grunau wrote:
>> On Sun, May 23, 2010 at 06:41:35PM +0200, Michael Niedermayer wrote:
>>> On Sat, May 22, 2010 at 12:48:02PM +0200, Janne Grunau wrote:
>>>> See attached patches for selections by codec id. Beside the aac and vorbis
>>>> encoder are there other codecs which should be considered experimental?
>>>> It's more tricky for selections by codec name since the names are unique.
>>>> The best solution is probably to fail in ffmpeg if the encoder is experimental
>>>> and -strict (or something else) is not set.
>>> 
>>>>  avcodec.h |    4 ++++
>>>>  utils.c   |   24 ++++++++++++++++--------
>>>>  2 files changed, 20 insertions(+), 8 deletions(-)
>>>> 62657abb5bcdd4c0791216099c04dc0e3b6cde36  avoid_experimental_codecs.diff
>>>> commit 75273f4917cf21fcab6da91c048fae5955012b68
>>>> Author: Janne Grunau<janne at grunau.be>
>>>> Date:   Sat May 22 02:19:30 2010 +0200
>>>> 
>>>>     add CODEC_CAP_EXPERIMENTAL and prefer codecs without this capability
>>>> 
>>>>     avcodec_find_{de|en}coder returns only imidiately if CODEC_CAP_EXPERIMENTAL
>>>>     is not set. The first experimental codec is saved and returned if no other
>>>>     codec was found.
>>>> 
>>>> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
>>>> index 8781c0a..a0d6498 100644
>>>> --- a/libavcodec/avcodec.h
>>>> +++ b/libavcodec/avcodec.h
>>>> @@ -645,6 +645,10 @@ typedef struct RcOverride{
>>>>   * as a last resort.
>>>>   */
>>>>  #define CODEC_CAP_SUBFRAMES        0x0100
>>>> +/**
>>>> + * Codec is experimental
>>> 
>>> // and is thus avoided in favor of non experimental encoders
>> 
>> updated patch attached
>> 
>>> the rest of the patch is ok with me
>> 
>> Janne
>> 
>> 
>> avoid_experimental_codecs2.diff
>> 
>> 
>> commit 35cda412179490370d56223c5bbd5dd29b35a9f6
>> Author: Janne Grunau<janne at grunau.be>
>> Date:   Sat May 22 02:19:30 2010 +0200
>> 
>>     add CODEC_CAP_EXPERIMENTAL and prefer codecs without this capability
>> 
>>     avcodec_find_{de|en}coder returns only imidiately if CODEC_CAP_EXPERIMENTAL
>>     is not set. The first experimental codec is saved and returned if no other
>>     codec was found.
>> 
>> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
>> index cd642ac..5e54953 100644
>> --- a/libavcodec/avcodec.h
>> +++ b/libavcodec/avcodec.h
>> @@ -645,6 +645,11 @@ typedef struct RcOverride{
>>   * as a last resort.
>>   */
>>  #define CODEC_CAP_SUBFRAMES        0x0100
>> +/**
>> + * Codec is experimental and is thus avoided in favor of non experimental
>> + * encoders
>> + */
>> +#define CODEC_CAP_EXPERIMENTAL     0x0200
>> 
>>  //The following defines may change, don't expect compatibility if you use them.
>>  #define MB_TYPE_INTRA4x4   0x0001
>> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
>> index 56d4dbd..978e4d3 100644
>> --- a/libavcodec/utils.c
>> +++ b/libavcodec/utils.c
>> @@ -725,14 +725,18 @@ av_cold int avcodec_close(AVCodecContext *avctx)
>> 
>>  AVCodec *avcodec_find_encoder(enum CodecID id)
>>  {
>> -    AVCodec *p;
>> +    AVCodec *p, *experimental=NULL;
>>      p = first_avcodec;
>>      while (p) {
>> -        if (p->encode != NULL&&  p->id == id)
>> -            return p;
>> +        if (p->encode != NULL&&  p->id == id) {
>> +            if (p->capabilities&  CODEC_CAP_EXPERIMENTAL&&  !experimental)
>> +                experimental = p;
>> +            else
>> +                return p;
>> +        }
>>          p = p->next;
>>      }
>> -    return NULL;
>> +    return experimental;
>>  }
>> 
>>  AVCodec *avcodec_find_encoder_by_name(const char *name)
>> @@ -751,14 +755,18 @@ AVCodec *avcodec_find_encoder_by_name(const char *name)
>> 
>>  AVCodec *avcodec_find_decoder(enum CodecID id)
>>  {
>> -    AVCodec *p;
>> +    AVCodec *p, *experimental=NULL;
>>      p = first_avcodec;
>>      while (p) {
>> -        if (p->decode != NULL&&  p->id == id)
>> -            return p;
>> +        if (p->decode != NULL&&  p->id == id) {
>> +            if (p->capabilities&  CODEC_CAP_EXPERIMENTAL&&  !experimental)
>> +                experimental = p;
>> +            else
>> +                return p;
>> +        }
>>          p = p->next;
>>      }
>> -    return NULL;
>> +    return experimental;
>>  }
>> 
>>  AVCodec *avcodec_find_decoder_by_name(const char *name)
>> 
> 
> Humm won't this have side effects for decoder developpers ?
> 
> Manually selecting encoders is easy, but not decoders.
> 
> For encoders I think I'm ok.

For ffmpeg, -vcodec before the -i works for me. It probably ought to be added to ffplay.



More information about the ffmpeg-devel mailing list