FFmpeg
avtextformat.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) The FFmpeg developers
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include <limits.h>
22 #include <stdarg.h>
23 #include <stdint.h>
24 #include <stdio.h>
25 #include <string.h>
26 
27 #include "libavutil/mem.h"
28 #include "libavutil/avassert.h"
29 #include "libavutil/bprint.h"
30 #include "libavutil/error.h"
31 #include "libavutil/hash.h"
32 #include "libavutil/intreadwrite.h"
33 #include "libavutil/macros.h"
34 #include "libavutil/opt.h"
35 #include "avtextformat.h"
36 
37 #define SECTION_ID_NONE -1
38 
39 #define SHOW_OPTIONAL_FIELDS_AUTO -1
40 #define SHOW_OPTIONAL_FIELDS_NEVER 0
41 #define SHOW_OPTIONAL_FIELDS_ALWAYS 1
42 
43 static const struct {
44  double bin_val;
45  double dec_val;
46  const char *bin_str;
47  const char *dec_str;
48 } si_prefixes[] = {
49  { 1.0, 1.0, "", "" },
50  { 1.024e3, 1e3, "Ki", "K" },
51  { 1.048576e6, 1e6, "Mi", "M" },
52  { 1.073741824e9, 1e9, "Gi", "G" },
53  { 1.099511627776e12, 1e12, "Ti", "T" },
54  { 1.125899906842624e15, 1e15, "Pi", "P" },
55 };
56 
57 static const char *textcontext_get_formatter_name(void *p)
58 {
59  AVTextFormatContext *tctx = p;
60  return tctx->formatter->name;
61 }
62 
63 #define OFFSET(x) offsetof(AVTextFormatContext, x)
64 
65 static const AVOption textcontext_options[] = {
66  { "string_validation", "set string validation mode",
68  { "sv", "set string validation mode",
70  { "ignore", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_TEXTFORMAT_STRING_VALIDATION_IGNORE}, .unit = "sv" },
71  { "replace", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_TEXTFORMAT_STRING_VALIDATION_REPLACE}, .unit = "sv" },
72  { "fail", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_TEXTFORMAT_STRING_VALIDATION_FAIL}, .unit = "sv" },
73  { "string_validation_replacement", "set string validation replacement string", OFFSET(string_validation_replacement), AV_OPT_TYPE_STRING, {.str=""}},
74  { "svr", "set string validation replacement string", OFFSET(string_validation_replacement), AV_OPT_TYPE_STRING, {.str="\xEF\xBF\xBD"}},
75  { NULL }
76 };
77 
78 static void *textcontext_child_next(void *obj, void *prev)
79 {
80  AVTextFormatContext *ctx = obj;
81  if (!prev && ctx->formatter && ctx->formatter->priv_class && ctx->priv)
82  return ctx->priv;
83  return NULL;
84 }
85 
86 static const AVClass textcontext_class = {
87  .class_name = "AVTextContext",
88  .item_name = textcontext_get_formatter_name,
89  .option = textcontext_options,
90  .version = LIBAVUTIL_VERSION_INT,
91  .child_next = textcontext_child_next,
92 };
93 
94 static void bprint_bytes(AVBPrint *bp, const uint8_t *ubuf, size_t ubuf_size)
95 {
96  int i;
97  av_bprintf(bp, "0X");
98  for (i = 0; i < ubuf_size; i++)
99  av_bprintf(bp, "%02X", ubuf[i]);
100 }
101 
103 {
104  AVTextFormatContext *tctx = *ptctx;
105  int i;
106  int ret = 0;
107 
108  if (!tctx)
109  return EINVAL;
110 
111  av_hash_freep(&tctx->hash);
112 
113  av_hash_freep(&tctx->hash);
114 
115  if (tctx->formatter->uninit)
116  tctx->formatter->uninit(tctx);
117  for (i = 0; i < SECTION_MAX_NB_LEVELS; i++)
119  if (tctx->formatter->priv_class)
120  av_opt_free(tctx->priv);
121  av_freep(&tctx->priv);
122  av_opt_free(tctx);
123  av_freep(ptctx);
124  return ret;
125 }
126 
127 
128 int avtext_context_open(AVTextFormatContext **ptctx, const AVTextFormatter *formatter, AVTextWriterContext *writer_context, const char *args,
129  const struct AVTextFormatSection *sections, int nb_sections,
130  int show_value_unit,
131  int use_value_prefix,
135  char *show_data_hash)
136 {
137  AVTextFormatContext *tctx;
138  int i, ret = 0;
139 
140  if (!(tctx = av_mallocz(sizeof(AVTextFormatContext)))) {
141  ret = AVERROR(ENOMEM);
142  goto fail;
143  }
144 
145  if (!(tctx->priv = av_mallocz(formatter->priv_size))) {
146  ret = AVERROR(ENOMEM);
147  goto fail;
148  }
149 
155 
156  if (nb_sections > SECTION_MAX_NB_SECTIONS) {
157  av_log(tctx, AV_LOG_ERROR, "The number of section definitions (%d) is larger than the maximum allowed (%d)\n", nb_sections, SECTION_MAX_NB_SECTIONS);
158  ret = AVERROR(EINVAL);
159  goto fail;
160  }
161 
162  tctx->class = &textcontext_class;
163  tctx->formatter = formatter;
164  tctx->level = -1;
165  tctx->sections = sections;
166  tctx->nb_sections = nb_sections;
167  tctx->writer = writer_context;
168 
169  av_opt_set_defaults(tctx);
170 
171  if (formatter->priv_class) {
172  void *priv_ctx = tctx->priv;
173  *(const AVClass **)priv_ctx = formatter->priv_class;
174  av_opt_set_defaults(priv_ctx);
175  }
176 
177  /* convert options to dictionary */
178  if (args) {
180  const AVDictionaryEntry *opt = NULL;
181 
182  if ((ret = av_dict_parse_string(&opts, args, "=", ":", 0)) < 0) {
183  av_log(tctx, AV_LOG_ERROR, "Failed to parse option string '%s' provided to textformat context\n", args);
184  av_dict_free(&opts);
185  goto fail;
186  }
187 
188  while ((opt = av_dict_iterate(opts, opt))) {
189  if ((ret = av_opt_set(tctx, opt->key, opt->value, AV_OPT_SEARCH_CHILDREN)) < 0) {
190  av_log(tctx, AV_LOG_ERROR, "Failed to set option '%s' with value '%s' provided to textformat context\n",
191  opt->key, opt->value);
192  av_dict_free(&opts);
193  goto fail;
194  }
195  }
196 
197  av_dict_free(&opts);
198  }
199 
200  if (show_data_hash) {
201  if ((ret = av_hash_alloc(&tctx->hash, show_data_hash)) < 0) {
202  if (ret == AVERROR(EINVAL)) {
203  const char *n;
204  av_log(NULL, AV_LOG_ERROR, "Unknown hash algorithm '%s'\nKnown algorithms:", show_data_hash);
205  for (i = 0; (n = av_hash_names(i)); i++)
206  av_log(NULL, AV_LOG_ERROR, " %s", n);
207  av_log(NULL, AV_LOG_ERROR, "\n");
208  }
209  return ret;
210  }
211  }
212 
213  /* validate replace string */
214  {
215  const uint8_t *p = tctx->string_validation_replacement;
216  const uint8_t *endp = p + strlen(p);
217  while (*p) {
218  const uint8_t *p0 = p;
219  int32_t code;
221  if (ret < 0) {
222  AVBPrint bp;
224  bprint_bytes(&bp, p0, p-p0),
225  av_log(tctx, AV_LOG_ERROR,
226  "Invalid UTF8 sequence %s found in string validation replace '%s'\n",
227  bp.str, tctx->string_validation_replacement);
228  return ret;
229  }
230  }
231  }
232 
233  for (i = 0; i < SECTION_MAX_NB_LEVELS; i++)
235 
236  if (tctx->formatter->init)
237  ret = tctx->formatter->init(tctx);
238  if (ret < 0)
239  goto fail;
240 
241  *ptctx = tctx;
242 
243  return 0;
244 
245 fail:
246  avtext_context_close(&tctx);
247  return ret;
248 }
249 
250 /* Temporary definitions during refactoring */
251 static const char unit_second_str[] = "s" ;
252 static const char unit_hertz_str[] = "Hz" ;
253 static const char unit_byte_str[] = "byte" ;
254 static const char unit_bit_per_second_str[] = "bit/s";
255 
256 
258  const void *data,
259  int section_id)
260 {
261  tctx->level++;
263 
264  tctx->nb_item[tctx->level] = 0;
265  memset(tctx->nb_item_type[tctx->level], 0, sizeof(tctx->nb_item_type[tctx->level]));
266  tctx->section[tctx->level] = &tctx->sections[section_id];
267 
268  if (tctx->formatter->print_section_header)
269  tctx->formatter->print_section_header(tctx, data);
270 }
271 
273 {
274  int section_id = tctx->section[tctx->level]->id;
275  int parent_section_id = tctx->level ?
276  tctx->section[tctx->level-1]->id : SECTION_ID_NONE;
277 
278  if (parent_section_id != SECTION_ID_NONE) {
279  tctx->nb_item[tctx->level - 1]++;
280  tctx->nb_item_type[tctx->level - 1][section_id]++;
281  }
282 
283  if (tctx->formatter->print_section_footer)
284  tctx->formatter->print_section_footer(tctx);
285  tctx->level--;
286 }
287 
289  const char *key, int64_t val)
290 {
291  const struct AVTextFormatSection *section = tctx->section[tctx->level];
292 
293  if (section->show_all_entries || av_dict_get(section->entries_to_show, key, NULL, 0)) {
294  tctx->formatter->print_integer(tctx, key, val);
295  tctx->nb_item[tctx->level]++;
296  }
297 }
298 
299 static inline int validate_string(AVTextFormatContext *tctx, char **dstp, const char *src)
300 {
301  const uint8_t *p, *endp;
302  AVBPrint dstbuf;
303  int invalid_chars_nb = 0, ret = 0;
304 
306 
307  endp = src + strlen(src);
308  for (p = src; *p;) {
309  uint32_t code;
310  int invalid = 0;
311  const uint8_t *p0 = p;
312 
313  if (av_utf8_decode(&code, &p, endp, tctx->string_validation_utf8_flags) < 0) {
314  AVBPrint bp;
316  bprint_bytes(&bp, p0, p-p0);
317  av_log(tctx, AV_LOG_DEBUG,
318  "Invalid UTF-8 sequence %s found in string '%s'\n", bp.str, src);
319  invalid = 1;
320  }
321 
322  if (invalid) {
323  invalid_chars_nb++;
324 
325  switch (tctx->string_validation) {
327  av_log(tctx, AV_LOG_ERROR,
328  "Invalid UTF-8 sequence found in string '%s'\n", src);
330  goto end;
331  break;
332 
334  av_bprintf(&dstbuf, "%s", tctx->string_validation_replacement);
335  break;
336  }
337  }
338 
340  av_bprint_append_data(&dstbuf, p0, p-p0);
341  }
342 
343  if (invalid_chars_nb && tctx->string_validation == AV_TEXTFORMAT_STRING_VALIDATION_REPLACE) {
344  av_log(tctx, AV_LOG_WARNING,
345  "%d invalid UTF-8 sequence(s) found in string '%s', replaced with '%s'\n",
346  invalid_chars_nb, src, tctx->string_validation_replacement);
347  }
348 
349 end:
350  av_bprint_finalize(&dstbuf, dstp);
351  return ret;
352 }
353 
354 struct unit_value {
355  union { double d; int64_t i; } val;
356  const char *unit;
357 };
358 
359 static char *value_string(AVTextFormatContext *tctx, char *buf, int buf_size, struct unit_value uv)
360 {
361  double vald;
362  int64_t vali;
363  int show_float = 0;
364 
365  if (uv.unit == unit_second_str) {
366  vald = uv.val.d;
367  show_float = 1;
368  } else {
369  vald = vali = uv.val.i;
370  }
371 
373  double secs;
374  int hours, mins;
375  secs = vald;
376  mins = (int)secs / 60;
377  secs = secs - mins * 60;
378  hours = mins / 60;
379  mins %= 60;
380  snprintf(buf, buf_size, "%d:%02d:%09.6f", hours, mins, secs);
381  } else {
382  const char *prefix_string = "";
383 
384  if (tctx->use_value_prefix && vald > 1) {
385  int64_t index;
386 
387  if (uv.unit == unit_byte_str && tctx->use_byte_value_binary_prefix) {
388  index = (int64_t) (log2(vald)) / 10;
390  vald /= si_prefixes[index].bin_val;
391  prefix_string = si_prefixes[index].bin_str;
392  } else {
393  index = (int64_t) (log10(vald)) / 3;
395  vald /= si_prefixes[index].dec_val;
396  prefix_string = si_prefixes[index].dec_str;
397  }
398  vali = vald;
399  }
400 
401  if (show_float || (tctx->use_value_prefix && vald != (int64_t)vald))
402  snprintf(buf, buf_size, "%f", vald);
403  else
404  snprintf(buf, buf_size, "%"PRId64, vali);
405  av_strlcatf(buf, buf_size, "%s%s%s", *prefix_string || tctx->show_value_unit ? " " : "",
406  prefix_string, tctx->show_value_unit ? uv.unit : "");
407  }
408 
409  return buf;
410 }
411 
412 
413 void avtext_print_unit_int(AVTextFormatContext *tctx, const char *key, int value, const char *unit)
414 {
415  char val_str[128];
416  struct unit_value uv;
417  uv.val.i = value;
418  uv.unit = unit;
419  avtext_print_string(tctx, key, value_string(tctx, val_str, sizeof(val_str), uv), 0);
420 }
421 
422 
423 int avtext_print_string(AVTextFormatContext *tctx, const char *key, const char *val, int flags)
424 {
425  const struct AVTextFormatSection *section = tctx->section[tctx->level];
426  int ret = 0;
427 
432  return 0;
433 
434  if (section->show_all_entries || av_dict_get(section->entries_to_show, key, NULL, 0)) {
436  char *key1 = NULL, *val1 = NULL;
437  ret = validate_string(tctx, &key1, key);
438  if (ret < 0) goto end;
439  ret = validate_string(tctx, &val1, val);
440  if (ret < 0) goto end;
441  tctx->formatter->print_string(tctx, key1, val1);
442  end:
443  if (ret < 0) {
444  av_log(tctx, AV_LOG_ERROR,
445  "Invalid key=value string combination %s=%s in section %s\n",
446  key, val, section->unique_name);
447  }
448  av_free(key1);
449  av_free(val1);
450  } else {
451  tctx->formatter->print_string(tctx, key, val);
452  }
453 
454  tctx->nb_item[tctx->level]++;
455  }
456 
457  return ret;
458 }
459 
461  const char *key, AVRational q, char sep)
462 {
463  AVBPrint buf;
465  av_bprintf(&buf, "%d%c%d", q.num, sep, q.den);
466  avtext_print_string(tctx, key, buf.str, 0);
467 }
468 
469 void avtext_print_time(AVTextFormatContext *tctx, const char *key,
470  int64_t ts, const AVRational *time_base, int is_duration)
471 {
472  char buf[128];
473 
474  if ((!is_duration && ts == AV_NOPTS_VALUE) || (is_duration && ts == 0)) {
476  } else {
477  double d = ts * av_q2d(*time_base);
478  struct unit_value uv;
479  uv.val.d = d;
480  uv.unit = unit_second_str;
481  value_string(tctx, buf, sizeof(buf), uv);
482  avtext_print_string(tctx, key, buf, 0);
483  }
484 }
485 
486 void avtext_print_ts(AVTextFormatContext *tctx, const char *key, int64_t ts, int is_duration)
487 {
488  if ((!is_duration && ts == AV_NOPTS_VALUE) || (is_duration && ts == 0)) {
490  } else {
491  avtext_print_integer(tctx, key, ts);
492  }
493 }
494 
496  const uint8_t *data, int size)
497 {
498  AVBPrint bp;
499  int offset = 0, l, i;
500 
502  av_bprintf(&bp, "\n");
503  while (size) {
504  av_bprintf(&bp, "%08x: ", offset);
505  l = FFMIN(size, 16);
506  for (i = 0; i < l; i++) {
507  av_bprintf(&bp, "%02x", data[i]);
508  if (i & 1)
509  av_bprintf(&bp, " ");
510  }
511  av_bprint_chars(&bp, ' ', 41 - 2 * i - i / 2);
512  for (i = 0; i < l; i++)
513  av_bprint_chars(&bp, data[i] - 32U < 95 ? data[i] : '.', 1);
514  av_bprintf(&bp, "\n");
515  offset += l;
516  data += l;
517  size -= l;
518  }
519  avtext_print_string(tctx, name, bp.str, 0);
520  av_bprint_finalize(&bp, NULL);
521 }
522 
524  const uint8_t *data, int size)
525 {
526  char *p, buf[AV_HASH_MAX_SIZE * 2 + 64] = { 0 };
527 
528  if (!tctx->hash)
529  return;
530  av_hash_init(tctx->hash);
531  av_hash_update(tctx->hash, data, size);
532  snprintf(buf, sizeof(buf), "%s:", av_hash_get_name(tctx->hash));
533  p = buf + strlen(buf);
534  av_hash_final_hex(tctx->hash, p, buf + sizeof(buf) - p);
535  avtext_print_string(tctx, name, buf, 0);
536 }
537 
539  uint8_t *data, int size, const char *format,
540  int columns, int bytes, int offset_add)
541 {
542  AVBPrint bp;
543  int offset = 0, l, i;
544 
546  av_bprintf(&bp, "\n");
547  while (size) {
548  av_bprintf(&bp, "%08x: ", offset);
549  l = FFMIN(size, columns);
550  for (i = 0; i < l; i++) {
551  if (bytes == 1) av_bprintf(&bp, format, *data);
552  else if (bytes == 2) av_bprintf(&bp, format, AV_RN16(data));
553  else if (bytes == 4) av_bprintf(&bp, format, AV_RN32(data));
554  data += bytes;
555  size --;
556  }
557  av_bprintf(&bp, "\n");
558  offset += offset_add;
559  }
560  avtext_print_string(tctx, name, bp.str, 0);
561  av_bprint_finalize(&bp, NULL);
562 }
563 
564 static const char *writercontext_get_writer_name(void *p)
565 {
566  AVTextWriterContext *wctx = p;
567  return wctx->writer->name;
568 }
569 
570 static void *writercontext_child_next(void *obj, void *prev)
571 {
572  AVTextFormatContext *ctx = obj;
573  if (!prev && ctx->formatter && ctx->formatter->priv_class && ctx->priv)
574  return ctx->priv;
575  return NULL;
576 }
577 
578 static const AVClass textwriter_class = {
579  .class_name = "AVTextWriterContext",
580  .item_name = writercontext_get_writer_name,
581  .version = LIBAVUTIL_VERSION_INT,
582  .child_next = writercontext_child_next,
583 };
584 
585 
587 {
588  AVTextWriterContext *wctx = *pwctx;
589  int ret = 0;
590 
591  if (!wctx)
592  return EINVAL;
593 
594  if (wctx->writer->uninit)
595  wctx->writer->uninit(wctx);
596  if (wctx->writer->priv_class)
597  av_opt_free(wctx->priv);
598  av_freep(&wctx->priv);
599  av_freep(pwctx);
600  return ret;
601 }
602 
603 
605 {
606  AVTextWriterContext *wctx;
607  int ret = 0;
608 
609  if (!(wctx = av_mallocz(sizeof(AVTextWriterContext)))) {
610  ret = AVERROR(ENOMEM);
611  goto fail;
612  }
613 
614  if (!(wctx->priv = av_mallocz(writer->priv_size))) {
615  ret = AVERROR(ENOMEM);
616  goto fail;
617  }
618 
619  if (writer->priv_class) {
620  void *priv_ctx = wctx->priv;
621  *(const AVClass **)priv_ctx = writer->priv_class;
622  av_opt_set_defaults(priv_ctx);
623  }
624 
625  wctx->class = &textwriter_class;
626  wctx->writer = writer;
627 
628  av_opt_set_defaults(wctx);
629 
630 
631  if (wctx->writer->init)
632  ret = wctx->writer->init(wctx);
633  if (ret < 0)
634  goto fail;
635 
636  *pwctx = wctx;
637 
638  return 0;
639 
640 fail:
642  return ret;
643 }
644 
646 static void formatters_register_all(void)
647 {
648  static int initialized;
649 
650  if (initialized)
651  return;
652  initialized = 1;
653 
661 }
662 
664 {
666 
667  for (int i = 0; registered_formatters[i]; i++)
668  if (!strcmp(registered_formatters[i]->name, name))
669  return registered_formatters[i];
670 
671  return NULL;
672 }
AV_OPT_SEARCH_CHILDREN
#define AV_OPT_SEARCH_CHILDREN
Search in possible children of the given object first.
Definition: opt.h:605
flags
const SwsFlags flags[]
Definition: swscale.c:61
validate_string
static int validate_string(AVTextFormatContext *tctx, char **dstp, const char *src)
Definition: avtextformat.c:299
avtext_print_time
void avtext_print_time(AVTextFormatContext *tctx, const char *key, int64_t ts, const AVRational *time_base, int is_duration)
Definition: avtextformat.c:469
AVTextWriter::init
int(* init)(AVTextWriterContext *wctx)
Definition: avtextwriters.h:40
av_utf8_decode
int av_utf8_decode(int32_t *codep, const uint8_t **bufp, const uint8_t *buf_end, unsigned int flags)
Read and decode a single UTF-8 code point (character) from the buffer in *buf, and update *buf to poi...
Definition: avstring.c:368
writercontext_get_writer_name
static const char * writercontext_get_writer_name(void *p)
Definition: avtextformat.c:564
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:215
AV_BPRINT_SIZE_UNLIMITED
#define AV_BPRINT_SIZE_UNLIMITED
use_byte_value_binary_prefix
static int use_byte_value_binary_prefix
Definition: ffprobe.c:131
AV_TEXTFORMAT_PRINT_STRING_OPTIONAL
#define AV_TEXTFORMAT_PRINT_STRING_OPTIONAL
Definition: avtextformat.h:123
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
avtext_print_ts
void avtext_print_ts(AVTextFormatContext *tctx, const char *key, int64_t ts, int is_duration)
Definition: avtextformat.c:486
av_clip
#define av_clip
Definition: common.h:100
av_opt_set_defaults
void av_opt_set_defaults(void *s)
Set the values of all AVOption fields to their default values.
Definition: opt.c:1678
AVTextFormatSection::entries_to_show
AVDictionary * entries_to_show
Definition: avtextformat.h:52
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
unit_value::i
int64_t i
Definition: avtextformat.c:355
textcontext_options
static const AVOption textcontext_options[]
Definition: avtextformat.c:65
opt.h
AVTextFormatContext::section
const struct AVTextFormatSection * section[SECTION_MAX_NB_LEVELS]
section per each level
Definition: avtextformat.h:106
AVTextWriter::priv_size
int priv_size
private size for the writer private class
Definition: avtextwriters.h:37
av_bprint_init
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition: bprint.c:69
AV_HASH_MAX_SIZE
#define AV_HASH_MAX_SIZE
Maximum value that av_hash_get_size() will currently return.
Definition: hash.h:156
AVTextFormatContext::nb_item_type
unsigned int nb_item_type[SECTION_MAX_NB_LEVELS][SECTION_MAX_NB_SECTIONS]
Definition: avtextformat.h:103
int64_t
long long int64_t
Definition: coverity.c:34
AV_RN16
#define AV_RN16(p)
Definition: intreadwrite.h:356
avtextformatter_compact
const AVTextFormatter avtextformatter_compact
Definition: tf_compact.c:241
AV_TEXTFORMAT_STRING_VALIDATION_NB
@ AV_TEXTFORMAT_STRING_VALIDATION_NB
Definition: avtextformat.h:66
avtext_print_data_hash
void avtext_print_data_hash(AVTextFormatContext *tctx, const char *name, const uint8_t *data, int size)
Definition: avtextformat.c:523
AVOption
AVOption.
Definition: opt.h:429
data
const char data[16]
Definition: mxf.c:149
AVTextFormatContext::show_value_unit
int show_value_unit
Definition: avtextformat.h:111
AVTextWriterContext
Definition: avtextwriters.h:47
avtextformat.h
AVTextFormatContext
Definition: avtextformat.h:88
AVTextWriterContext::priv
void * priv
private data for use by the writer
Definition: avtextwriters.h:51
AVDictionary
Definition: dict.c:32
av_strlcatf
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
Definition: avstring.c:103
textcontext_class
static const AVClass textcontext_class
Definition: avtextformat.c:86
AVTextFormatSection::id
int id
unique id identifying a section
Definition: avtextformat.h:38
AVTextFormatContext::level
int level
current level, starting from 0
Definition: avtextformat.h:99
show_optional_fields
static int show_optional_fields
Definition: ffprobe.c:138
macros.h
fail
#define fail()
Definition: checkasm.h:194
av_hash_get_name
const char * av_hash_get_name(const AVHashContext *ctx)
Definition: hash.c:104
textcontext_get_formatter_name
static const char * textcontext_get_formatter_name(void *p)
Definition: avtextformat.c:57
av_opt_free
void av_opt_free(void *obj)
Free all allocated objects in obj.
Definition: opt.c:1949
AV_BPRINT_SIZE_AUTOMATIC
#define AV_BPRINT_SIZE_AUTOMATIC
val
static double val(void *priv, double ch)
Definition: aeval.c:77
si_prefixes
static const struct @11 si_prefixes[]
AVTextFormatSection::show_all_entries
int show_all_entries
Definition: avtextformat.h:54
av_opt_set
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
Definition: opt.c:835
AV_TEXTFORMAT_PRINT_STRING_VALIDATE
#define AV_TEXTFORMAT_PRINT_STRING_VALIDATE
Definition: avtextformat.h:124
AVRational::num
int num
Numerator.
Definition: rational.h:59
avtext_print_integer
void avtext_print_integer(AVTextFormatContext *tctx, const char *key, int64_t val)
Definition: avtextformat.c:288
AVTextFormatContext::writer
AVTextWriterContext * writer
the AVTextWriterContext
Definition: avtextformat.h:91
avassert.h
SECTION_ID_NONE
#define SECTION_ID_NONE
Definition: avtextformat.c:37
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
av_dict_get
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition: dict.c:60
avtextformatter_default
const AVTextFormatter avtextformatter_default
Definition: tf_default.c:136
unit_bit_per_second_str
static const char unit_bit_per_second_str[]
Definition: avtextformat.c:254
AVTextFormatContext::sections
const struct AVTextFormatSection * sections
array containing all sections
Definition: avtextformat.h:96
initialized
static int initialized
Definition: vaapi_transcode.c:43
AVTextFormatter::print_string
void(* print_string)(AVTextFormatContext *tctx, const char *, const char *)
Definition: avtextformat.h:81
textcontext_child_next
static void * textcontext_child_next(void *obj, void *prev)
Definition: avtextformat.c:78
intreadwrite.h
AVTextFormatter
Definition: avtextformat.h:69
SECTION_MAX_NB_SECTIONS
#define SECTION_MAX_NB_SECTIONS
Definition: avtextformat.h:86
format
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample format(the sample packing is implied by the sample format) and sample rate. The lists are not just lists
AVTextWriterContext::class
const AVClass * class
class of the writer
Definition: avtextwriters.h:48
AVDictionaryEntry::key
char * key
Definition: dict.h:91
avtextwriter_context_close
int avtextwriter_context_close(AVTextWriterContext **pwctx)
Definition: avtextformat.c:586
AVTextFormatSection
Definition: avtextformat.h:37
av_q2d
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition: rational.h:104
av_hash_alloc
int av_hash_alloc(AVHashContext **ctx, const char *name)
Allocate a hash context for the algorithm specified by name.
Definition: hash.c:114
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:230
ctx
AVFormatContext * ctx
Definition: movenc.c:49
avtextformatter_ini
const AVTextFormatter avtextformatter_ini
Definition: tf_ini.c:152
limits.h
value_string
static char * value_string(AVTextFormatContext *tctx, char *buf, int buf_size, struct unit_value uv)
Definition: avtextformat.c:359
AVTextWriter::priv_class
const AVClass * priv_class
private class of the writer, if any
Definition: avtextwriters.h:36
AVTextFormatContext::priv
void * priv
private data for use by the filter
Definition: avtextformat.h:94
key
const char * key
Definition: hwcontext_opencl.c:189
bin_str
const char * bin_str
Definition: avtextformat.c:46
AVTextFormatter::priv_size
int priv_size
private size for the formatter context
Definition: avtextformat.h:71
AVTextFormatContext::use_byte_value_binary_prefix
int use_byte_value_binary_prefix
Definition: avtextformat.h:113
dec_val
double dec_val
Definition: avtextformat.c:45
AVTextFormatSection::unique_name
const char * unique_name
unique section name, in case the name is ambiguous
Definition: avtextformat.h:51
opts
AVDictionary * opts
Definition: movenc.c:51
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:75
NULL
#define NULL
Definition: coverity.c:32
avtext_print_string
int avtext_print_string(AVTextFormatContext *tctx, const char *key, const char *val, int flags)
Definition: avtextformat.c:423
av_hash_names
const char * av_hash_names(int i)
Get the names of available hash algorithms.
Definition: hash.c:98
unit_second_str
static const char unit_second_str[]
Definition: avtextformat.c:251
av_hash_init
void av_hash_init(AVHashContext *ctx)
Initialize or reset a hash context.
Definition: hash.c:151
SHOW_OPTIONAL_FIELDS_AUTO
#define SHOW_OPTIONAL_FIELDS_AUTO
Definition: avtextformat.c:39
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
bprint_bytes
static void bprint_bytes(AVBPrint *bp, const uint8_t *ubuf, size_t ubuf_size)
Definition: avtextformat.c:94
AV_RN32
#define AV_RN32(p)
Definition: intreadwrite.h:360
AVTextWriter::name
const char * name
Definition: avtextwriters.h:38
AVTextFormatter::print_section_header
void(* print_section_header)(AVTextFormatContext *tctx, const void *data)
Definition: avtextformat.h:77
AV_TEXTFORMAT_STRING_VALIDATION_IGNORE
@ AV_TEXTFORMAT_STRING_VALIDATION_IGNORE
Definition: avtextformat.h:65
AVTextFormatContext::formatter
const AVTextFormatter * formatter
the AVTextFormatter of which this is an instance
Definition: avtextformat.h:90
av_hash_update
void av_hash_update(AVHashContext *ctx, const uint8_t *src, size_t len)
Update a hash context with additional data.
Definition: hash.c:172
avtext_get_formatter_by_name
const AVTextFormatter * avtext_get_formatter_by_name(const char *name)
Definition: avtextformat.c:663
index
int index
Definition: gxfenc.c:90
SECTION_MAX_NB_LEVELS
#define SECTION_MAX_NB_LEVELS
Definition: avtextformat.h:85
av_hash_freep
void av_hash_freep(AVHashContext **ctx)
Free hash context and set hash context pointer to NULL.
Definition: hash.c:248
error.h
formatters_register_all
static void formatters_register_all(void)
Definition: avtextformat.c:646
show_value_unit
static int show_value_unit
Definition: ffprobe.c:129
dec_str
const char * dec_str
Definition: avtextformat.c:47
avtextformatter_flat
const AVTextFormatter avtextformatter_flat
Definition: tf_flat.c:165
avtextwriter_context_open
int avtextwriter_context_open(AVTextWriterContext **pwctx, const AVTextWriter *writer)
Definition: avtextformat.c:604
AVTextWriter
Definition: avtextwriters.h:35
unit_hertz_str
static const char unit_hertz_str[]
Definition: avtextformat.c:252
AV_TEXTFORMAT_STRING_VALIDATION_FAIL
@ AV_TEXTFORMAT_STRING_VALIDATION_FAIL
Definition: avtextformat.h:63
av_bprint_finalize
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition: bprint.c:240
AVTextFormatter::name
const char * name
Definition: avtextformat.h:72
avtext_print_section_footer
void avtext_print_section_footer(AVTextFormatContext *tctx)
Definition: avtextformat.c:272
AVTextWriterContext::writer
const AVTextWriter * writer
Definition: avtextwriters.h:49
size
int size
Definition: twinvq_data.h:10344
avtext_context_open
int avtext_context_open(AVTextFormatContext **ptctx, const AVTextFormatter *formatter, AVTextWriterContext *writer_context, const char *args, const struct AVTextFormatSection *sections, int nb_sections, int show_value_unit, int use_value_prefix, int use_byte_value_binary_prefix, int use_value_sexagesimal_format, int show_optional_fields, char *show_data_hash)
Definition: avtextformat.c:128
AVTextFormatContext::use_value_sexagesimal_format
int use_value_sexagesimal_format
Definition: avtextformat.h:114
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
AVTextFormatContext::section_pbuf
AVBPrint section_pbuf[SECTION_MAX_NB_LEVELS]
generic print buffer dedicated to each section, used by various formatters
Definition: avtextformat.h:107
use_value_prefix
static int use_value_prefix
Definition: ffprobe.c:130
unit_value
Definition: avtextformat.c:354
SHOW_OPTIONAL_FIELDS_NEVER
#define SHOW_OPTIONAL_FIELDS_NEVER
Definition: avtextformat.c:40
AVTextFormatContext::show_optional_fields
int show_optional_fields
Definition: avtextformat.h:110
AVTextFormatter::flags
int flags
a combination or AV_TEXTFORMAT__FLAG_*
Definition: avtextformat.h:82
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
av_dict_free
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition: dict.c:233
textwriter_class
static const AVClass textwriter_class
Definition: avtextformat.c:578
avtext_print_rational
void avtext_print_rational(AVTextFormatContext *tctx, const char *key, AVRational q, char sep)
Definition: avtextformat.c:460
unit_value::unit
const char * unit
Definition: avtextformat.c:356
AVTextFormatContext::class
const AVClass * class
class of the formatter
Definition: avtextformat.h:89
bprint.h
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
code
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
Definition: filter_design.txt:178
registered_formatters
static const AVTextFormatter * registered_formatters[7+1]
Definition: avtextformat.c:645
unit_value::val
union unit_value::@12 val
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
avtextformatter_xml
const AVTextFormatter avtextformatter_xml
Definition: tf_xml.c:210
AVTextFormatter::uninit
void(* uninit)(AVTextFormatContext *tctx)
Definition: avtextformat.h:75
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:256
AVTextWriter::uninit
void(* uninit)(AVTextWriterContext *wctx)
Definition: avtextwriters.h:41
AVTextFormatContext::string_validation_utf8_flags
unsigned int string_validation_utf8_flags
Definition: avtextformat.h:120
writercontext_child_next
static void * writercontext_child_next(void *obj, void *prev)
Definition: avtextformat.c:570
use_value_sexagesimal_format
static int use_value_sexagesimal_format
Definition: ffprobe.c:132
avtextformatter_json
const AVTextFormatter avtextformatter_json
Definition: tf_json.c:204
log2
#define log2(x)
Definition: libm.h:406
AVTextFormatter::print_section_footer
void(* print_section_footer)(AVTextFormatContext *tctx)
Definition: avtextformat.h:78
sections
static struct AVTextFormatSection sections[]
Definition: ffprobe.c:251
ret
ret
Definition: filter_design.txt:187
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:80
av_bprintf
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition: bprint.c:99
U
#define U(x)
Definition: vpx_arith.h:37
hash.h
AVTextFormatter::priv_class
const AVClass * priv_class
private class of the formatter, if any
Definition: avtextformat.h:70
AVTextFormatter::print_integer
void(* print_integer)(AVTextFormatContext *tctx, const char *, int64_t)
Definition: avtextformat.h:79
avtext_print_integers
void avtext_print_integers(AVTextFormatContext *tctx, const char *name, uint8_t *data, int size, const char *format, int columns, int bytes, int offset_add)
Definition: avtextformat.c:538
AVTextFormatContext::string_validation
int string_validation
Definition: avtextformat.h:118
AVRational::den
int den
Denominator.
Definition: rational.h:60
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
av_dict_parse_string
int av_dict_parse_string(AVDictionary **pm, const char *str, const char *key_val_sep, const char *pairs_sep, int flags)
Parse the key/value pairs list and add the parsed entries to a dictionary.
Definition: dict.c:210
AVTextFormatter::init
int(* init)(AVTextFormatContext *tctx)
Definition: avtextformat.h:74
unit_byte_str
static const char unit_byte_str[]
Definition: avtextformat.c:253
AVTextFormatContext::use_value_prefix
int use_value_prefix
Definition: avtextformat.h:112
mem.h
avtextformatter_csv
const AVTextFormatter avtextformatter_csv
Definition: tf_compact.c:272
av_hash_final_hex
void av_hash_final_hex(struct AVHashContext *ctx, uint8_t *dst, int size)
Finalize a hash context and store the hexadecimal representation of the actual hash value as a string...
Definition: hash.c:225
AVTextFormatContext::nb_item
unsigned int nb_item[SECTION_MAX_NB_LEVELS]
number of the item printed in the given section, starting from 0
Definition: avtextformat.h:102
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVDictionaryEntry
Definition: dict.h:90
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
int32_t
int32_t
Definition: audioconvert.c:56
OFFSET
#define OFFSET(x)
Definition: avtextformat.c:63
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
av_bprint_chars
void av_bprint_chars(AVBPrint *buf, char c, unsigned n)
Append char c n times to a print buffer.
Definition: bprint.c:145
AV_TEXTFORMAT_STRING_VALIDATION_REPLACE
@ AV_TEXTFORMAT_STRING_VALIDATION_REPLACE
Definition: avtextformat.h:64
AVDictionaryEntry::value
char * value
Definition: dict.h:92
show_data_hash
static char * show_data_hash
Definition: ffprobe.c:142
bin_val
double bin_val
Definition: avtextformat.c:44
AV_TEXTFORMAT_FLAG_SUPPORTS_OPTIONAL_FIELDS
#define AV_TEXTFORMAT_FLAG_SUPPORTS_OPTIONAL_FIELDS
Definition: avtextformat.h:59
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
Definition: opt.h:276
avtext_print_unit_int
void avtext_print_unit_int(AVTextFormatContext *tctx, const char *key, int value, const char *unit)
Definition: avtextformat.c:413
unit_value::d
double d
Definition: avtextformat.c:355
avtext_context_close
int avtext_context_close(AVTextFormatContext **ptctx)
Definition: avtextformat.c:102
av_bprint_append_data
void av_bprint_append_data(AVBPrint *buf, const char *data, unsigned size)
Append data to a print buffer.
Definition: bprint.c:163
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
snprintf
#define snprintf
Definition: snprintf.h:34
avtext_print_data
void avtext_print_data(AVTextFormatContext *tctx, const char *name, const uint8_t *data, int size)
Definition: avtextformat.c:495
av_dict_iterate
const AVDictionaryEntry * av_dict_iterate(const AVDictionary *m, const AVDictionaryEntry *prev)
Iterate over a dictionary.
Definition: dict.c:42
src
#define src
Definition: vp8dsp.c:248
AVTextFormatContext::nb_sections
int nb_sections
number of sections
Definition: avtextformat.h:97
AVTextFormatContext::hash
struct AVHashContext * hash
Definition: avtextformat.h:116
avtext_print_section_header
void avtext_print_section_header(AVTextFormatContext *tctx, const void *data, int section_id)
Definition: avtextformat.c:257
AVTextFormatContext::string_validation_replacement
char * string_validation_replacement
Definition: avtextformat.h:119