FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Macros | Functions | Variables
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 "libavutil/parseutils.h"
#include "avfilter.h"
#include "internal.h"
#include "formats.h"
#include "all_channel_layouts.inc"

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)
 Add all refs from a to ret and destroy a. More...
 
#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. 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, in_fmts, out_fmts, ref_fn, unref_fn, list)
 

Functions

AVFilterFormatsff_merge_formats (AVFilterFormats *a, AVFilterFormats *b, enum AVMediaType type)
 Return a format list which contains the intersection of the formats of a and b. More...
 
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. 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_formatu64_list (const uint64_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...
 
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)
 
   Before                                 After

|formats |<------—. More...

 
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. 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...
 
static int default_query_formats_common (AVFilterContext *ctx, AVFilterChannelLayouts *(layouts)(void))
 
int ff_default_query_formats (AVFilterContext *ctx)
 
int ff_query_formats_all_layouts (AVFilterContext *ctx)
 Set the formats list to all known channel layouts. More...
 
int ff_parse_pixel_format (enum AVPixelFormat *ret, const char *arg, void *log_ctx)
 Parse a pixel format. More...
 
int ff_parse_sample_format (int *ret, const char *arg, void *log_ctx)
 Parse a sample format name or a corresponding integer representation. More...
 
int ff_parse_time_base (AVRational *ret, const char *arg, void *log_ctx)
 Parse a time base. 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...
 

Variables

const int64_t avfilter_all_channel_layouts []
 

Macro Definition Documentation

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

Definition at line 32 of file formats.c.

Referenced by ff_merge_channel_layouts().

#define MERGE_REF (   ret,
  a,
  fmts,
  type,
  fail 
)
Value:
do { \
type ***tmp; \
int i; \
if (!(tmp = av_realloc_array(ret->refs, ret->refcount + a->refcount, \
sizeof(*tmp)))) \
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); \
} while (0)
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition: mem.c:198
#define fail()
Definition: checkasm.h:116
GLint GLenum type
Definition: opengl_enc.c:105
int
if(ret< 0)
Definition: vf_mcdeint.c:279
#define av_freep(p)
for(j=16;j >0;--j)
static uint8_t tmp[11]
Definition: aes_ctr.c:26

Add all refs from a to ret and destroy a.

Definition at line 37 of file formats.c.

Referenced by ff_merge_channel_layouts(), and ff_merge_samplerates().

#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_array(count, sizeof(*ret->fmts)))) \
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(NULL, AV_LOG_ERROR, "Duplicate formats in %s detected\n", __FUNCTION__); \
av_free(ret->fmts); \
av_free(ret); \
} \
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)
#define NULL
Definition: coverity.c:32
const char * b
Definition: vf_curves.c:113
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:236
#define av_log(a,...)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
GLsizei count
Definition: opengl_enc.c:109
#define fail()
Definition: checkasm.h:116
return
#define FFMIN(a, b)
Definition: common.h:96
GLint GLenum type
Definition: opengl_enc.c:105
int
if(ret< 0)
Definition: vf_mcdeint.c:279
#define av_free(p)
#define av_malloc_array(a, b)
for(j=16;j >0;--j)
#define MERGE_REF(ret, a, fmts, type, fail)
Add all refs from a to ret and destroy a.
Definition: formats.c:37

Add all formats common for a and b to ret, copy the refs and destroy a and b.

Definition at line 61 of file formats.c.

Referenced by ff_merge_formats(), and ff_merge_samplerates().

#define MAKE_FORMAT_LIST (   type,
  field,
  count_field 
)
Value:
int count = 0; \
if (fmts) \
for (count = 0; fmts[count] != -1; count++) \
; \
formats->count_field = count; \
if (count) { \
formats->field = av_malloc_array(count, sizeof(*formats->field)); \
if (!formats->field) { \
} \
}
#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:236
GLsizei count
Definition: opengl_enc.c:109
return
GLint GLenum type
Definition: opengl_enc.c:105
int
if(ret< 0)
Definition: vf_mcdeint.c:279
#define av_freep(p)
#define av_malloc_array(a, b)
formats
Definition: signature.h:48
for(j=16;j >0;--j)

Definition at line 265 of file formats.c.

Referenced by avfilter_make_format64_list(), ff_make_format_list(), and ff_make_formatu64_list().

#define ADD_FORMAT (   f,
  fmt,
  unref_fn,
  type,
  list,
  nb 
)
Value:
do { \
type *fmts; \
void *oldf = *f; \
if (!(*f) && !(*f = av_mallocz(sizeof(**f)))) { \
unref_fn(f); \
return AVERROR(ENOMEM); \
} \
\
fmts = av_realloc_array((*f)->list, (*f)->nb + 1, \
sizeof(*(*f)->list)); \
if (!fmts) { \
unref_fn(f); \
if (!oldf) \
return AVERROR(ENOMEM); \
} \
\
(*f)->list = fmts; \
(*f)->list[(*f)->nb++] = fmt; \
} while (0)
const char * fmt
Definition: avisynth_c.h:769
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:236
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition: mem.c:198
#define AVERROR(e)
Definition: error.h:43
return
typedef void(APIENTRY *FF_PFNGLACTIVETEXTUREPROC)(GLenum texture)
GLint GLenum type
Definition: opengl_enc.c:105
if(ret< 0)
Definition: vf_mcdeint.c:279
#define av_freep(p)

Definition at line 314 of file formats.c.

Referenced by ff_add_channel_layout(), and ff_add_format().

