Asterisk - The Open Source Telephony Project GIT-master-f36a736
Macros | Functions
media_index.h File Reference

Media file format and description indexing engine. More...

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define ast_media_index_update(index, variant)    ast_media_index_update_for_file(index, variant, NULL)
 Update a media index. More...
 

Functions

const char * ast_media_get_description (struct ast_media_index *index, const char *filename, const char *variant)
 Get the description for a media file. More...
 
struct ast_format_capast_media_get_format_cap (struct ast_media_index *index, const char *filename, const char *variant)
 Get the ast_format_cap for a media file. More...
 
struct ao2_containerast_media_get_media (struct ast_media_index *index)
 Get the a container of all media available on the system. More...
 
struct ao2_containerast_media_get_variants (struct ast_media_index *index, const char *filename)
 Get the languages in which a media file is available. More...
 
struct ast_media_indexast_media_index_create (const char *base_dir)
 Creates a new media index. More...
 
int ast_media_index_update_for_file (struct ast_media_index *index, const char *variant, const char *filename)
 Update a media index for a specific sound file. More...
 

Detailed Description

Media file format and description indexing engine.

Definition in file media_index.h.

Macro Definition Documentation

◆ ast_media_index_update

#define ast_media_index_update (   index,
  variant 
)     ast_media_index_update_for_file(index, variant, NULL)

Update a media index.

Parameters
indexMedia index in which to query information
variantMedia variant for which to get the description
Return values
non-zeroon error
Returns
zero on success

Definition at line 121 of file media_index.h.

Function Documentation

◆ ast_media_get_description()

const char * ast_media_get_description ( struct ast_media_index index,
const char *  filename,
const char *  variant 
)

Get the description for a media file.

Parameters
indexMedia index in which to query information
filenameName of the file for which to get the description
variantMedia variant for which to get the description
Return values
NULLif not found
Returns
The description requested (must be copied to be kept)

Definition at line 230 of file media_index.c.

231{
232 RAII_VAR(struct media_variant *, variant, NULL, ao2_cleanup);
233 if (ast_strlen_zero(filename) || ast_strlen_zero(variant_str)) {
234 return NULL;
235 }
236
237 variant = find_variant(index, filename, variant_str);
238 if (!variant) {
239 return NULL;
240 }
241
242 return variant->description;
243}
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
static struct media_variant * find_variant(struct ast_media_index *index, const char *filename, const char *variant)
Definition: media_index.c:184
#define NULL
Definition: resample.c:96
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
Structure to hold a list of the format variations for a media file for a specific variant.
Definition: media_index.c:46
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:941

References ao2_cleanup, ast_strlen_zero(), find_variant(), NULL, RAII_VAR, and media_variant::variant.

Referenced by create_sound_blob(), and show_sound_info_cb().

◆ ast_media_get_format_cap()

struct ast_format_cap * ast_media_get_format_cap ( struct ast_media_index index,
const char *  filename,
const char *  variant 
)

Get the ast_format_cap for a media file.

Parameters
indexMedia index in which to query information
filenameName of the file for which to get the description
variantMedia variant for which to get the description
Return values
NULLif not found
Returns
a copy of the format capabilities (must be destroyed with ast_format_cap_destroy)

Definition at line 245 of file media_index.c.

246{
247 struct ast_format_cap *dupcap;
248 RAII_VAR(struct media_variant *, variant, NULL, ao2_cleanup);
249 if (ast_strlen_zero(filename) || ast_strlen_zero(variant_str)) {
250 return NULL;
251 }
252
253 variant = find_variant(index, filename, variant_str);
254 if (!variant) {
255 return NULL;
256 }
257
259 if (dupcap) {
261 }
262 return dupcap;
263}
@ AST_MEDIA_TYPE_UNKNOWN
Definition: codec.h:31
@ AST_FORMAT_CAP_FLAG_DEFAULT
Definition: format_cap.h:38
int ast_format_cap_append_from_cap(struct ast_format_cap *dst, const struct ast_format_cap *src, enum ast_media_type type)
Append the formats of provided type in src to dst.
Definition: format_cap.c:269
#define ast_format_cap_alloc(flags)
Allocate a new ast_format_cap structure.
Definition: format_cap.h:49
Format capabilities structure, holds formats + preference order + etc.
Definition: format_cap.c:54

