libavfilter/formats.c File Reference

#include "libavutil/common.h"
#include "libavutil/eval.h"
#include "libavutil/pixdesc.h"
#include "libavutil/parseutils.h"
#include "libavutil/audioconvert.h"
#include "avfilter.h"
#include "internal.h"
#include "formats.h"
#include "all_channel_layouts.inc"

Go to the source code of this file.

Defines

#define MERGE_REF(ret, a, fmts, type, fail)
 Add all refs from a to ret and destroy a.
#define MERGE_FORMATS(ret, a, b, fmts, nb, type, fail)
 Add all formats common for a and b to ret, copy the refs and destroy a and b.
#define COPY_INT_LIST(list_copy, list, type)
#define MAKE_FORMAT_LIST(type, field, count_field)
#define ADD_FORMAT(f, fmt, type, list, nb)
#define FORMATS_REF(f, ref)
#define FIND_REF_INDEX(ref, idx)
#define FORMATS_UNREF(ref, list)
#define FORMATS_CHANGEREF(oldref, newref)
#define SET_COMMON_FORMATS(ctx, fmts, in_fmts, out_fmts, ref, list)

Functions

AVFilterFormatsff_merge_formats (AVFilterFormats *a, AVFilterFormats *b)
 Return a format list which contains the intersection of the formats of a and b.
AVFilterFormatsff_merge_samplerates (AVFilterFormats *a, AVFilterFormats *b)
AVFilterChannelLayoutsff_merge_channel_layouts (AVFilterChannelLayouts *a, AVFilterChannelLayouts *b)
 Return a channel layouts/samplerates list which contains the intersection of the layouts/samplerates of a and b.
int ff_fmt_is_in (int fmt, const int *fmts)
 Tell is a format is contained in the provided list terminated by -1.
intff_copy_int_list (const int *const list)
 Return a copy of a list of integers terminated by -1, or NULL in case of copy failure.
int64_t * ff_copy_int64_list (const int64_t *const list)
 Return a copy of a list of 64-bit integers, or NULL in case of copy failure.
AVFilterFormatsff_make_format_list (const int *fmts)
 Create a list of supported formats.
AVFilterChannelLayoutsavfilter_make_format64_list (const int64_t *fmts)
int ff_add_format (AVFilterFormats **avff, int64_t fmt)
 Add fmt to the list of media formats contained in *avff.
int ff_add_channel_layout (AVFilterChannelLayouts **l, uint64_t channel_layout)
AVFilterFormatsff_all_formats (enum AVMediaType type)
 Return a list of all formats supported by FFmpeg for the given media type.
AVFilterFormatsff_planar_sample_fmts (void)
 Construct a formats list containing all planar sample formats.
AVFilterFormatsff_all_samplerates (void)
AVFilterChannelLayoutsff_all_channel_layouts (void)
 Construct an empty AVFilterChannelLayouts/AVFilterFormats struct -- representing any channel layout/sample rate.
void ff_channel_layouts_ref (AVFilterChannelLayouts *f, AVFilterChannelLayouts **ref)
 Add *ref as a new reference to f.
void ff_formats_ref (AVFilterFormats *f, AVFilterFormats **ref)
 Add *ref as a new reference to formats.
void ff_formats_unref (AVFilterFormats **ref)
 If *ref is non-NULL, remove *ref as a reference to the format list it currently points to, deallocates that list if this was the last reference, and sets *ref to NULL.
void ff_channel_layouts_unref (AVFilterChannelLayouts **ref)
 Remove a reference to a channel layouts list.
void ff_channel_layouts_changeref (AVFilterChannelLayouts **oldref, AVFilterChannelLayouts **newref)
void ff_formats_changeref (AVFilterFormats **oldref, AVFilterFormats **newref)
 Before After ________ ________ |formats |<---------.
void ff_set_common_channel_layouts (AVFilterContext *ctx, AVFilterChannelLayouts *layouts)
 A helper for query_formats() which sets all links to the same list of channel layouts/sample rates.
void ff_set_common_samplerates (AVFilterContext *ctx, AVFilterFormats *samplerates)
void ff_set_common_formats (AVFilterContext *ctx, AVFilterFormats *formats)
 A helper for query_formats() which sets all links to the same list of formats.
int ff_default_query_formats (AVFilterContext *ctx)
int ff_parse_pixel_format (enum PixelFormat *ret, const char *arg, void *log_ctx)
 Parse a pixel format.
int ff_parse_sample_format (int *ret, const char *arg, void *log_ctx)
 Parse a sample format name or a corresponding integer representation.