#define FORMATS_REF (   f,
  ref,
  unref_fn 
)
Value:
void *tmp; \
if (!f || !ref) \
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; \
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition: mem.c:198
#define AVERROR(e)
Definition: error.h:43
return
if(ret< 0)
Definition: vf_mcdeint.c:279
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:107
static uint8_t tmp[11]
Definition: aes_ctr.c:26

Definition at line 419 of file formats.c.

Referenced by ff_channel_layouts_ref(), and ff_formats_ref().

#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)
int
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:107
for(j=16;j >0;--j)

Definition at line 445 of file formats.c.

#define FORMATS_UNREF (   ref,
  list 
)
Value:
do { \
int idx = -1; \
if (!*ref || !(*ref)->refs) \
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); \
} \
*ref = NULL; \
} while (0)
#define NULL
Definition: coverity.c:32
#define FIND_REF_INDEX(ref, idx)
Definition: formats.c:445
return
int
if(ret< 0)
Definition: vf_mcdeint.c:279
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:107
#define av_free(p)

Definition at line 455 of file formats.c.

Referenced by ff_channel_layouts_unref(), and ff_formats_unref().

#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)
#define NULL
Definition: coverity.c:32
#define FIND_REF_INDEX(ref, idx)
Definition: formats.c:445
int
if(ret< 0)
Definition: vf_mcdeint.c:279

Definition at line 486 of file formats.c.

Referenced by ff_channel_layouts_changeref(), and ff_formats_changeref().

#define SET_COMMON_FORMATS (   ctx,
  fmts,
  in_fmts,
  out_fmts,
  ref_fn,
  unref_fn,
  list 
)

Function Documentation

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

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

Referenced by can_merge_formats(), and query_formats().

AVFilterFormats* ff_merge_samplerates ( AVFilterFormats a,
AVFilterFormats b 
)

Definition at line 139 of file formats.c.

Referenced by can_merge_formats(), and 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 166 of file formats.c.

Referenced by query_formats().

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

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

AVFilterFormats* ff_make_format_list ( const int fmts)

Create a list of supported formats.

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

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

Definition at line 283 of file formats.c.

Referenced by aeval_query_formats(), cudascale_query_formats(), cudaupload_query_formats(), ff_opencl_filter_query_formats(), ff_vaapi_vpp_query_formats(), geq_query_formats(), hwupload_query_formats(), movie_query_formats(), nppscale_query_formats(), overlay_qsv_query_formats(), pp_query_formats(), qsvdeint_query_formats(), qsvscale_query_formats(), query_formats(), and query_formats_src().

AVFilterChannelLayouts* ff_make_formatu64_list ( const uint64_t *  fmts)

Definition at line 292 of file formats.c.

AVFilterChannelLayouts* avfilter_make_format64_list ( const int64_t *  fmts)

Definition at line 303 of file formats.c.

Referenced by movie_query_formats(), and query_formats().

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

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

int ff_add_channel_layout ( AVFilterChannelLayouts **  l,
uint64_t  channel_layout 
)
AVFilterFormats* ff_all_formats ( enum AVMediaType  type)

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

Definition at line 350 of file formats.c.

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

AVFilterFormats* ff_planar_sample_fmts ( void  )

Construct a formats list containing all planar sample formats.

Definition at line 382 of file formats.c.

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

AVFilterFormats* ff_all_samplerates ( void  )
AVFilterChannelLayouts* ff_all_channel_layouts ( void  )

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

Definition at line 401 of file formats.c.

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

AVFilterChannelLayouts* ff_all_channel_counts ( void  )

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

Definition at line 410 of file formats.c.

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

int ff_channel_layouts_ref ( AVFilterChannelLayouts f,
AVFilterChannelLayouts **  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 440 of file formats.c.

Referenced by cudaupload_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().

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

Referenced by ff_add_format(), ff_formats_ref(), ff_set_common_formats(), ff_set_common_samplerates(), free_link(), hwdownload_query_formats(), init(), pick_format(), and reduce_formats_on_filter().

void ff_channel_layouts_unref ( AVFilterChannelLayouts **  ref)

Remove a reference to a channel layouts list.

Definition at line 481 of file formats.c.

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

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

Definition at line 499 of file formats.c.

Referenced by avfilter_insert_filter().

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

   Before                                 After

|formats |<------—.

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

Definition at line 505 of file formats.c.

Referenced by avfilter_insert_filter().

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

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

int ff_set_common_samplerates ( AVFilterContext ctx,
AVFilterFormats samplerates 
)
int ff_set_common_formats ( AVFilterContext ctx,
AVFilterFormats formats 
)
static int default_query_formats_common ( AVFilterContext ctx,
AVFilterChannelLayouts layouts)(void 
)
static

Definition at line 574 of file formats.c.

Referenced by ff_default_query_formats(), and ff_query_formats_all_layouts().

int ff_default_query_formats ( AVFilterContext ctx)

Definition at line 597 of file formats.c.

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

int ff_query_formats_all_layouts ( AVFilterContext ctx)

Set the formats list to all known channel layouts.

This function behaves like ff_default_query_formats(), except it only accepts known channel layouts. It should only be used with audio filters.

Definition at line 602 of file formats.c.

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

Referenced by init().

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

Parse a sample format name or a corresponding integer representation.

Parameters
retinteger 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 624 of file formats.c.

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

Parse a time base.

Parameters
retunsigned AVRational 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 639 of file formats.c.

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

Referenced by init().

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

Referenced by init(), and main().

Variable Documentation

const int64_t avfilter_all_channel_layouts[]

Definition at line 372 of file formats.c.

Referenced by main().