References ao2_cleanup, ast_format_cap_alloc, ast_format_cap_append_from_cap(), AST_FORMAT_CAP_FLAG_DEFAULT, AST_MEDIA_TYPE_UNKNOWN, ast_strlen_zero(), find_variant(), ast_format_cap::formats, NULL, and RAII_VAR.

Referenced by add_format_information_cb(), and show_sound_info_cb().

◆ ast_media_get_media()

struct ao2_container * ast_media_get_media ( struct ast_media_index index)

Get the a container of all media available on the system.

Parameters
indexMedia index in which to query information
Return values
NULLon error
Returns
an ast_str_container filled with media file name strings

Definition at line 307 of file media_index.c.

308{
309 RAII_VAR(struct ao2_container *, media, NULL, ao2_cleanup);
310
311 if (!index->media_list_cache) {
313 if (!media) {
314 return NULL;
315 }
316
317 ao2_callback(index->index, OBJ_NODATA, add_media_cb, media);
318
319 /* Ref to the cache */
320 ao2_ref(media, +1);
321 index->media_list_cache = media;
322 }
323
324 /* Ref to the caller */
325 ao2_ref(index->media_list_cache, +1);
326 return index->media_list_cache;
327}
#define ao2_callback(c, flags, cb_fn, arg)
ao2_callback() is a generic function that applies cb_fn() to all objects in a container,...
Definition: astobj2.h:1693
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
@ OBJ_NODATA
Definition: astobj2.h:1044
static int add_media_cb(void *obj, void *arg, int flags)
Add the media_info's filename to the container of filenames requested.
Definition: media_index.c:299
#define INDEX_BUCKETS
The number of buckets to be used for storing media filename-keyed objects.
Definition: media_index.c:43
#define ast_str_container_alloc(buckets)
Allocates a hash container for bare strings.
Definition: strings.h:1365
Generic container type.
struct ao2_container * index
Definition: media_index.c:149
struct ao2_container * media_list_cache
Definition: media_index.c:150

References add_media_cb(), ao2_callback, ao2_cleanup, ao2_ref, ast_str_container_alloc, ast_media_index::index, INDEX_BUCKETS, ast_media_index::media_list_cache, NULL, OBJ_NODATA, and RAII_VAR.

Referenced by ast_ari_sounds_list(), handle_cli_sound_show(), and handle_cli_sounds_show().

◆ ast_media_get_variants()

struct ao2_container * ast_media_get_variants ( struct ast_media_index index,
const char *  filename 
)

Get the languages in which a media file is available.

Parameters
indexMedia index in which to query information
filenameName of the file for which to get available languages
Return values
NULLon error
Returns
an ast_str_container filled with language strings

Definition at line 274 of file media_index.c.

275{
277 RAII_VAR(struct ao2_container *, variants, NULL, ao2_cleanup);
278 if (!filename) {
279 return NULL;
280 }
281
283 if (!variants) {
284 return NULL;
285 }
286
287 info = ao2_find(index->index, filename, OBJ_KEY);
288 if (!info) {
289 return NULL;
290 }
291
292 ao2_callback(info->variants, OBJ_NODATA, add_variant_cb, variants);
293
294 ao2_ref(variants, +1);
295 return variants;
296}
#define OBJ_KEY
Definition: astobj2.h:1151
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1736
static int add_variant_cb(void *obj, void *arg, int flags)
Add the variant to the list of variants requested.
Definition: media_index.c:266
#define VARIANT_BUCKETS
The number of buckets to be used for storing variant-keyed objects.
Definition: media_index.c:40
def info(msg)
Structure to hold information about a media file.
Definition: media_index.c:99

References add_variant_cb(), ao2_callback, ao2_cleanup, ao2_find, ao2_ref, ast_str_container_alloc, ast_media_index::index, sip_to_pjsip::info(), NULL, OBJ_KEY, OBJ_NODATA, RAII_VAR, and VARIANT_BUCKETS.

Referenced by create_sound_blob(), and handle_cli_sound_show().

◆ ast_media_index_create()

struct ast_media_index * ast_media_index_create ( const char *  base_dir)

Creates a new media index.

Parameters
base_dirBase directory for indexing
Return values
NULLon error
Anew AO2 refcounted media index