int ff_parse_time_base (AVRational *ret, const char *arg, void *log_ctx)
 Parse a time base.
int ff_parse_sample_rate (int *ret, const char *arg, void *log_ctx)
 Parse a sample rate.
int ff_parse_channel_layout (int64_t *ret, const char *arg, void *log_ctx)
 Parse a channel layout or a corresponding integer representation.

Variables

const int64_t avfilter_all_channel_layouts []


Define Documentation

#define ADD_FORMAT ( f,
fmt,
type,
list,
nb   ) 

Value:

do {                                                        \
    type *fmts;                                             \
                                                            \
    if (!(*f) && !(*f = av_mallocz(sizeof(**f))))           \
        return AVERROR(ENOMEM);                             \
                                                            \
    fmts = av_realloc((*f)->list,                           \
                      sizeof(*(*f)->list) * ((*f)->nb + 1));\
    if (!fmts)                                              \
        return AVERROR(ENOMEM);                             \
                                                            \
    (*f)->list = fmts;                                      \
    (*f)->list[(*f)->nb++] = fmt;                           \
    return 0;                                               \
} while (0)

Definition at line 237 of file formats.c.

Referenced by ff_add_channel_layout(), and ff_add_format().

#define COPY_INT_LIST ( list_copy,
list,
type   ) 

Value:

{                          \
    int count = 0;                                                      \
    if (list)                                                           \
        for (count = 0; list[count] != -1; count++)                     \
            ;                                                           \
    list_copy = av_calloc(count+1, sizeof(type));                       \
    if (list_copy) {                                                    \
        memcpy(list_copy, list, sizeof(type) * count);                  \
        list_copy[count] = -1;                                          \
    }                                                                   \
}

Definition at line 174 of file formats.c.

Referenced by ff_copy_int64_list(), and ff_copy_int_list().

#define FIND_REF_INDEX ( ref,
idx   ) 

Value:

do {                                        \
    int i;                                  \
    for (i = 0; i < (*ref)->refcount; i ++) \
        if((*ref)->refs[i] == ref) {        \
            idx = i;                        \
            break;                          \
        }                                   \
} while (0)

Definition at line 330 of file formats.c.

#define FORMATS_CHANGEREF ( oldref,
newref   ) 

Value:

do {                                            \
    int idx = -1;                               \
                                                \
    FIND_REF_INDEX(oldref, idx);                \
                                                \
    if (idx >= 0) {                             \
        (*oldref)->refs[idx] = newref;          \
        *newref = *oldref;                      \
        *oldref = NULL;                         \
    }                                           \
} while (0)

Definition at line 371 of file formats.c.

Referenced by ff_channel_layouts_changeref(), and ff_formats_changeref().

#define FORMATS_REF ( f,
ref   ) 

Value:

do {                                                                 \
    *ref = f;                                                        \
    f->refs = av_realloc(f->refs, sizeof(*f->refs) * ++f->refcount); \
    f->refs[f->refcount-1] = ref;                                    \
} while (0)

Definition at line 313 of file formats.c.

Referenced by ff_channel_layouts_ref(), and ff_formats_ref().

#define FORMATS_UNREF ( ref,
list   ) 

Value:

do {                                                               \
    int idx = -1;                                                  \
                                                                   \
    if (!*ref)                                                     \
        return;                                                    \
                                                                   \
    FIND_REF_INDEX(ref, idx);                                      \
                                                                   \
    if (idx >= 0)                                                  \
        memmove((*ref)->refs + idx, (*ref)->refs + idx + 1,        \
            sizeof(*(*ref)->refs) * ((*ref)->refcount - idx - 1)); \
                                                                   \
    if(!--(*ref)->refcount) {                                      \
        av_free((*ref)->list);                                     \
        av_free((*ref)->refs);                                     \
        av_free(*ref);                                             \
    }                                                              \
    *ref = NULL;                                                   \
} while (0)

Definition at line 340 of file formats.c.

Referenced by ff_channel_layouts_unref(), and ff_formats_unref().

#define MAKE_FORMAT_LIST ( type,
field,
count_field   ) 

Value:

type *formats;                                                      \
    int count = 0;                                                      \
    if (fmts)                                                           \
        for (count = 0; fmts[count] != -1; count++)                     \
            ;                                                           \
    formats = av_mallocz(sizeof(*formats));                             \
    if (!formats) return NULL;                                          \
    formats->count_field = count;                                       \
    if (count) {                                                        \
        formats->field = av_malloc(sizeof(*formats->field)*count);      \
        if (!formats->field) {                                          \
            av_free(formats);                                           \
            return NULL;                                                \
        }                                                               \
    }

