[FFmpeg-devel] [PATCH] Default to using libraries when enabled
Janne Grunau
janne-ffmpeg
Mon May 24 00:57:18 CEST 2010
On Sun, May 23, 2010 at 03:04:01PM -0700, 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 ?
I don't really expect experimental decoders since they are easier. The only
reason I did the same change to avcodec_find_decoder is consistency.
But if we have one decoder which plays only 50% of the samples of a format
and one which plays 90% or 100% I think the one which supports more samples
should be used by default.
> Manually selecting encoders is easy, but not decoders.
should be the same. ffmpeg -acodec aac|libfaad -i foo.mkv works even if the
input stream info always shows aac.
Janne
More information about the ffmpeg-devel
mailing list