~ubuntu-branches/ubuntu/hardy/avidemux/hardy

« back to all changes in this revision

Viewing changes to avidemux/ADM_libraries/ADM_lavcodec/opt.c

  • Committer: Bazaar Package Importer
  • Author(s): Matvey Kozhev
  • Date: 2007-12-18 13:53:04 UTC
  • mfrom: (1.1.7 upstream)
  • Revision ID: james.westby@ubuntu.com-20071218135304-cdqec2lg2bglyz15
Tags: 1:2.4~preview3-0.0ubuntu1
* Upload to Ubuntu. (LP: #163287, LP: #126572)
* debian/changelog: re-added Ubuntu releases.
* debian/control:
  - Require debhelper >= 5.0.51 (for dh_icons) and imagemagick.
  - Build-depend on libsdl1.2-dev instead of libsdl-dev.
  - Build against newer libx264-dev. (LP: #138854)
  - Removed libamrnb-dev, not in Ubuntu yet.
* debian/rules:
  - Install all icon sizes, using convert (upstream installs none).
  - Added missing calls to dh_installmenu, dh_installman, dh_icons and
    dh_desktop.
* debian/menu, debian/avidemux-qt.menu:
  - Corrected package and executable names.
* debian/avidemux-common.install: Install icons.
* debian/avidemux.common.manpages: Install man/avidemux.1.
* debian/links, debian/avidemux-cli.links, debian/avidemux-gtk.links:
  - Link manpages to avidemux.1.gz.
* debian/install, debian/avidemux-qt.install, debian/avidemux-gtk.desktop,
  debian/avidemux-qt.desktop: Install desktop files.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * AVOptions
 
3
 * Copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
 
4
 *
 
5
 * This file is part of FFmpeg.
 
6
 *
 
7
 * FFmpeg is free software; you can redistribute it and/or
 
8
 * modify it under the terms of the GNU Lesser General Public
 
9
 * License as published by the Free Software Foundation; either
 
10
 * version 2.1 of the License, or (at your option) any later version.
 
11
 *
 
12
 * FFmpeg is distributed in the hope that it will be useful,
 
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
15
 * Lesser General Public License for more details.
 
16
 *
 
17
 * You should have received a copy of the GNU Lesser General Public
 
18
 * License along with FFmpeg; if not, write to the Free Software
 
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
20
 */
 
21
 
 
22
/**
 
23
 * @file opt.c
 
24
 * AVOptions
 
25
 * @author Michael Niedermayer <michaelni@gmx.at>
 
26
 */
 
27
 
 
28
#include "avcodec.h"
 
29
#include "opt.h"
 
30
#include "eval.h"
 
31
 
 
32
//FIXME order them and do a bin search
 
33
const AVOption *av_find_opt(void *v, const char *name, const char *unit, int mask, int flags){
 
34
    AVClass *c= *(AVClass**)v; //FIXME silly way of storing AVClass
 
35
    const AVOption *o= c->option;
 
36
 
 
37
    for(;o && o->name; o++){
 
38
        if(!strcmp(o->name, name) && (!unit || (o->unit && !strcmp(o->unit, unit))) && (o->flags & mask) == flags )
 
39
            return o;
 
40
    }
 
41
    return NULL;
 
42
}
 
43
 
 
44
const AVOption *av_next_option(void *obj, const AVOption *last){
 
45
    if(last && last[1].name) return ++last;
 
46
    else if(last)            return NULL;
 
47
    else                     return (*(AVClass**)obj)->option;
 
48
}
 
49
 
 
50
static const AVOption *av_set_number(void *obj, const char *name, double num, int den, int64_t intnum){
 
51
    const AVOption *o= av_find_opt(obj, name, NULL, 0, 0);
 
52
    void *dst;
 
53
    if(!o || o->offset<=0)
 
54
        return NULL;
 
55
 
 
56
    if(o->max*den < num*intnum || o->min*den > num*intnum) {
 
57
        av_log(NULL, AV_LOG_ERROR, "Value %lf for parameter '%s' out of range.\n", num, name);
 
58
        return NULL;
 
59
    }
 
60
 
 
61
    dst= ((uint8_t*)obj) + o->offset;
 
62
 
 
63
    switch(o->type){
 
64
    case FF_OPT_TYPE_FLAGS:
 
65
    case FF_OPT_TYPE_INT:   *(int       *)dst= lrintf(num/den)*intnum; break;
 
66
    case FF_OPT_TYPE_INT64: *(int64_t   *)dst= lrintf(num/den)*intnum; break;
 
67
    case FF_OPT_TYPE_FLOAT: *(float     *)dst= num*intnum/den;         break;
 
68
    case FF_OPT_TYPE_DOUBLE:*(double    *)dst= num*intnum/den;         break;
 
69
    case FF_OPT_TYPE_RATIONAL:
 
70
        if((int)num == num) *(AVRational*)dst= (AVRational){num*intnum, den};
 
71
        else                *(AVRational*)dst= av_d2q(num*intnum/den, 1<<24);
 
72
    default:
 
73
        return NULL;
 
74
    }
 
75
    return o;
 
76
}
 
77
 
 
78
static const AVOption *set_all_opt(void *v, const char *unit, double d){
 
79
    AVClass *c= *(AVClass**)v; //FIXME silly way of storing AVClass
 
80
    const AVOption *o= c->option;
 
81
    const AVOption *ret=NULL;
 
82
 
 
83
    for(;o && o->name; o++){
 
84
        if(o->type != FF_OPT_TYPE_CONST && o->unit && !strcmp(o->unit, unit)){
 
85
            double tmp= d;
 
86
            if(o->type == FF_OPT_TYPE_FLAGS)
 
87
                tmp= av_get_int(v, o->name, NULL) | (int64_t)d;
 
88
 
 
89
            av_set_number(v, o->name, tmp, 1, 1);
 
90
            ret= o;
 
91
        }
 
92
    }
 
93
    return ret;
 
94
}
 
95
 
 
96
static double const_values[]={
 
97
    M_PI,
 
98
    M_E,
 
99
    FF_QP2LAMBDA,
 
100
    0
 
101
};
 
102
 
 
103
static const char *const_names[]={
 
104
    "PI",
 
105
    "E",
 
106
    "QP2LAMBDA",
 
107
    0
 
108
};
 
109
 
 
110
const AVOption *av_set_string(void *obj, const char *name, const char *val){
 
111
    const AVOption *o= av_find_opt(obj, name, NULL, 0, 0);
 
112
    if(o && o->offset==0 && o->type == FF_OPT_TYPE_CONST && o->unit){
 
113
        return set_all_opt(obj, o->unit, o->default_val);
 
114
    }
 
115
    if(!o || !val || o->offset<=0)
 
116
        return NULL;
 
117
    if(o->type != FF_OPT_TYPE_STRING){
 
118
        for(;;){
 
119
            int i;
 
120
            char buf[256];
 
121
            int cmd=0;
 
122
            double d;
 
123
            char *error = NULL;
 
124
 
 
125
            if(*val == '+' || *val == '-')
 
126
                cmd= *(val++);
 
127
 
 
128
            for(i=0; i<sizeof(buf)-1 && val[i] && val[i]!='+' && val[i]!='-'; i++)
 
129
                buf[i]= val[i];
 
130
            buf[i]=0;
 
131
            val+= i;
 
132
 
 
133
            d = ff_eval2(buf, const_values, const_names, NULL, NULL, NULL, NULL, NULL, &error);
 
134
            if(isnan(d)) {
 
135
                const AVOption *o_named= av_find_opt(obj, buf, o->unit, 0, 0);
 
136
                if(o_named && o_named->type == FF_OPT_TYPE_CONST)
 
137
                    d= o_named->default_val;
 
138
                else if(!strcmp(buf, "default")) d= o->default_val;
 
139
                else if(!strcmp(buf, "max"    )) d= o->max;
 
140
                else if(!strcmp(buf, "min"    )) d= o->min;
 
141
                else if(!strcmp(buf, "none"   )) d= 0;
 
142
                else if(!strcmp(buf, "all"    )) d= ~0;
 
143
                else {
 
144
                    if (!error)
 
145
                        av_log(NULL, AV_LOG_ERROR, "Unable to parse option value \"%s\": %s\n", val, error);
 
146
                    return NULL;
 
147
                }
 
148
            }
 
149
            if(o->type == FF_OPT_TYPE_FLAGS){
 
150
                if     (cmd=='+') d= av_get_int(obj, name, NULL) | (int64_t)d;
 
151
                else if(cmd=='-') d= av_get_int(obj, name, NULL) &~(int64_t)d;
 
152
            }else if(cmd=='-')
 
153
                d= -d;
 
154
 
 
155
            av_set_number(obj, name, d, 1, 1);
 
156
            if(!*val)
 
157
                return o;
 
158
        }
 
159
        return NULL;
 
160
    }
 
161
 
 
162
    memcpy(((uint8_t*)obj) + o->offset, val, sizeof(val));
 
163
    return o;
 
164
}
 
165
 
 
166
const AVOption *av_set_double(void *obj, const char *name, double n){
 
167
    return av_set_number(obj, name, n, 1, 1);
 
168
}
 
169
 
 
170
const AVOption *av_set_q(void *obj, const char *name, AVRational n){
 
171
    return av_set_number(obj, name, n.num, n.den, 1);
 
172
}
 
173
 
 
174
const AVOption *av_set_int(void *obj, const char *name, int64_t n){
 
175
    return av_set_number(obj, name, 1, 1, n);
 
176
}
 
177
 
 
178
/**
 
179
 *
 
180
 * @param buf a buffer which is used for returning non string values as strings, can be NULL
 
181
 * @param buf_len allocated length in bytes of buf
 
182
 */
 
183
const char *av_get_string(void *obj, const char *name, const AVOption **o_out, char *buf, int buf_len){
 
184
    const AVOption *o= av_find_opt(obj, name, NULL, 0, 0);
 
185
    void *dst;
 
186
    if(!o || o->offset<=0)
 
187
        return NULL;
 
188
    if(o->type != FF_OPT_TYPE_STRING && (!buf || !buf_len))
 
189
        return NULL;
 
190
 
 
191
    dst= ((uint8_t*)obj) + o->offset;
 
192
    if(o_out) *o_out= o;
 
193
 
 
194
    if(o->type == FF_OPT_TYPE_STRING)
 
195
        return dst;
 
196
 
 
197
    switch(o->type){
 
198
    case FF_OPT_TYPE_FLAGS:     snprintf(buf, buf_len, "0x%08X",*(int    *)dst);break;
 
199
    case FF_OPT_TYPE_INT:       snprintf(buf, buf_len, "%d" , *(int    *)dst);break;
 
200
    case FF_OPT_TYPE_INT64:     snprintf(buf, buf_len, "%"PRId64, *(int64_t*)dst);break;
 
201
    case FF_OPT_TYPE_FLOAT:     snprintf(buf, buf_len, "%f" , *(float  *)dst);break;
 
202
    case FF_OPT_TYPE_DOUBLE:    snprintf(buf, buf_len, "%f" , *(double *)dst);break;
 
203
    case FF_OPT_TYPE_RATIONAL:  snprintf(buf, buf_len, "%d/%d", ((AVRational*)dst)->num, ((AVRational*)dst)->den);break;
 
204
    default: return NULL;
 
205
    }
 
206
    return buf;
 
207
}
 
208
 
 
209
static int av_get_number(void *obj, const char *name, const AVOption **o_out, double *num, int *den, int64_t *intnum){
 
210
    const AVOption *o= av_find_opt(obj, name, NULL, 0, 0);
 
211
    void *dst;
 
212
    if(!o || o->offset<=0)
 
213
        goto error;
 
214
 
 
215
    dst= ((uint8_t*)obj) + o->offset;
 
216
 
 
217
    if(o_out) *o_out= o;
 
218
 
 
219
    switch(o->type){
 
220
    case FF_OPT_TYPE_FLAGS:
 
221
    case FF_OPT_TYPE_INT:       *intnum= *(int    *)dst;return 0;
 
222
    case FF_OPT_TYPE_INT64:     *intnum= *(int64_t*)dst;return 0;
 
223
    case FF_OPT_TYPE_FLOAT:     *num=    *(float  *)dst;return 0;
 
224
    case FF_OPT_TYPE_DOUBLE:    *num=    *(double *)dst;return 0;
 
225
    case FF_OPT_TYPE_RATIONAL:  *intnum= ((AVRational*)dst)->num;
 
226
                                *den   = ((AVRational*)dst)->den;
 
227
                                                        return 0;
 
228
    }
 
229
error:
 
230
    *den=*intnum=0;
 
231
    return -1;
 
232
}
 
233
 
 
234
double av_get_double(void *obj, const char *name, const AVOption **o_out){
 
235
    int64_t intnum=1;
 
236
    double num=1;
 
237
    int den=1;
 
238
 
 
239
    av_get_number(obj, name, o_out, &num, &den, &intnum);
 
240
    return num*intnum/den;
 
241
}
 
242
 
 
243
AVRational av_get_q(void *obj, const char *name, const AVOption **o_out){
 
244
    int64_t intnum=1;
 
245
    double num=1;
 
246
    int den=1;
 
247
 
 
248
    av_get_number(obj, name, o_out, &num, &den, &intnum);
 
249
    if(num == 1.0 && (int)intnum == intnum)
 
250
        return (AVRational){intnum, den};
 
251
    else
 
252
        return av_d2q(num*intnum/den, 1<<24);
 
253
}
 
254
 
 
255
int64_t av_get_int(void *obj, const char *name, const AVOption **o_out){
 
256
    int64_t intnum=1;
 
257
    double num=1;
 
258
    int den=1;
 
259
 
 
260
    av_get_number(obj, name, o_out, &num, &den, &intnum);
 
261
    return num*intnum/den;
 
262
}
 
263
 
 
264
static void opt_list(void *obj, void *av_log_obj, const char *unit)
 
265
{
 
266
    const AVOption *opt=NULL;
 
267
 
 
268
    while((opt= av_next_option(obj, opt))){
 
269
        if(!(opt->flags & (AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM)))
 
270
            continue;
 
271
 
 
272
        /* Don't print CONST's on level one.
 
273
         * Don't print anything but CONST's on level two.
 
274
         * Only print items from the requested unit.
 
275
         */
 
276
        if (!unit && opt->type==FF_OPT_TYPE_CONST)
 
277
            continue;
 
278
        else if (unit && opt->type!=FF_OPT_TYPE_CONST)
 
279
            continue;
 
280
        else if (unit && opt->type==FF_OPT_TYPE_CONST && strcmp(unit, opt->unit))
 
281
            continue;
 
282
        else if (unit && opt->type == FF_OPT_TYPE_CONST)
 
283
            av_log(av_log_obj, AV_LOG_INFO, "   %-15s ", opt->name);
 
284
        else
 
285
            av_log(av_log_obj, AV_LOG_INFO, "-%-17s ", opt->name);
 
286
 
 
287
        switch( opt->type )
 
288
        {
 
289
            case FF_OPT_TYPE_FLAGS:
 
290
                av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<flags>" );
 
291
                break;
 
292
            case FF_OPT_TYPE_INT:
 
293
                av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<int>" );
 
294
                break;
 
295
            case FF_OPT_TYPE_INT64:
 
296
                av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<int64>" );
 
297
                break;
 
298
            case FF_OPT_TYPE_DOUBLE:
 
299
                av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<double>" );
 
300
                break;
 
301
            case FF_OPT_TYPE_FLOAT:
 
302
                av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<float>" );
 
303
                break;
 
304
            case FF_OPT_TYPE_STRING:
 
305
                av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<string>" );
 
306
                break;
 
307
            case FF_OPT_TYPE_RATIONAL:
 
308
                av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<rational>" );
 
309
                break;
 
310
            case FF_OPT_TYPE_CONST:
 
311
            default:
 
312
                av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "" );
 
313
                break;
 
314
        }
 
315
        av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_ENCODING_PARAM) ? 'E' : '.');
 
316
        av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_DECODING_PARAM) ? 'D' : '.');
 