Definition at line 200 of file formats.c.

Referenced by avfilter_make_format64_list(), and ff_make_format_list().

#define MERGE_FORMATS ( ret,
a,
b,
fmts,
nb,
type,
fail   ) 

Value:

do {                                                                            \
    int i, j, k = 0, count = FFMIN(a->nb, b->nb);                               \
                                                                                \
    if (!(ret = av_mallocz(sizeof(*ret))))                                      \
        goto fail;                                                              \
                                                                                \
    if (count) {                                                                \
        if (!(ret->fmts = av_malloc(sizeof(*ret->fmts) * count)))               \
            goto fail;                                                          \
        for (i = 0; i < a->nb; i++)                                             \
            for (j = 0; j < b->nb; j++)                                         \
                if (a->fmts[i] == b->fmts[j]) {                                 \
                    if(k >= FFMIN(a->nb, b->nb)){                               \
                        av_log(0, AV_LOG_ERROR, "Duplicate formats in avfilter_merge_formats() detected\n"); \
                        av_free(ret->fmts);                                     \
                        av_free(ret);                                           \
                        return NULL;                                            \
                    }                                                           \
                    ret->fmts[k++] = a->fmts[i];                                \
                }                                                               \
    }                                                                           \
    ret->nb = k;                                                                \
    /* check that there was at least one common format */                       \
    if (!ret->nb)                                                               \
        goto fail;                                                              \
                                                                                \
    MERGE_REF(ret, a, fmts, type, fail);                                        \
    MERGE_REF(ret, b, fmts, type, fail);                                        \
} while (0)
Add all formats common for a and b to ret, copy the refs and destroy a and b.

Definition at line 58 of file formats.c.

Referenced by ff_merge_channel_layouts(), ff_merge_formats(), and ff_merge_samplerates().

#define MERGE_REF ( ret,
a,
fmts,
type,
fail   ) 

Value:

do {                                                                       \
    type ***tmp;                                                           \
    int i;                                                                 \
                                                                           \
    if (!(tmp = av_realloc(ret->refs,                                      \
                           sizeof(*tmp) * (ret->refcount + a->refcount)))) \
        goto fail;                                                         \
    ret->refs = tmp;                                                       \
                                                                           \
    for (i = 0; i < a->refcount; i ++) {                                   \
        ret->refs[ret->refcount] = a->refs[i];                             \
        *ret->refs[ret->refcount++] = ret;                                 \
    }                                                                      \
                                                                           \
    av_freep(&a->refs);                                                    \
    av_freep(&a->fmts);                                                    \
    av_freep(&a);                                                          \
} while (0)
Add all refs from a to ret and destroy a.

Definition at line 34 of file formats.c.

Referenced by ff_merge_channel_layouts(), and ff_merge_samplerates().

#define SET_COMMON_FORMATS ( ctx,
fmts,
in_fmts,
out_fmts,
ref,
list   ) 

Value:

{                                                                   \
    int count = 0, i;                                               \
                                                                    \
    for (i = 0; i < ctx->nb_inputs; i++) {                          \
        if (ctx->inputs[i] && !ctx->inputs[i]->out_fmts) {          \
            ref(fmts, &ctx->inputs[i]->out_fmts);                   \
            count++;                                                \
        }                                                           \
    }                                                               \
    for (i = 0; i < ctx->nb_outputs; i++) {                         \
        if (ctx->outputs[i] && !ctx->outputs[i]->in_fmts) {         \
            ref(fmts, &ctx->outputs[i]->in_fmts);                   \
            count++;                                                \
        }                                                           \
    }                                                               \
                                                                    \
    if (!count) {                                                   \
        av_freep(&fmts->list);                                      \
        av_freep(&fmts->refs);                                      \
        av_freep(&fmts);                                            \
    }                                                               \
}

Definition at line 395 of file formats.c.

Referenced by ff_set_common_channel_layouts(), ff_set_common_formats(), and ff_set_common_samplerates().


Function Documentation

AVFilterChannelLayouts* avfilter_make_format64_list ( const int64_t *  fmts  ) 

Definition at line 226 of file formats.c.

Referenced by asink_query_formats(), movie_query_formats(), and query_formats().

int ff_add_channel_layout ( AVFilterChannelLayouts **  l,
uint64_t  channel_layout 
)

int ff_add_format ( AVFilterFormats **  avff,
int64_t  fmt 
)

Add fmt to the list of media formats contained in *avff.

