Commit fe1b62fb authored by Zdenek Kabelac's avatar Zdenek Kabelac
Browse files

* still unfinished code for Options

* demo code - awating more comments

Originally committed as revision 1569 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 97d96aaa
......@@ -9,6 +9,10 @@
#include <string.h>
#include <math.h>
#ifdef HAVE_AV_CONFIG_H
#undef HAVE_AV_CONFIG_H
#endif
#include "avcodec.h"
#define INBUF_SIZE 4096
......@@ -385,6 +389,80 @@ void video_decode_example(const char *outfilename, const char *filename)
printf("\n");
}
// simple example how the options could be used
int options_example(int argc, char* argv[])
{
AVCodec* codec = avcodec_find_encoder_by_name((argc > 1) ? argv[2] : "mpeg4");
const AVOption* c;
AVCodecContext* avctx;
char* def = av_malloc(5000);
const char* col = "";
int i = 0;
if (!codec)
return -1;
c = codec->options;
avctx = avcodec_alloc_context();
*def = 0;
if (c) {
const AVOption *stack[FF_OPT_MAX_DEPTH];
int depth = 0;
for (;;) {
if (!c->name) {
if (c->sub) {
stack[depth++] = c;
c = c->sub;
} else {
if (depth == 0)
break; // finished
c = stack[--depth];
c++;
}
} else {
int t = c->type & FF_OPT_TYPE_MASK;
printf("Config %s %s\n",
t == FF_OPT_TYPE_BOOL ? "bool " :
t == FF_OPT_TYPE_DOUBLE ? "double " :
t == FF_OPT_TYPE_INT ? "integer" :
t == FF_OPT_TYPE_STRING ? "string " :
"unknown??", c->name);
switch (t) {
case FF_OPT_TYPE_BOOL:
i += sprintf(def + i, "%s%s=%s",
col, c->name,
c->defval != 0. ? "on" : "off");
break;
case FF_OPT_TYPE_DOUBLE:
i += sprintf(def + i, "%s%s=%f",
col, c->name, c->defval);
break;
case FF_OPT_TYPE_INT:
i += sprintf(def + i, "%s%s=%d",
col, c->name, (int) c->defval);
break;
case FF_OPT_TYPE_STRING:
if (c->defstr) {
char* d = av_strdup(c->defstr);
char* f = strchr(d, ',');
if (f)
*f = 0;
i += sprintf(def + i, "%s%s=%s",
col, c->name, d);
av_free(d);
}
break;
}
col = ":";
c++;
}
}
}
printf("Default Options: %s\n", def);
av_free(def);
return 0;
}
int main(int argc, char **argv)
{
......@@ -396,7 +474,10 @@ int main(int argc, char **argv)
/* register all the codecs (you can also register only the codec
you wish to have smaller code */
avcodec_register_all();
#ifdef OPT_TEST
options_example(argc, argv);
#else
if (argc <= 1) {
audio_encode_example("/tmp/test.mp2");
audio_decode_example("/tmp/test.sw", "/tmp/test.mp2");
......@@ -409,6 +490,7 @@ int main(int argc, char **argv)
// audio_decode_example("/tmp/test.sw", filename);
video_decode_example("/tmp/test%d.pgm", filename);
#endif
return 0;
}
......@@ -50,9 +50,9 @@ static AVCodec* avcodec_find_by_fcc(uint32_t fcc)
return NULL;
}
static private_handle_t* create_handle()
static private_handle_t* create_handle(void)
{
private_handle_t* t = malloc(sizeof(private_handle_t));
private_handle_t* t = av_malloc(sizeof(private_handle_t));
if (!t)
return NULL;
memset(t, 0, sizeof(*t));
......@@ -82,7 +82,7 @@ static void destroy_handle(private_handle_t* handle)
{
avcodec_close(&handle->avcontext);
}
free(handle);
av_free(handle);
// count referencies
}
......@@ -96,13 +96,13 @@ int avcodec(void* handle, avc_cmd_t cmd, void* pin, void* pout)
case AVC_OPEN_BY_NAME:
{
// pin char* codec name
private_handle_t* handle = create_handle();
(private_handle_t**)pout = handle;
if (!handle)
private_handle_t* h = create_handle();
(private_handle_t**)pout = h;
if (!h)
return -ENOMEM;
if (!handle->avcodec)
if (!h->avcodec)
{
destroy_handle(handle);
destroy_handle(h);
(private_handle_t**)pout = NULL;
return -1;// better error
}
......@@ -111,14 +111,14 @@ int avcodec(void* handle, avc_cmd_t cmd, void* pin, void* pout)
case AVC_OPEN_BY_CODEC_ID:
{
// pin uint32_t codec fourcc
private_handle_t* handle = create_handle();
(private_handle_t**)pout = handle;
if (!handle)
private_handle_t* h = create_handle();
(private_handle_t**)pout = h;
if (!h)
return -ENOMEM;
if (!handle->avcodec)
if (!h->avcodec)
{
destroy_handle(handle);
destroy_handle(h);
(private_handle_t**)pout = NULL;
return -1;// better error
}
......@@ -127,14 +127,14 @@ int avcodec(void* handle, avc_cmd_t cmd, void* pin, void* pout)
case AVC_OPEN_BY_FOURCC:
{
// pin uint32_t codec fourcc
private_handle_t* handle = create_handle();
(private_handle_t**)pout = handle;
if (!handle)
private_handle_t* h = create_handle();
(private_handle_t**)pout = h;
if (!h)
return -ENOMEM;
handle->avcodec = avcodec_find_by_fcc((uint32_t) pin);
if (!handle->avcodec)
h->avcodec = avcodec_find_by_fcc((uint32_t) pin);
if (!h->avcodec)
{
destroy_handle(handle);
destroy_handle(h);
(private_handle_t**)pout = NULL;
return -1;// better error
}
......
......@@ -37,6 +37,24 @@
#define M_PI 3.14159265358979323846
#endif
#include <stddef.h>
#ifndef offsetof
# define offsetof(T,F) ((unsigned int)((char *)&((T *)0)->F))
#endif
#define AVOPTION_CODEC_BOOL(name, help, field) \
{ name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_BOOL }
#define AVOPTION_CODEC_FLAG(name, help, field, flag, defval) \
{ name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_FLAG, flag, 0, defval }
#define AVOPTION_CODEC_INT(name, help, field, minv, maxv, defval) \
{ name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_INT, minv, maxv, defval }
#define AVOPTION_CODEC_STRING(name, help, field, str, val) \
{ name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_STRING, .defval = val, .defstr = str }
#define AVOPTION_CODEC_RCOVERRIDE(name, help, field) \
{ name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_RCOVERRIDE, .defval = 0, .defstr = NULL }
#define AVOPTION_SUB(ptr) { .name = NULL, .sub = ptr }
#define AVOPTION_END() AVOPTION_SUB(NULL)
#endif /* HAVE_AV_CONFIG_H */
/* Suppress restrict if it was not defined in config.h. */
......
......@@ -3998,6 +3998,30 @@ char ff_get_pict_type_char(int pict_type){
}
}
extern const AVOption common_options[2];
static const AVOption mpeg4_options[] =
{
AVOPTION_CODEC_INT("bitrate", "desired video bitrate", bit_rate, 4, 240000000, 800000),
AVOPTION_CODEC_FLAG("vhq", "very high quality", flags, CODEC_FLAG_HQ, 0),
AVOPTION_CODEC_INT("ratetol", "number of bits the bitstream is allowed to diverge from the reference"
"the reference can be CBR (for CBR pass1) or VBR (for pass2)",
bit_rate_tolerance, 4, 240000000, 8000),
AVOPTION_CODEC_INT("qmin", "minimum quantizer", qmin, 1, 31, 2),
AVOPTION_CODEC_INT("qmax", "maximum quantizer", qmax, 1, 31, 31),
AVOPTION_CODEC_STRING("rc_eq", "rate control equation",
rc_eq, "tex^qComp,option1,options2", 0),
AVOPTION_CODEC_INT("rc_minrate", "rate control minimum bitrate",
rc_min_rate, 4, 24000000, 0),
AVOPTION_CODEC_INT("rc_maxrate", "rate control maximum bitrate",
rc_max_rate, 4, 24000000, 0),
AVOPTION_CODEC_FLAG("psnr", "calculate PSNR of compressed frames",
flags, CODEC_FLAG_PSNR, 0),
AVOPTION_CODEC_RCOVERRIDE("rc_override", "ratecontrol override (=startframe,endframe,qscale,quality_factor)",
rc_override),
AVOPTION_SUB(common_options),
AVOPTION_END()
};
AVCodec mpeg1video_encoder = {
"mpeg1video",
CODEC_TYPE_VIDEO,
......@@ -4048,6 +4072,7 @@ AVCodec mpeg4_encoder = {
MPV_encode_init,
MPV_encode_picture,
MPV_encode_end,
.options = mpeg4_options,
};
AVCodec msmpeg4v1_encoder = {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment