FFmpeg  4.4
Macros | Functions
formats.c File Reference
#include "libavutil/avassert.h"
#include "libavutil/channel_layout.h"
#include "libavutil/common.h"
#include "libavutil/eval.h"
#include "libavutil/pixdesc.h"
#include "avfilter.h"
#include "internal.h"
#include "formats.h"

Go to the source code of this file.

Macros

#define KNOWN(l)   (!FF_LAYOUT2COUNT(l)) /* for readability */
 
#define MERGE_REF(ret, a, fmts, type, fail_statement)
 Add all refs from a to ret and destroy a. More...
 
#define MERGE_FORMATS(a, b, fmts, nb, type, check, empty_allowed)
 Add all formats common to a and b to a, add b's refs to a and destroy b. More...
 
#define MAKE_FORMAT_LIST(type, field, count_field)
 
#define ADD_FORMAT(f, fmt, unref_fn, type, list, nb)
 
#define FORMATS_REF(f, ref, unref_fn)
 
#define FIND_REF_INDEX(ref, idx)
 
#define FORMATS_UNREF(ref, list)
 
#define FORMATS_CHANGEREF(oldref, newref)
 
#define SET_COMMON_FORMATS(ctx, fmts, ref_fn, unref_fn)
 

Functions

static int merge_formats_internal (AVFilterFormats *a, AVFilterFormats *b, enum AVMediaType type, int check)
 
int ff_can_merge_formats (const AVFilterFormats *a, const AVFilterFormats *b, enum AVMediaType type)
 Check the formats/samplerates lists for compatibility for merging without actually merging. More...
 
int ff_merge_formats (AVFilterFormats *a, AVFilterFormats *b, enum AVMediaType type)
 
static int merge_samplerates_internal (AVFilterFormats *a, AVFilterFormats *b, int check)
 
int ff_can_merge_samplerates (const AVFilterFormats *a, const AVFilterFormats *b)
 
int ff_merge_samplerates (AVFilterFormats *a, AVFilterFormats *b)
 
int ff_merge_channel_layouts (AVFilterChannelLayouts *a, AVFilterChannelLayouts *b)
 Merge the formats/channel layouts/samplerates lists if they are compatible and update all the references of a and b to point to the combined list and free the old lists as needed. More...
 
int ff_fmt_is_in (int fmt, const int *fmts)
 Tell if an integer is contained in the provided -1-terminated list of integers. More...
 
AVFilterFormatsff_make_format_list (const int *fmts)
 Create a list of supported formats. More...
 
AVFilterChannelLayoutsff_make_format64_list (const int64_t *fmts)
 
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. More...
 
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. More...
 
int ff_formats_pixdesc_filter (AVFilterFormats **rfmts, unsigned want, unsigned rej)
 Construct a formats list containing all pixel formats with certain properties. More...
 
AVFilterFormatsff_planar_sample_fmts (void)
 Construct a formats list containing all planar sample formats. More...
 
AVFilterFormatsff_all_samplerates (void)
 
AVFilterChannelLayoutsff_all_channel_layouts (void)
 Construct an empty AVFilterChannelLayouts/AVFilterFormats struct – representing any channel layout (with known disposition)/sample rate. More...
 
AVFilterChannelLayoutsff_all_channel_counts (void)
 Construct an AVFilterChannelLayouts coding for any channel layout, with known or unknown disposition. More...
 
int ff_channel_layouts_ref (AVFilterChannelLayouts *f, AVFilterChannelLayouts **ref)
 Add *ref as a new reference to f. More...
 
int ff_formats_ref (AVFilterFormats *f, AVFilterFormats **ref)
 Add ref as a new reference to formats. More...
 
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. More...
 
void ff_channel_layouts_unref (AVFilterChannelLayouts **ref)
 Remove a reference to a channel layouts list. More...
 
void ff_channel_layouts_changeref (AVFilterChannelLayouts **oldref, AVFilterChannelLayouts **newref)
 
void ff_formats_changeref (AVFilterFormats **oldref, AVFilterFormats **newref)
 
int ff_set_common_channel_layouts (AVFilterContext *ctx, AVFilterChannelLayouts *channel_layouts)
 A helper for query_formats() which sets all links to the same list of channel layouts/sample rates. More...
 
int ff_set_common_samplerates (AVFilterContext *ctx, AVFilterFormats *samplerates)
 
int ff_set_common_formats (AVFilterContext *ctx, AVFilterFormats *formats)
 A helper for query_formats() which sets all links to the same list of formats. More...
 
int ff_default_query_formats (AVFilterContext *ctx)
 
int ff_parse_pixel_format (enum AVPixelFormat *ret, const char *arg, void *log_ctx)
 Parse a pixel format. More...
 
int ff_parse_sample_rate (int *ret, const char *arg, void *log_ctx)
 Parse a sample rate. More...
 
int ff_parse_channel_layout (int64_t *ret, int *nret, const char *arg, void *log_ctx)
 Parse a channel layout or a corresponding integer representation. More...
 
static int check_list (void *log, const char *name, const AVFilterFormats *fmts)
 
int ff_formats_check_pixel_formats (void *log, const AVFilterFormats *fmts)
 Check that fmts is a valid pixel formats list. More...
 
int ff_formats_check_sample_formats (void *log, const AVFilterFormats *fmts)
 Check that fmts is a valid sample formats list. More...
 
int ff_formats_check_sample_rates (void *log, const AVFilterFormats *fmts)
 Check that fmts is a valid sample rates list. More...
 
static int layouts_compatible (uint64_t a, uint64_t b)
 
int ff_formats_check_channel_layouts (void *log, const AVFilterChannelLayouts *fmts)
 Check that fmts is a valid channel layouts list. More...
 

Macro Definition Documentation

◆ KNOWN

#define KNOWN (   l)    (!FF_LAYOUT2COUNT(l)) /* for readability */

Definition at line 31 of file formats.c.

◆ MERGE_REF

#define MERGE_REF (   ret,
  a,
  fmts,
  type,
  fail_statement 
)
Value:
do { \
type ***tmp; \
int i; \
if (!(tmp = av_realloc_array(ret->refs, ret->refcount + a->refcount, \
sizeof(*tmp)))) \
{ fail_statement } \
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)
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Allocate, reallocate, or free an array.
Definition: mem.c:198
for(j=16;j >0;--j)
int i
Definition: input.c:407
#define av_freep(p)
static uint8_t tmp[11]
Definition: aes_ctr.c:27
if(ret< 0)
Definition: vf_mcdeint.c:282

Add all refs from a to ret and destroy a.

Definition at line 36 of file formats.c.

◆ MERGE_FORMATS

#define MERGE_FORMATS (   a,
  b,
  fmts,
  nb,
  type,
  check,
  empty_allowed 
)

Add all formats common to a and b to a, add b's refs to a and destroy b.

If check is set, nothing is modified and it is only checked whether the formats are compatible. If empty_allowed is set and one of a,b->nb is zero, the lists are merged; otherwise, it is treated as error.

Definition at line 63 of file formats.c.

◆ MAKE_FORMAT_LIST

#define MAKE_FORMAT_LIST (   type,
  field,
  count_field 
)
Value:
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_array(count, sizeof(*formats->field)); \
if (!formats->field) { \
av_freep(&formats); \
return NULL; \
} \
}
#define NULL
Definition: coverity.c:32
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:237
cl_device_type type
formats
Definition: signature.h:48
#define av_malloc_array(a, b)

Definition at line 268 of file formats.c.

◆ ADD_FORMAT

#define ADD_FORMAT (   f,
  fmt,
  unref_fn,
  type,
  list,
  nb 
)
Value:
do { \
type *fmts; \
if (!(*f) && !(*f = av_mallocz(sizeof(**f)))) { \
return AVERROR(ENOMEM); \
} \
\
fmts = av_realloc_array((*f)->list, (*f)->nb + 1, \
sizeof(*(*f)->list)); \
if (!fmts) { \
unref_fn(f); \
return AVERROR(ENOMEM); \
} \
\
(*f)->list = fmts; \
(*f)->list[(*f)->nb++] = fmt; \
} while (0)
#define f(width, name)
Definition: cbs_vp9.c:255
#define AVERROR(e)
Definition: error.h:43

Definition at line 313 of file formats.c.

◆ FORMATS_REF

#define FORMATS_REF (   f,
  ref,
  unref_fn 
)
Value:
void *tmp; \
if (!f) \
return AVERROR(ENOMEM); \
\
tmp = av_realloc_array(f->refs, sizeof(*f->refs), f->refcount + 1); \
if (!tmp) { \
unref_fn(&f); \
return AVERROR(ENOMEM); \
} \
f->refs = tmp; \
f->refs[f->refcount++] = ref; \
*ref = f; \
return 0
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:107

Definition at line 445 of file formats.c.

◆ FIND_REF_INDEX

#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 471 of file formats.c.

◆ FORMATS_UNREF

#define FORMATS_UNREF (   ref,
  list 
)
Value:
do { \
int idx = -1; \
if (!*ref) \
return; \
if (idx >= 0) { \
memmove((*ref)->refs + idx, (*ref)->refs + idx + 1, \
sizeof(*(*ref)->refs) * ((*ref)->refcount - idx - 1)); \
--(*ref)->refcount; \
} \
if (!(*ref)->refcount) { \
av_free((*ref)->list); \
av_free((*ref)->refs); \
av_free(*ref); \
} \
*ref = NULL; \
} while (0)
#define FIND_REF_INDEX(ref, idx)
Definition: formats.c:471

Definition at line 481 of file formats.c.

◆ FORMATS_CHANGEREF

#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 513 of file formats.c.

◆ SET_COMMON_FORMATS

#define SET_COMMON_FORMATS (   ctx,
  fmts,
  ref_fn,
  unref_fn 
)
Value:
int count = 0, i; \
if (!fmts) \
return AVERROR(ENOMEM); \
for (i = 0; i < ctx->nb_inputs; i++) { \
if (ctx->inputs[i] && !ctx->inputs[i]->outcfg.fmts) { \
int ret = ref_fn(fmts, &ctx->inputs[i]->outcfg.fmts); \
if (ret < 0) { \
return ret; \
} \
count++; \
} \
} \
for (i = 0; i < ctx->nb_outputs; i++) { \
if (ctx->outputs[i] && !ctx->outputs[i]->incfg.fmts) { \
int ret = ref_fn(fmts, &ctx->outputs[i]->incfg.fmts); \
if (ret < 0) { \
return ret; \
} \
count++; \
} \
} \
if (!count) { \
unref_fn(&fmts); \
} \
\
return 0;
AVFormatContext * ctx
Definition: movenc.c:48

Definition at line 537 of file formats.c.

Function Documentation

◆ merge_formats_internal()

static int merge_formats_internal ( AVFilterFormats a,
AVFilterFormats b,
enum AVMediaType  type,
int  check 
)
static

Definition at line 95 of file formats.c.

Referenced by ff_can_merge_formats(), and ff_merge_formats().

◆ ff_can_merge_formats()

int ff_can_merge_formats ( const AVFilterFormats a,
const AVFilterFormats b,
enum AVMediaType  type 
)

Check the formats/samplerates lists for compatibility for merging without actually merging.

Returns
1 if they are compatible, 0 if not.

Definition at line 134 of file formats.c.

Referenced by query_formats().

◆ ff_merge_formats()

int ff_merge_formats ( AVFilterFormats a,
AVFilterFormats b,
enum AVMediaType  type 
)

Definition at line 141 of file formats.c.

◆ merge_samplerates_internal()

static int merge_samplerates_internal ( AVFilterFormats a,
AVFilterFormats b,
int  check 
)
static

Definition at line 148 of file formats.c.

Referenced by ff_can_merge_samplerates(), and ff_merge_samplerates().

◆ ff_can_merge_samplerates()

int ff_can_merge_samplerates ( const AVFilterFormats a,
const AVFilterFormats b 
)

Definition at line 157 of file formats.c.

Referenced by query_formats().

◆ ff_merge_samplerates()

int ff_merge_samplerates ( AVFilterFormats a,
AVFilterFormats b 
)

Definition at line 162 of file formats.c.

◆ ff_merge_channel_layouts()

int ff_merge_channel_layouts ( AVFilterChannelLayouts a,
AVFilterChannelLayouts b 
)

Merge the formats/channel layouts/samplerates lists if they are compatible and update all the references of a and b to point to the combined list and free the old lists as needed.

The combined list usually contains the intersection of the lists of a and b.

Both a and b must have owners (i.e. refcount > 0) for these functions.

Returns
1 if merging succeeded, 0 if a and b are incompatible and negative AVERROR code on failure. a and b are unmodified if 0 is returned.

Definition at line 168 of file formats.c.

◆ ff_fmt_is_in()

int ff_fmt_is_in ( int  fmt,
const int fmts 
)

Tell if an integer is contained in the provided -1-terminated list of integers.

This is useful for determining (for instance) if an AVPixelFormat is in an array of supported formats.

Parameters
fmtprovided format
fmts-1-terminated list of formats
Returns
1 if present, 0 if absent

Definition at line 257 of file formats.c.

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

◆ ff_make_format_list()

AVFilterFormats* ff_make_format_list ( const int fmts)

◆ ff_make_format64_list()

AVFilterChannelLayouts* ff_make_format64_list ( const int64_t *  fmts)

Definition at line 295 of file formats.c.

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

◆ avfilter_make_format64_list()

AVFilterChannelLayouts* avfilter_make_format64_list ( const int64_t *  fmts)

Definition at line 307 of file formats.c.

◆ ff_add_format()

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 332 of file formats.c.

Referenced by asink_query_formats(), ff_all_formats(), ff_draw_supported_pixel_formats(), ff_planar_sample_fmts(), hwupload_query_formats(), init(), query_formats(), reduce_formats_on_filter(), and vsink_query_formats().

◆ ff_add_channel_layout()

int ff_add_channel_layout ( AVFilterChannelLayouts **  l,
uint64_t  channel_layout 
)

◆ ff_all_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 345 of file formats.c.

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

◆ ff_formats_pixdesc_filter()

int ff_formats_pixdesc_filter ( AVFilterFormats **  rfmts,
unsigned  want,
unsigned  rej 
)

Construct a formats list containing all pixel formats with certain properties.

Definition at line 367 of file formats.c.

Referenced by hwdownload_query_formats(), and query_formats().

◆ ff_planar_sample_fmts()

AVFilterFormats* ff_planar_sample_fmts ( void  )

Construct a formats list containing all planar sample formats.

Definition at line 408 of file formats.c.

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

◆ ff_all_samplerates()

AVFilterFormats* ff_all_samplerates ( void  )

◆ ff_all_channel_layouts()

AVFilterChannelLayouts* ff_all_channel_layouts ( void  )

Construct an empty AVFilterChannelLayouts/AVFilterFormats struct – representing any channel layout (with known disposition)/sample rate.

Definition at line 427 of file formats.c.

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

◆ ff_all_channel_counts()

AVFilterChannelLayouts* ff_all_channel_counts ( void  )

Construct an AVFilterChannelLayouts coding for any channel layout, with known or unknown disposition.

Definition at line 436 of file formats.c.

Referenced by aeval_query_formats(), asink_query_formats(), channelmap_query_formats(), ff_default_query_formats(), and query_formats().

◆ ff_channel_layouts_ref()

int ff_channel_layouts_ref ( AVFilterChannelLayouts f,
AVFilterChannelLayouts **  ref 
)

◆ ff_formats_ref()

int 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 466 of file formats.c.

Referenced by cudaupload_query_formats(), deint_cuda_query_formats(), ff_set_common_formats(), ff_set_common_samplerates(), ff_vaapi_vpp_query_formats(), hwdownload_query_formats(), hwmap_query_formats(), hwupload_query_formats(), movie_query_formats(), overlay_qsv_query_formats(), query_formats(), and query_formats_src().