317
        av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_VIDEO_PARAM   ) ? 'V' : '.');
 
318
        av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_AUDIO_PARAM   ) ? 'A' : '.');
 
319
        av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_SUBTITLE_PARAM) ? 'S' : '.');
 
320
 
 
321
        if(opt->help)
 
322
            av_log(av_log_obj, AV_LOG_INFO, " %s", opt->help);
 
323
        av_log(av_log_obj, AV_LOG_INFO, "\n");
 
324
        if (opt->unit && opt->type != FF_OPT_TYPE_CONST) {
 
325
            opt_list(obj, av_log_obj, opt->unit);
 
326
        }
 
327
    }
 
328
}
 
329
 
 
330
int av_opt_show(void *obj, void *av_log_obj){
 
331
    if(!obj)
 
332
        return -1;
 
333
 
 
334
    av_log(av_log_obj, AV_LOG_INFO, "%s AVOptions:\n", (*(AVClass**)obj)->class_name);
 
335
 
 
336
    opt_list(obj, av_log_obj, NULL);
 
337
 
 
338
    return 0;
 
339
}
 
340
 
 
341
/** Set the values of the AVCodecContext or AVFormatContext structure.
 
342
 * They are set to the defaults specified in the according AVOption options
 
343
 * array default_val field.
 
344
 *
 
345
 * @param s AVCodecContext or AVFormatContext for which the defaults will be set
 
346
 */
 