If *avff is NULL the function allocates the filter formats struct and puts its pointer in *avff.

Returns:
a non negative value in case of success, or a negative value corresponding to an AVERROR code in case of error

Definition at line 254 of file formats.c.

Referenced by ff_all_formats(), ff_planar_sample_fmts(), init(), query_formats(), and reduce_formats_on_filter().

AVFilterChannelLayouts* ff_all_channel_layouts ( void   ) 

Construct an empty AVFilterChannelLayouts/AVFilterFormats struct -- representing any channel layout/sample rate.

Definition at line 307 of file formats.c.

Referenced by channelmap_query_formats(), ff_default_query_formats(), filter_query_formats(), join_query_formats(), and query_formats().

AVFilterFormats* ff_all_formats ( enum AVMediaType  type  ) 

Return a list of all formats supported by FFmpeg for the given media type.

Definition at line 264 of file formats.c.

Referenced by ff_default_query_formats(), filter_query_formats(), and query_formats().

AVFilterFormats* ff_all_samplerates ( void   ) 

void ff_channel_layouts_changeref ( AVFilterChannelLayouts **  oldref,
AVFilterChannelLayouts **  newref 
)

Definition at line 384 of file formats.c.

Referenced by avfilter_insert_filter().

void ff_channel_layouts_ref ( AVFilterChannelLayouts f,
AVFilterChannelLayouts **  ref 
)

Add *ref as a new reference to f.

Definition at line 320 of file formats.c.

Referenced by channelmap_query_formats(), ff_set_common_channel_layouts(), join_query_formats(), movie_query_formats(), and query_formats().

void ff_channel_layouts_unref ( AVFilterChannelLayouts **  ref  ) 

Remove a reference to a channel layouts list.

Definition at line 366 of file formats.c.

Referenced by avfilter_free(), and pick_format().

int64_t* ff_copy_int64_list ( const int64_t *const   list  ) 

Return a copy of a list of 64-bit integers, or NULL in case of copy failure.

Definition at line 193 of file formats.c.

Referenced by asink_init().

int* ff_copy_int_list ( const int *const   list  ) 

Return a copy of a list of integers terminated by -1, or NULL in case of copy failure.

Definition at line 186 of file formats.c.

Referenced by asink_init(), and vsink_init().

int ff_default_query_formats ( AVFilterContext ctx  ) 

Definition at line 444 of file formats.c.

Referenced by main(), query_formats(), and vsink_query_formats().

int ff_fmt_is_in ( int  fmt,
const int fmts 
)

Tell is a format is contained in the provided list terminated by -1.

Definition at line 163 of file formats.c.

Referenced by config_input(), config_input_main(), config_input_overlay(), config_out_props(), and config_props().

void ff_formats_changeref ( AVFilterFormats **  oldref,
AVFilterFormats **  newref 
)

Before After ________ ________ |formats |<---------.

|formats |<---------. | ____ | ___|___ | ____ | ___|___ | |refs| | | | | | |refs| | | | | NULL | |* *--------->|*oldref| | |* *--------->|*newref| ^ | |* * | | |_______| | |* * | | |_______| ___|___ | |____| | | |____| | | | | |________| |________| |*oldref| |_______|

Definition at line 390 of file formats.c.

Referenced by avfilter_insert_filter().

void ff_formats_ref ( AVFilterFormats formats,
AVFilterFormats **  ref 
)

Add *ref as a new reference to formats.

That is the pointers will point like in the ascii art below: ________ |formats |<--------. | ____ | ____|___________________ | |refs| | | __|_ | |* * | | | | | | AVFilterLink | |* *--------->|*ref| | |____| | | |____| |________| |________________________

Definition at line 325 of file formats.c.

Referenced by ff_set_common_formats(), ff_set_common_samplerates(), movie_query_formats(), and query_formats().

void ff_formats_unref ( AVFilterFormats **  ref  ) 

If *ref is non-NULL, remove *ref as a reference to the format list it currently points to, deallocates that list if this was the last reference, and sets *ref to NULL.

Before After ________ ________ NULL |formats |<--------. |formats | ^ | ____ | ____|________________ | ____ | ____|________________ | |refs| | | __|_ | |refs| | | __|_ | |* * | | | | | | AVFilterLink | |* * | | | | | | AVFilterLink | |* *--------->|*ref| | |* | | | |*ref| | |____| | | |____| | |____| | | |____| |________| |_____________________ |________| |_____________________

Definition at line 361 of file formats.c.

Referenced by avfilter_free(), pick_format(), and query_formats().

AVFilterFormats* ff_make_format_list ( const int fmts  ) 

Create a list of supported formats.

This is intended for use in AVFilter->query_formats().

Parameters:
fmts list of media formats, terminated by -1
Returns:
the format list, with no existing references

Definition at line 217 of file formats.c.

Referenced by asink_query_formats(), ff_draw_supported_pixel_formats(), movie_query_formats(), query_formats(), and vsink_query_formats().

AVFilterChannelLayouts* ff_merge_channel_layouts ( AVFilterChannelLayouts a,
AVFilterChannelLayouts b 
)

Return a channel layouts/samplerates list which contains the intersection of the layouts/samplerates of a and b.

Also, all the references of a, all the references of b, and a and b themselves will be deallocated.

If a and b do not share any common elements, neither is modified, and NULL is returned.

Definition at line 135 of file formats.c.

Referenced by insert_conv_filter(), and query_formats().

AVFilterFormats* ff_merge_formats ( AVFilterFormats a,
AVFilterFormats b 
)

Return a format list which contains the intersection of the formats of a and b.

Also, all the references of a, all the references of b, and a and b themselves will be deallocated.

If a and b do not share any common formats, neither is modified, and NULL is returned.

Definition at line 89 of file formats.c.

Referenced by insert_conv_filter(), and query_formats().

AVFilterFormats* ff_merge_samplerates ( AVFilterFormats a,
AVFilterFormats b 
)

Definition at line 108 of file formats.c.

Referenced by query_formats().

int ff_parse_channel_layout ( int64_t *  ret,
const char *  arg,
void *  log_ctx 
)

Parse a channel layout or a corresponding integer representation.

Parameters:
ret 64bit integer pointer to where the value should be written.
arg string to parse
log_ctx log context
Returns:
0 in case of success, a negative AVERROR code on error

Definition at line 514 of file formats.c.

Referenced by init().

int ff_parse_pixel_format ( enum PixelFormat ret,
const char *  arg,
void *  log_ctx 
)

Parse a pixel format.

Parameters:
ret pixel format pointer to where the value should be written
arg string to parse
log_ctx log context
Returns:
0 in case of success, a negative AVERROR code on error

Definition at line 461 of file formats.c.

Referenced by init(), and init_video().

int ff_parse_sample_format ( int ret,
const char *  arg,
void *  log_ctx 
)

Parse a sample format name or a corresponding integer representation.

Parameters:
ret integer pointer to where the value should be written
arg string to parse
log_ctx log context
Returns:
0 in case of success, a negative AVERROR code on error

Definition at line 476 of file formats.c.

Referenced by init().

int ff_parse_sample_rate ( int ret,
const char *  arg,
void *  log_ctx 
)

Parse a sample rate.

Parameters:
ret unsigned integer pointer to where the value should be written
arg string to parse
log_ctx log context
Returns:
0 in case of success, a negative AVERROR code on error

Definition at line 502 of file formats.c.

Referenced by init().

int ff_parse_time_base ( AVRational ret,
const char *  arg,
void *  log_ctx 
)

Parse a time base.

Parameters:
ret unsigned AVRational pointer to where the value should be written
arg string to parse
log_ctx log context
Returns:
0 in case of success, a negative AVERROR code on error

Definition at line 491 of file formats.c.

AVFilterFormats* ff_planar_sample_fmts ( void   ) 

Construct a formats list containing all planar sample formats.

Definition at line 289 of file formats.c.

Referenced by channelmap_query_formats(), join_query_formats(), and query_formats().

void ff_set_common_channel_layouts ( AVFilterContext ctx,
AVFilterChannelLayouts layouts 
)

A helper for query_formats() which sets all links to the same list of channel layouts/sample rates.

If there are no links hooked to this filter, the list is freed.

Definition at line 419 of file formats.c.

Referenced by asink_query_formats(), ff_default_query_formats(), filter_query_formats(), and query_formats().

void ff_set_common_formats ( AVFilterContext ctx,
AVFilterFormats formats 
)

A helper for query_formats() which sets all links to the same list of formats.

If there are no links hooked to this filter, the list of formats is freed.

Definition at line 438 of file formats.c.

Referenced by asink_query_formats(), channelmap_query_formats(), ff_default_query_formats(), filter_query_formats(), join_query_formats(), query_formats(), and vsink_query_formats().

void ff_set_common_samplerates ( AVFilterContext ctx,
AVFilterFormats samplerates 
)


Variable Documentation

Definition at line 279 of file formats.c.


Generated on Fri Oct 26 02:50:09 2012 for FFmpeg by  doxygen 1.5.8