[FFmpeg-devel] [PATCH] Fix opt_default()
Michael Niedermayer
michaelni
Wed Dec 17 01:22:27 CET 2008
On Tue, Dec 16, 2008 at 11:02:48PM +0100, Stefano Sabatini wrote:
> On date Tuesday 2008-12-16 22:05:43 +0100, Michael Niedermayer encoded:
> > On Tue, Dec 16, 2008 at 09:29:02PM +0100, Stefano Sabatini wrote:
> [...]
> > > Index: ffmpeg/libavcodec/opt.h
> > > ===================================================================
> > > --- ffmpeg.orig/libavcodec/opt.h 2008-12-16 19:46:41.000000000 +0100
> > > +++ ffmpeg/libavcodec/opt.h 2008-12-16 19:50:05.000000000 +0100
> > > @@ -105,6 +105,14 @@
> > > attribute_deprecated const AVOption *av_set_string(void *obj, const char *name, const char *val);
> > >
> > > /**
> > > + * @return a pointer to the AVOption corresponding to the field set or
> > > + * NULL if no matching AVOption exists, or if the value \p val is not
> > > + * valid
> > > + * @see av_set_string3()
> > > + */
> > > +attribute_deprecated const AVOption *av_set_string2(void *obj, const char *name, const char *val, int alloc);
> > > +
> > > +/**
> > > * Sets the field of obj with the given name to value.
> > > *
> > > * @param[in] obj A struct whose first element is a pointer to an
> > > @@ -120,14 +128,15 @@
> > > * scalars or named flags separated by '+' or '-'. Prefixing a flag
> > > * with '+' causes it to be set without affecting the other flags;
> > > * similarly, '-' unsets a flag.
> > > - * @return a pointer to the AVOption corresponding to the field set or
> > > - * NULL if no matching AVOption exists, or if the value \p val is not
> > > - * valid
> > > + * @param[out] o_out if non-NULL put here a pointer to the AVOption
> > > + * found
> > > * @param alloc when 1 then the old value will be av_freed() and the
> > > * new av_strduped()
> > > * when 0 then no av_free() nor av_strdup() will be used
> > > + * @return 0 if the value has been set, an AVERROR* error code value
> > > + * if no matching option exists, or if the value \p val is not valid
> > > */
> > > -const AVOption *av_set_string2(void *obj, const char *name, const char *val, int alloc);
> > > +int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out);
> > >
> > > const AVOption *av_set_double(void *obj, const char *name, double n);
> > > const AVOption *av_set_q(void *obj, const char *name, AVRational n);
> > > Index: ffmpeg/libavcodec/opt.c
> > > ===================================================================
> > > --- ffmpeg.orig/libavcodec/opt.c 2008-12-16 19:46:41.000000000 +0100
> > > +++ ffmpeg/libavcodec/opt.c 2008-12-16 19:46:47.000000000 +0100
> > > @@ -107,10 +107,16 @@
> > > return -1;
> > > }
> > >
> > > -const AVOption *av_set_string2(void *obj, const char *name, const char *val, int alloc){
> > > +int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out){
> > > + int ret;
> > > const AVOption *o= av_find_opt(obj, name, NULL, 0, 0);
> > > - if(!o || !val || o->offset<=0)
> > > - return NULL;
> > > + if (o_out)
> > > + *o_out = o;
> > > + if(!o)
> > > + return AVERROR(ENOENT);
> > > + if(!val || o->offset<=0)
> > > + return AVERROR(EINVAL);
> > > +
> > > if(o->type == FF_OPT_TYPE_BINARY){
> > > uint8_t **dst = (uint8_t **)(((uint8_t*)obj) + o->offset);
> > > int *lendst = (int *)(dst + 1);
> > > @@ -118,7 +124,7 @@
> > > int len = strlen(val);
> > > av_freep(dst);
> > > *lendst = 0;
> > > - if (len & 1) return NULL;
> > > + if (len & 1) return AVERROR(EINVAL);
> > > len /= 2;
> > > ptr = bin = av_malloc(len);
> > > while (*val) {
> > > @@ -126,13 +132,13 @@
> > > int b = hexchar2int(*val++);
> > > if (a < 0 || b < 0) {
> > > av_free(bin);
> > > - return NULL;
> > > + return AVERROR(EINVAL);
> > > }
> > > *ptr++ = (a << 4) | b;
> > > }
> > > *dst = bin;
> > > *lendst = len;
> > > - return o;
> > > + return 0;
> > > }
> > > if(o->type != FF_OPT_TYPE_STRING){
> > > int notfirst=0;
> > > @@ -163,7 +169,7 @@
> > > else {
> > > if (error)
> > > av_log(NULL, AV_LOG_ERROR, "Unable to parse option value \"%s\": %s\n", val, error);
> > > - return NULL;
> > > + return AVERROR(EINVAL);
> > > }
> > > }
> > > if(o->type == FF_OPT_TYPE_FLAGS){
> > > @@ -174,14 +180,14 @@
> > > else if(cmd=='-') d= notfirst*av_get_double(obj, name, NULL) - d;
> > > }
> > >
> > > - if (!av_set_number(obj, name, d, 1, 1))
> > > - return NULL;
> > > + if ((ret = av_set_number2(obj, name, d, 1, 1, o_out)) < 0)
> > > + return ret;
> > > val+= i;
> > > if(!*val)
> > > - return o;
> > > + return 0;
> > > notfirst=1;
> > > }
> > > - return NULL;
> > > + return AVERROR(EINVAL);
> > > }
> > >
> > > if(alloc){
> > > @@ -190,6 +196,13 @@
> > > }
> > >
> > > memcpy(((uint8_t*)obj) + o->offset, &val, sizeof(val));
> > > + return 0;
> > > +}
> > > +
> > > +const AVOption *av_set_string2(void *obj, const char *name, const char *val, int alloc){
> > > + const AVOption *o;
> > > + if (av_set_string3(obj, name, val, alloc, &o) < 0)
> > > + return NULL;
> > > return o;
> > > }
> > >
> >
> > ok
>
> Applied.
>
> > > Index: ffmpeg/cmdutils.c
> > > ===================================================================
> > > --- ffmpeg.orig/cmdutils.c 2008-12-16 19:46:39.000000000 +0100
> > > +++ ffmpeg/cmdutils.c 2008-12-16 21:19:16.000000000 +0100
> > > @@ -176,25 +176,33 @@
> > >
> > > int opt_default(const char *opt, const char *arg){
> > > int type;
> > > + int ret= 0;
> > > const AVOption *o= NULL;
> > > int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
> > >
> > > - for(type=0; type<CODEC_TYPE_NB; type++){
> > > + for(type=0; type<CODEC_TYPE_NB && ret>= 0; type++){
> > > const AVOption *o2 = av_find_opt(avctx_opts[0], opt, NULL, opt_types[type], opt_types[type]);
> > > if(o2)
> > > - o = av_set_string2(avctx_opts[type], opt, arg, 1);
> > > + ret = av_set_string3(avctx_opts[type], opt, arg, 1, &o);
> > > }
> >
> > > + if(o && ret < 0)
> > > + goto invalid_arg;
> >
> > do these 2 lines hav any effect?
>
> No, and patch updated.
ok
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
I hate to see young programmers poisoned by the kind of thinking
Ulrich Drepper puts forward since it is simply too narrow -- Roman Shaposhnik
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20081217/19134148/attachment.pgp>
More information about the ffmpeg-devel
mailing list