Definition at line 162 of file media_index.c.

163{
164 size_t base_dir_sz = strlen(base_dir) + 1;
165 struct ast_media_index *index = ao2_alloc(sizeof(*index) + base_dir_sz, media_index_dtor);
166
167 if (!index) {
168 return NULL;
169 }
170
171 memcpy(index->base_dir, base_dir, base_dir_sz);
172
175 if (!index->index) {
176 ao2_ref(index, -1);
177
178 return NULL;
179 }
180
181 return index;
182}
@ AO2_ALLOC_OPT_LOCK_MUTEX
Definition: astobj2.h:363
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:409
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
Allocate and initialize a hash container with the desired number of buckets.
Definition: astobj2.h:1303
static int media_info_hash(const void *obj, const int flags)
Definition: media_index.c:135
static int media_info_cmp(void *obj, void *arg, int flags)
Definition: media_index.c:141
static void media_index_dtor(void *obj)
Definition: media_index.c:154
char base_dir[0]
Definition: media_index.c:151

References ao2_alloc, AO2_ALLOC_OPT_LOCK_MUTEX, ao2_container_alloc_hash, ao2_ref, ast_media_index::base_dir, ast_media_index::index, INDEX_BUCKETS, media_index_dtor(), media_info_cmp(), media_info_hash(), and NULL.

Referenced by ast_sounds_get_index_for_file().

◆ ast_media_index_update_for_file()

int ast_media_index_update_for_file ( struct ast_media_index index,
const char *  variant,
const char *  filename 
)

Update a media index for a specific sound file.

Since
13.25.0
16.2.0
Parameters
indexMedia index in which to query information
variantMedia variant for which to get the description
filenameSound file name without extension
Note
If filename is NULL, this function will act as ast_media_index_update and add all sound files to the index.
Return values
non-zeroon error
Returns
zero on success

Definition at line 587 of file media_index.c.

589{
590 struct timeval start;
591 struct timeval end;
592 int64_t elapsed;
593 int rc;
594 size_t dirname_len = strlen(index->base_dir) + strlen(S_OR(variant, "")) + 1;
595 struct read_dirs_data data = {
596 .search_filename = S_OR(filename, ""),
597 .search_filename_len = strlen(S_OR(filename, "")),
598 .search_variant = S_OR(variant, ""),
599 .index = index,
600 .dirname_len = dirname_len,
601 };
602 char *search_dir = ast_alloca(dirname_len + 1);
603
604 sprintf(search_dir, "%s%s%s", index->base_dir, ast_strlen_zero(variant) ? "" : "/",
605 data.search_variant);
606
607 gettimeofday(&start, NULL);
608 rc = ast_file_read_dirs(search_dir, read_dirs_cb, &data, -1);
609 gettimeofday(&end, NULL);
610 elapsed = ast_tvdiff_us(end, start);
611 ast_debug(1, "Media for language '%s' indexed in %8.6f seconds\n", data.search_variant, elapsed / 1E6);
612
613 return rc;
614}
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition: astmm.h:288
char * end
Definition: eagi_proxy.c:73
int ast_file_read_dirs(const char *dir_name, ast_file_on_file on_file, void *obj, int max_depth)
Recursively iterate through files and directories up to max_depth.
Definition: file.c:1274
#define ast_debug(level,...)
Log a DEBUG message.
static int read_dirs_cb(const char *dir_name, const char *filename, void *obj)
Definition: media_index.c:510
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition: strings.h:80
const char * search_filename
Definition: media_index.c:503
struct ast_media_index * index
Definition: media_index.c:506
const char * search_variant
Definition: media_index.c:505
size_t dirname_len
Definition: media_index.c:507
int64_t ast_tvdiff_us(struct timeval end, struct timeval start)
Computes the difference (in microseconds) between two struct timeval instances.
Definition: time.h:87

References ast_alloca, ast_debug, ast_file_read_dirs(), ast_strlen_zero(), ast_tvdiff_us(), ast_media_index::base_dir, read_dirs_data::dirname_len, end, read_dirs_data::index, NULL, read_dirs_cb(), S_OR, read_dirs_data::search_filename, and read_dirs_data::search_variant.

Referenced by update_index_cb().