347
void av_opt_set_defaults2(void *s, int mask, int flags)
 
348
{
 
349
    const AVOption *opt = NULL;
 
350
    while ((opt = av_next_option(s, opt)) != NULL) {
 
351
        if((opt->flags & mask) != flags)
 
352
            continue;
 
353
        switch(opt->type) {
 
354
            case FF_OPT_TYPE_CONST:
 
355
                /* Nothing to be done here */
 
356
            break;
 
357
            case FF_OPT_TYPE_FLAGS:
 
358
            case FF_OPT_TYPE_INT: {
 
359
                int val;
 
360
                val = opt->default_val;
 
361
                av_set_int(s, opt->name, val);
 
362
            }
 
363
            break;
 
364
            case FF_OPT_TYPE_FLOAT: {
 
365
                double val;
 
366
                val = opt->default_val;
 
367
                av_set_double(s, opt->name, val);
 
368
            }
 
369
            break;
 
370
            case FF_OPT_TYPE_RATIONAL: {
 
371
                AVRational val;
 
372
                val = av_d2q(opt->default_val, INT_MAX);
 
373
                av_set_q(s, opt->name, val);
 
374
            }
 
375
            break;
 
376
            case FF_OPT_TYPE_STRING:
 
377
                /* Cannot set default for string as default_val is of type * double */
 
378
            break;
 
379
            default:
 
380
                av_log(s, AV_LOG_DEBUG, "AVOption type %d of option %s not implemented yet\n", opt->type, opt->name);
 
381
        }
 
382
    }
 
383
}
 
384
 
 
385
void av_opt_set_defaults(void *s){
 
386
    av_opt_set_defaults2(s, 0, 0);
 
387
}
 
388