◆ ff_formats_unref()

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 503 of file formats.c.

Referenced by ff_add_format(), ff_formats_ref(), ff_set_common_formats(), ff_set_common_samplerates(), free_link(), pick_format(), and uninit().

◆ ff_channel_layouts_unref()

void ff_channel_layouts_unref ( AVFilterChannelLayouts **  ref)

Remove a reference to a channel layouts list.

Definition at line 508 of file formats.c.

Referenced by ff_add_channel_layout(), ff_channel_layouts_ref(), ff_set_common_channel_layouts(), free_link(), pick_format(), and uninit().

◆ ff_channel_layouts_changeref()

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

Definition at line 526 of file formats.c.

Referenced by avfilter_insert_filter().

◆ ff_formats_changeref()

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

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

Definition at line 532 of file formats.c.

Referenced by avfilter_insert_filter().

◆ ff_set_common_channel_layouts()

int 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 568 of file formats.c.

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

◆ ff_set_common_samplerates()

int ff_set_common_samplerates ( AVFilterContext ctx,
AVFilterFormats samplerates 
)

◆ ff_set_common_formats()

int ff_set_common_formats ( AVFilterContext ctx,
AVFilterFormats formats 
)

◆ ff_default_query_formats()

int ff_default_query_formats ( AVFilterContext ctx)

Definition at line 593 of file formats.c.

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

◆ ff_parse_pixel_format()

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

Parse a pixel format.

Parameters
retpixel format pointer to where the value should be written
argstring to parse
log_ctxlog context
Returns
>= 0 in case of success, a negative AVERROR code on error

Definition at line 617 of file formats.c.

Referenced by init().

◆ ff_parse_sample_rate()

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

Parse a sample rate.

Parameters
retunsigned integer pointer to where the value should be written
argstring to parse
log_ctxlog context
Returns
>= 0 in case of success, a negative AVERROR code on error

Definition at line 632 of file formats.c.

Referenced by init().

◆ ff_parse_channel_layout()

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

Parse a channel layout or a corresponding integer representation.

Parameters
ret64bit integer pointer to where the value should be written.
nretinteger pointer to the number of channels; if not NULL, then unknown channel layouts are accepted
argstring to parse
log_ctxlog context
Returns
>= 0 in case of success, a negative AVERROR code on error

Definition at line 644 of file formats.c.

Referenced by init(), and main().

◆ check_list()

static int check_list ( void log,
const char *  name,
const AVFilterFormats fmts 
)
static

◆ ff_formats_check_pixel_formats()

int ff_formats_check_pixel_formats ( void log,
const AVFilterFormats fmts 
)

Check that fmts is a valid pixel formats list.

In particular, check for duplicates.

Definition at line 686 of file formats.c.

Referenced by filter_link_check_formats().

◆ ff_formats_check_sample_formats()

int ff_formats_check_sample_formats ( void log,
const AVFilterFormats fmts 
)

Check that fmts is a valid sample formats list.

In particular, check for duplicates.

Definition at line 691 of file formats.c.

Referenced by filter_link_check_formats().

◆ ff_formats_check_sample_rates()

int ff_formats_check_sample_rates ( void log,
const AVFilterFormats fmts 
)

Check that fmts is a valid sample rates list.

In particular, check for duplicates.

Definition at line 696 of file formats.c.

Referenced by filter_link_check_formats().

◆ layouts_compatible()

static int layouts_compatible ( uint64_t  a,
uint64_t  b 
)
static

Definition at line 703 of file formats.c.

Referenced by ff_formats_check_channel_layouts().

◆ ff_formats_check_channel_layouts()

int ff_formats_check_channel_layouts ( void log,
const AVFilterChannelLayouts fmts 
)

Check that fmts is a valid channel layouts list.

In particular, check for duplicates.

Definition at line 710 of file formats.c.

Referenced by filter_link_check_formats().