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/base64.h"
30 #include "libavutil/bprint.h"
31 #include "libavutil/error.h"
32 #include "libavutil/hash.h"
33 #include "libavutil/intreadwrite.h"
34 #include "libavutil/macros.h"
35 #include "libavutil/opt.h"
36 #include "avtextformat.h"
37 
38 #define SECTION_ID_NONE (-1)
39 
40 #define SHOW_OPTIONAL_FIELDS_AUTO (-1)
41 #define SHOW_OPTIONAL_FIELDS_NEVER 0
42 #define SHOW_OPTIONAL_FIELDS_ALWAYS 1
43 
44 static const struct {
45  double bin_val;
46  double dec_val;
47  char bin_str[4];
48  char dec_str[4];
49 } si_prefixes[] = {
50  { 1.0, 1.0, "", "" },
51  { 1.024e3, 1e3, "Ki", "K" },
52  { 1.048576e6, 1e6, "Mi", "M" },
53  { 1.073741824e9, 1e9, "Gi", "G" },
54  { 1.099511627776e12, 1e12, "Ti", "T" },
55  { 1.125899906842624e15, 1e15, "Pi", "P" },
56 };
57 
58 static const char *textcontext_get_formatter_name(void *p)
59 {
60  AVTextFormatContext *tctx = p;
61  return tctx->formatter->name;
62 }
63 
64 #define OFFSET(x) offsetof(AVTextFormatContext, x)
65 
66 static const AVOption textcontext_options[] = {
67  { "string_validation", "set string validation mode",
68  OFFSET(string_validation), AV_OPT_TYPE_INT, { .i64 = AV_TEXTFORMAT_STRING_VALIDATION_REPLACE }, 0, AV_TEXTFORMAT_STRING_VALIDATION_NB - 1, .unit = "sv" },
69  { "sv", "set string validation mode",
70  OFFSET(string_validation), AV_OPT_TYPE_INT, { .i64 = AV_TEXTFORMAT_STRING_VALIDATION_REPLACE }, 0, AV_TEXTFORMAT_STRING_VALIDATION_NB - 1, .unit = "sv" },
71  { "ignore", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_TEXTFORMAT_STRING_VALIDATION_IGNORE }, .unit = "sv" },
72  { "replace", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_TEXTFORMAT_STRING_VALIDATION_REPLACE }, .unit = "sv" },
73  { "fail", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_TEXTFORMAT_STRING_VALIDATION_FAIL }, .unit = "sv" },
74  { "string_validation_replacement", "set string validation replacement string", OFFSET(string_validation_replacement), AV_OPT_TYPE_STRING, { .str = "" } },
75  { "svr", "set string validation replacement string", OFFSET(string_validation_replacement), AV_OPT_TYPE_STRING, { .str = "\xEF\xBF\xBD" } },
76  { NULL }
77 };
78 
79 static void *textcontext_child_next(void *obj, void *prev)
80 {
81  AVTextFormatContext *ctx = obj;
82  if (!prev && ctx->formatter && ctx->formatter->priv_class && ctx->priv)
83  return ctx->priv;
84  return NULL;
85 }
86 
87 static const AVClass textcontext_class = {
88  .class_name = "AVTextContext",
89  .item_name = textcontext_get_formatter_name,
90  .option = textcontext_options,
91  .version = LIBAVUTIL_VERSION_INT,
92  .child_next = textcontext_child_next,
93 };
94 
95 static void bprint_bytes(AVBPrint *bp, const uint8_t *ubuf, size_t ubuf_size)
96 {
97  av_bprintf(bp, "0X");
98  for (unsigned i = 0; i < ubuf_size; i++)
99  av_bprintf(bp, "%02X", ubuf[i]);
100 }
101 
103 {
104  AVTextFormatContext *tctx = *ptctx;
105  int ret = 0;
106 
107  if (!tctx)
108  return AVERROR(EINVAL);
109 
110  av_hash_freep(&tctx->hash);
111 
112  if (tctx->formatter) {
113  if (tctx->formatter->uninit)
114  ret = tctx->formatter->uninit(tctx);
115  if (tctx->formatter->priv_class)
116  av_opt_free(tctx->priv);
117  }
118  for (int i = 0; i < SECTION_MAX_NB_LEVELS; i++)
120  av_freep(&tctx->priv);
121  av_opt_free(tctx);
122  av_freep(ptctx);
123  return ret;
124 }
125 
126 
127 int avtext_context_open(AVTextFormatContext **ptctx, const AVTextFormatter *formatter, AVTextWriterContext *writer_context, const char *args,
129 {
130  AVTextFormatContext *tctx;
131  int ret = 0;
132 
133  av_assert0(ptctx && formatter);
134 
135  if (!(tctx = av_mallocz(sizeof(AVTextFormatContext)))) {
136  ret = AVERROR(ENOMEM);
137  goto fail;
138  }
139 
140  for (int i = 0; i < SECTION_MAX_NB_LEVELS; i++)
142 
143  tctx->class = &textcontext_class;
144  av_opt_set_defaults(tctx);
145 
146  if (!(tctx->priv = av_mallocz(formatter->priv_size))) {
147  ret = AVERROR(ENOMEM);
148  goto fail;
149  }
150 
151  tctx->opts = options;
152 
153  if (nb_sections > SECTION_MAX_NB_SECTIONS) {
154  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);
155  ret = AVERROR(EINVAL);
156  goto fail;
157  }
158 
159  tctx->formatter = formatter;
160  tctx->level = -1;
161  tctx->sections = sections;
162  tctx->nb_sections = nb_sections;
163  tctx->writer = writer_context;
164 
165  if (formatter->priv_class) {
166  void *priv_ctx = tctx->priv;
167  *(const AVClass **)priv_ctx = formatter->priv_class;
168  av_opt_set_defaults(priv_ctx);
169  }
170 
171  /* convert options to dictionary */
172  if (args) {
174  const AVDictionaryEntry *opt = NULL;
175 
176  if ((ret = av_dict_parse_string(&opts, args, "=", ":", 0)) < 0) {
177  av_log(tctx, AV_LOG_ERROR, "Failed to parse option string '%s' provided to textformat context\n", args);
178  av_dict_free(&opts);
179  goto fail;
180  }
181 
182  while ((opt = av_dict_iterate(opts, opt))) {
183  if ((ret = av_opt_set(tctx, opt->key, opt->value, AV_OPT_SEARCH_CHILDREN)) < 0) {
184  av_log(tctx, AV_LOG_ERROR, "Failed to set option '%s' with value '%s' provided to textformat context\n",
185  opt->key, opt->value);
186  av_dict_free(&opts);
187  goto fail;
188  }
189  }
190 
191  av_dict_free(&opts);
192  }
193 
194  if (show_data_hash) {
195  if ((ret = av_hash_alloc(&tctx->hash, show_data_hash)) < 0) {
196  if (ret == AVERROR(EINVAL)) {
197  const char *n;
198  av_log(NULL, AV_LOG_ERROR, "Unknown hash algorithm '%s'\nKnown algorithms:", show_data_hash);
199  for (unsigned i = 0; (n = av_hash_names(i)); i++)
200  av_log(NULL, AV_LOG_ERROR, " %s", n);
201  av_log(NULL, AV_LOG_ERROR, "\n");
202  }
203  goto fail;
204  }
205  }
206 
207  /* validate replace string */
208  {
209  const uint8_t *p = (uint8_t *)tctx->string_validation_replacement;
210  const uint8_t *endp = p + strlen((const char *)p);
211  while (*p) {
212  const uint8_t *p0 = p;
213  int32_t code;
215  if (ret < 0) {
216  AVBPrint bp;
218  bprint_bytes(&bp, p0, p - p0);
219  av_log(tctx, AV_LOG_ERROR,
220  "Invalid UTF8 sequence %s found in string validation replace '%s'\n",
221  bp.str, tctx->string_validation_replacement);
222  goto fail;
223  }
224  }
225  }
226 
227  if (tctx->formatter->init)
228  ret = tctx->formatter->init(tctx);
229  if (ret < 0)
230  goto fail;
231 
232  *ptctx = tctx;
233 
234  return 0;
235 
236 fail:
237  avtext_context_close(&tctx);
238  return ret;
239 }
240 
241 static const char unit_second_str[] = "s";
242 
243 void avtext_print_section_header(AVTextFormatContext *tctx, const void *data, int section_id)
244 {
245  if (section_id < 0 || section_id >= tctx->nb_sections) {
246  av_log(tctx, AV_LOG_ERROR, "Invalid section_id for section_header: %d\n", section_id);
247  return;
248  }
249 
250  tctx->level++;
252 
253  tctx->nb_item[tctx->level] = 0;
254  memset(tctx->nb_item_type[tctx->level], 0, sizeof(tctx->nb_item_type[tctx->level]));
255  tctx->section[tctx->level] = &tctx->sections[section_id];
256 
257  if (tctx->formatter->print_section_header)
258  tctx->formatter->print_section_header(tctx, data);
259 }
260 
262 {
263  if (tctx->level < 0 || tctx->level >= SECTION_MAX_NB_LEVELS) {
264  av_log(tctx, AV_LOG_ERROR, "Invalid level for section_footer: %d\n", tctx->level);
265  return;
266  }
267 
268  int section_id = tctx->section[tctx->level]->id;
269  int parent_section_id = tctx->level ?
270  tctx->section[tctx->level - 1]->id : SECTION_ID_NONE;
271 
272  if (parent_section_id != SECTION_ID_NONE) {
273  tctx->nb_item[tctx->level - 1]++;
274  tctx->nb_item_type[tctx->level - 1][section_id]++;
275  }
276 
277  if (tctx->formatter->print_section_footer)
278  tctx->formatter->print_section_footer(tctx);
279  tctx->level--;
280 }
281 
283 {
284  av_assert0(tctx);
285 
287  return;
288 
292  return;
293 
294  av_assert0(key && tctx->level >= 0 && tctx->level < SECTION_MAX_NB_LEVELS);
295 
296  if (!tctx->opts.is_key_selected || tctx->opts.is_key_selected(tctx, key)) {
297  tctx->formatter->print_integer(tctx, key, val);
298  tctx->nb_item[tctx->level]++;
299  }
300 }
301 
302 static inline int validate_string(AVTextFormatContext *tctx, char **dstp, const char *src)
303 {
304  const uint8_t *p, *endp, *srcp = (const uint8_t *)src;
305  AVBPrint dstbuf;
306  AVBPrint invalid_seq;
307  int invalid_chars_nb = 0, ret = 0;
308 
309  *dstp = NULL;
311  av_bprint_init(&invalid_seq, 0, AV_BPRINT_SIZE_UNLIMITED);
312 
313  endp = srcp + strlen(src);
314  for (p = srcp; *p;) {
315  int32_t code;
316  int invalid = 0;
317  const uint8_t *p0 = p;
318 
319  if (av_utf8_decode(&code, &p, endp, tctx->string_validation_utf8_flags) < 0) {
320 
321  av_bprint_clear(&invalid_seq);
322 
323  bprint_bytes(&invalid_seq, p0, p - p0);
324 
325  av_log(tctx, AV_LOG_DEBUG, "Invalid UTF-8 sequence '%s' found in string '%s'\n", invalid_seq.str, src);
326  invalid = 1;
327  }
328 
329  if (invalid) {
330  invalid_chars_nb++;
331 
332  switch (tctx->string_validation) {
334  av_log(tctx, AV_LOG_ERROR, "Invalid UTF-8 sequence found in string '%s'\n", src);
336  goto end;
337 
339  av_bprintf(&dstbuf, "%s", tctx->string_validation_replacement);
340  break;
341  }
342  }
343 
345  av_bprint_append_data(&dstbuf, p0, p-p0);
346  }
347 
348  if (invalid_chars_nb && tctx->string_validation == AV_TEXTFORMAT_STRING_VALIDATION_REPLACE)
349  av_log(tctx, AV_LOG_WARNING,
350  "%d invalid UTF-8 sequence(s) found in string '%s', replaced with '%s'\n",
351  invalid_chars_nb, src, tctx->string_validation_replacement);
352 
353 end:
354  av_bprint_finalize(&dstbuf, dstp);
355  av_bprint_finalize(&invalid_seq, NULL);
356  return ret;
357 }
358 
359 struct unit_value {
360  union {
361  double d;
363  } val;
364 
366  const char *unit;
367 };
368 
369 static const char float_fmt_full[] = "%f";
370 static const char float_fmt_singledigit[] = "%.1f";
371 static char *value_string(const AVTextFormatContext *tctx, char *buf, int buf_size, struct unit_value uv)
372 {
373  double vald;
374  int64_t vali = 0;
375  const char *float_fmt = 0;
376 
378  vald = 20 * log10(uv.val.d);
379  float_fmt = float_fmt_singledigit;
380  } else if (uv.fmt >= AV_TEXTFORMAT_VALUE_FMT_DOUBLE) {
381  vald = uv.val.d;
382  float_fmt = float_fmt_full;
383  } else {
384  vald = (double)uv.val.i;
385  vali = uv.val.i;
386  }
387 
389  double secs;
390  int hours, mins;
391  secs = vald;
392  mins = (int)secs / 60;
393  secs = secs - mins * 60;
394  hours = mins / 60;
395  mins %= 60;
396  snprintf(buf, buf_size, "%d:%02d:%09.6f", hours, mins, secs);
397  } else {
398  const char *prefix_string = "";
399 
400  if (tctx->opts.use_value_prefix && vald > 1) {
401  int64_t index;
402 
404  index = (int64_t)(log2(vald) / 10);
406  vald /= si_prefixes[index].bin_val;
407  prefix_string = si_prefixes[index].bin_str;
408  } else {
409  index = (int64_t)(log10(vald) / 3);
411  vald /= si_prefixes[index].dec_val;
412  prefix_string = si_prefixes[index].dec_str;
413  }
414  vali = (int64_t)vald;
415  }
416 
417  if (float_fmt || (tctx->opts.use_value_prefix && vald != (int64_t)vald))
418  snprintf(buf, buf_size, float_fmt ? float_fmt : "%f", vald);
419  else
420  snprintf(buf, buf_size, "%"PRId64, vali);
421 
422  av_strlcatf(buf, buf_size, "%s%s%s", *prefix_string || tctx->opts.show_value_unit && uv.unit && *uv.unit ? " " : "",
423  prefix_string, tctx->opts.show_value_unit && uv.unit ? uv.unit : "");
424  }
425 
426  return buf;
427 }
428 
429 
430 void avtext_print_unit_integer(AVTextFormatContext *tctx, const char *key, int64_t val, AVTextFormatValueFormat fmt, const char *unit)
431 {
432  char val_str[128];
433  struct unit_value uv;
434 
436 
437  uv.val.i = val;
438  uv.fmt = fmt;
439  uv.unit = unit;
440  avtext_print_string(tctx, key, value_string(tctx, val_str, sizeof(val_str), uv), 0);
441 }
442 
443 
445 {
446  char val_str[128];
447  struct unit_value uv;
448 
450 
451  uv.val.d = val;
452  uv.fmt = fmt;
453  uv.unit = unit;
454  avtext_print_string(tctx, key, value_string(tctx, val_str, sizeof(val_str), uv), 0);
455 }
456 
457 int avtext_print_string(AVTextFormatContext *tctx, const char *key, const char *val, int flags)
458 {
459  const AVTextFormatSection *section;
460  int ret = 0;
461 
462  av_assert0(key && val && tctx->level >= 0 && tctx->level < SECTION_MAX_NB_LEVELS);
463 
464  section = tctx->section[tctx->level];
465 
467  return 0;
468 
472  return 0;
473 
474  if (!tctx->opts.is_key_selected || tctx->opts.is_key_selected(tctx, key)) {
476  char *key1 = NULL, *val1 = NULL;
477  ret = validate_string(tctx, &key1, key);
478  if (ret < 0) goto end;
479  ret = validate_string(tctx, &val1, val);
480  if (ret < 0) goto end;
481  tctx->formatter->print_string(tctx, key1, val1);
482  end:
483  if (ret < 0)
484  av_log(tctx, AV_LOG_ERROR,
485  "Invalid key=value string combination %s=%s in section %s\n",
486  key, val, section->unique_name);
487  av_free(key1);
488  av_free(val1);
489  } else {
490  tctx->formatter->print_string(tctx, key, val);
491  }
492 
493  tctx->nb_item[tctx->level]++;
494  }
495 
496  return ret;
497 }
498 
499 void avtext_print_rational(AVTextFormatContext *tctx, const char *key, AVRational q, char sep)
500 {
501  char buf[44];
502  snprintf(buf, sizeof(buf), "%d%c%d", q.num, sep, q.den);
503  avtext_print_string(tctx, key, buf, 0);
504 }
505 
506 void avtext_print_time(AVTextFormatContext *tctx, const char *key,
507  int64_t ts, const AVRational *time_base, int is_duration)
508 {
509  if ((!is_duration && ts == AV_NOPTS_VALUE) || (is_duration && ts == 0)) {
511  } else {
512  char buf[128];
513  double d = av_q2d(*time_base) * ts;
514  struct unit_value uv;
515  uv.val.d = d;
517  uv.unit = unit_second_str;
518  value_string(tctx, buf, sizeof(buf), uv);
519  avtext_print_string(tctx, key, buf, 0);
520  }
521 }
522 
523 void avtext_print_ts(AVTextFormatContext *tctx, const char *key, int64_t ts, int is_duration)
524 {
525  if ((!is_duration && ts == AV_NOPTS_VALUE) || (is_duration && ts == 0))
527  else
528  avtext_print_integer(tctx, key, ts, 0);
529 }
530 
531 static void print_data_xxd(AVBPrint *bp, const uint8_t *data, int size)
532 {
533  unsigned offset = 0;
534  int i;
535 
536  av_bprintf(bp, "\n");
537  while (size) {
538  av_bprintf(bp, "%08x: ", offset);
539  int l = FFMIN(size, 16);
540  for (i = 0; i < l; i++) {
541  av_bprintf(bp, "%02x", data[i]);
542  if (i & 1)
543  av_bprintf(bp, " ");
544  }
545  av_bprint_chars(bp, ' ', 41 - 2 * i - i / 2);
546  for (i = 0; i < l; i++)
547  av_bprint_chars(bp, data[i] - 32U < 95 ? data[i] : '.', 1);
548  av_bprintf(bp, "\n");
549  offset += l;
550  data += l;
551  size -= l;
552  }
553 }
554 
555 static void print_data_base64(AVBPrint *bp, const uint8_t *data, int size)
556 {
557  char buf[AV_BASE64_SIZE(60)];
558 
559  av_bprintf(bp, "\n");
560  while (size) {
561  int l = FFMIN(size, 60);
562  av_base64_encode(buf, sizeof(buf), data, l);
563  av_bprintf(bp, "%s\n", buf);
564  data += l;
565  size -= l;
566  }
567 }
568 void avtext_print_data(AVTextFormatContext *tctx, const char *key,
569  const uint8_t *data, int size)
570 {
571  AVBPrint bp;
573  switch (tctx->opts.data_dump_format) {
575  print_data_xxd(&bp, data, size);
576  break;
578  print_data_base64(&bp, data, size);
579  break;
580  default:
581  av_unreachable("Invalid data dump type");
582  }
583  avtext_print_string(tctx, key, bp.str, 0);
584  av_bprint_finalize(&bp, NULL);
585 }
586 
588  const uint8_t *data, int size)
589 {
590  char buf[AV_HASH_MAX_SIZE * 2 + 64] = { 0 };
591  int len;
592 
593  if (!tctx->hash)
594  return;
595 
596  av_hash_init(tctx->hash);
597  av_hash_update(tctx->hash, data, size);
598  len = snprintf(buf, sizeof(buf), "%s:", av_hash_get_name(tctx->hash));
599  av_hash_final_hex(tctx->hash, (uint8_t *)&buf[len], (int)sizeof(buf) - len);
600  avtext_print_string(tctx, key, buf, 0);
601 }
602 
603 static const char *writercontext_get_writer_name(void *p)
604 {
605  AVTextWriterContext *wctx = p;
606  return wctx->writer->name;
607 }
608 
609 static void *writercontext_child_next(void *obj, void *prev)
610 {
611  AVTextFormatContext *ctx = obj;
612  if (!prev && ctx->formatter && ctx->formatter->priv_class && ctx->priv)
613  return ctx->priv;
614  return NULL;
615 }
616 
617 static const AVClass textwriter_class = {
618  .class_name = "AVTextWriterContext",
619  .item_name = writercontext_get_writer_name,
620  .version = LIBAVUTIL_VERSION_INT,
621  .child_next = writercontext_child_next,
622 };
623 
624 
626 {
627  AVTextWriterContext *wctx = *pwctx;
628  int ret = 0;
629 
630  if (!wctx)
631  return AVERROR(EINVAL);
632 
633  if (wctx->writer) {
634  if (wctx->writer->uninit)
635  ret = wctx->writer->uninit(wctx);
636  if (wctx->writer->priv_class)
637  av_opt_free(wctx->priv);
638  }
639  av_freep(&wctx->priv);
640  av_freep(pwctx);
641  return ret;
642 }
643 
644 
646 {
647  AVTextWriterContext *wctx;
648  int ret = 0;
649 
650  if (!pwctx || !writer)
651  return AVERROR(EINVAL);
652 
653  if (!((wctx = av_mallocz(sizeof(AVTextWriterContext))))) {
654  ret = AVERROR(ENOMEM);
655  goto fail;
656  }
657 
658  if (writer->priv_size && !((wctx->priv = av_mallocz(writer->priv_size)))) {
659  ret = AVERROR(ENOMEM);
660  goto fail;
661  }
662 
663  if (writer->priv_class) {
664  void *priv_ctx = wctx->priv;
665  *(const AVClass **)priv_ctx = writer->priv_class;
666  av_opt_set_defaults(priv_ctx);
667  }
668 
669  wctx->class = &textwriter_class;
670  wctx->writer = writer;
671 
672  av_opt_set_defaults(wctx);
673 
674 
675  if (wctx->writer->init)
676  ret = wctx->writer->init(wctx);
677  if (ret < 0)
678  goto fail;
679 
680  *pwctx = wctx;
681 
682  return 0;
683 
684 fail:
686  return ret;
687 }
688 
689 static const AVTextFormatter *const registered_formatters[] =
690 {
700  NULL
701 };
702 
704 {
705  for (int i = 0; registered_formatters[i]; i++) {
706  const char *end;
707  if (av_strstart(name, registered_formatters[i]->name, &end) &&
708  (*end == '\0' || *end == '='))
709  return registered_formatters[i];
710  }
711 
712  return NULL;
713 }
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:72
AVTextFormatOptions::use_value_prefix
int use_value_prefix
Definition: avtextformat.h:127
value_string
static char * value_string(const AVTextFormatContext *tctx, char *buf, int buf_size, struct unit_value uv)
Definition: avtextformat.c:371
validate_string
static int validate_string(AVTextFormatContext *tctx, char **dstp, const char *src)
Definition: avtextformat.c:302
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:506
AVTextWriter::init
int(* init)(AVTextWriterContext *wctx)
Definition: avtextwriters.h:35
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:369
writercontext_get_writer_name
static const char * writercontext_get_writer_name(void *p)
Definition: avtextformat.c:603
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
AV_BPRINT_SIZE_UNLIMITED
#define AV_BPRINT_SIZE_UNLIMITED
AV_TEXTFORMAT_PRINT_STRING_OPTIONAL
#define AV_TEXTFORMAT_PRINT_STRING_OPTIONAL
Definition: avtextformat.h:172
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:523
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:1672
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:362
textcontext_options
static const AVOption textcontext_options[]
Definition: avtextformat.c:66
opt.h
AVTextFormatContext::opts
AVTextFormatOptions opts
Definition: avtextformat.h:155
AVTextWriter::priv_size
int priv_size
private size for the writer private class
Definition: avtextwriters.h:32
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:148
int64_t
long long int64_t
Definition: coverity.c:34
avtext_print_integer
void avtext_print_integer(AVTextFormatContext *tctx, const char *key, int64_t val, int flags)
Definition: avtextformat.c:282
avtextformatter_compact
const AVTextFormatter avtextformatter_compact
Definition: tf_compact.c:239
AV_TEXTFORMAT_STRING_VALIDATION_NB
@ AV_TEXTFORMAT_STRING_VALIDATION_NB
Definition: avtextformat.h:77
AVOption
AVOption.
Definition: opt.h:429
data
const char data[16]
Definition: mxf.c:149
AVTextWriterContext
Definition: avtextwriters.h:42
avtextformat.h
AVTextFormatContext
Definition: avtextformat.h:133
dec_str
char dec_str[4]
Definition: avtextformat.c:48
AVTextWriterContext::priv
void * priv
private data for use by the writer
Definition: avtextwriters.h:46
AVDictionary
Definition: dict.c:32
av_strlcatf
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
Definition: avstring.c:103
AV_TEXTFORMAT_VALUE_FMT_SECOND
@ AV_TEXTFORMAT_VALUE_FMT_SECOND
Definition: avtextformat.h:168
textcontext_class
static const AVClass textcontext_class
Definition: avtextformat.c:87
AVTextFormatSection::id
int id
unique id identifying a section
Definition: avtextformat.h:42
avtextformatter_mermaid
const AVTextFormatter avtextformatter_mermaid
Definition: tf_mermaid.c:651
AVTextFormatContext::level
int level
current level, starting from 0
Definition: avtextformat.h:144
AVTextWriter::uninit
int(* uninit)(AVTextWriterContext *wctx)
Definition: avtextwriters.h:36
macros.h
fail
#define fail()
Definition: checkasm.h:225
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:58
AV_TEXTFORMAT_DATADUMP_BASE64
@ AV_TEXTFORMAT_DATADUMP_BASE64
Definition: avtextformat.h:94
av_opt_free
void av_opt_free(void *obj)
Free all allocated objects in obj.
Definition: opt.c:1943
AV_BPRINT_SIZE_AUTOMATIC
#define AV_BPRINT_SIZE_AUTOMATIC
val
static double val(void *priv, double ch)
Definition: aeval.c:77
av_opt_set
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
Definition: opt.c:825
AV_TEXTFORMAT_PRINT_STRING_VALIDATE
#define AV_TEXTFORMAT_PRINT_STRING_VALIDATE
Definition: avtextformat.h:173
AVRational::num
int num
Numerator.
Definition: rational.h:59
av_clip64
#define av_clip64
Definition: common.h:103
AVTextFormatContext::writer
AVTextWriterContext * writer
the AVTextWriterContext
Definition: avtextformat.h:136
AVTextFormatOptions::data_dump_format
AVTextFormatDataDump data_dump_format
Definition: avtextformat.h:130
avassert.h
SECTION_ID_NONE
#define SECTION_ID_NONE
Definition: avtextformat.c:38
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
AVTextFormatOptions::is_key_selected
int(* is_key_selected)(struct AVTextFormatContext *tctx, const char *key)
Callback to discard certain elements based upon the key used.
Definition: avtextformat.h:124
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
registered_formatters
static const AVTextFormatter *const registered_formatters[]
Definition: avtextformat.c:689
float_fmt_full
static const char float_fmt_full[]
Definition: avtextformat.c:369
avtextformatter_default
const AVTextFormatter avtextformatter_default
Definition: tf_default.c:127
print_data_base64
static void print_data_base64(AVBPrint *bp, const uint8_t *data, int size)
Definition: avtextformat.c:555
AVTextFormatter::print_string
void(* print_string)(AVTextFormatContext *tctx, const char *, const char *)
Definition: avtextformat.h:108
textcontext_child_next
static void * textcontext_child_next(void *obj, void *prev)
Definition: avtextformat.c:79
intreadwrite.h
AVTextFormatter
Definition: avtextformat.h:97
SECTION_MAX_NB_SECTIONS
#define SECTION_MAX_NB_SECTIONS
Definition: avtextformat.h:113
avtext_print_data_hash
void avtext_print_data_hash(AVTextFormatContext *tctx, const char *key, const uint8_t *data, int size)
Definition: avtextformat.c:587
AVTextWriterContext::class
const AVClass * class
class of the writer
Definition: avtextwriters.h:43
AVDictionaryEntry::key
char * key
Definition: dict.h:91
avtextwriter_context_close
int avtextwriter_context_close(AVTextWriterContext **pwctx)
Definition: avtextformat.c:625
AVTextFormatSection
Definition: avtextformat.h:41
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
unit_value::fmt
AVTextFormatValueFormat fmt
Definition: avtextformat.c:365
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
bin_str
char bin_str[4]
Definition: avtextformat.c:47
avtextformatter_ini
const AVTextFormatter avtextformatter_ini
Definition: tf_ini.c:142
avtext_context_open
int avtext_context_open(AVTextFormatContext **ptctx, const AVTextFormatter *formatter, AVTextWriterContext *writer_context, const char *args, const AVTextFormatSection *sections, int nb_sections, AVTextFormatOptions options, char *show_data_hash)
Definition: avtextformat.c:127
limits.h
AVTextWriter::priv_class
const AVClass * priv_class
private class of the writer, if any
Definition: avtextwriters.h:31
AV_TEXTFORMAT_DATADUMP_XXD
@ AV_TEXTFORMAT_DATADUMP_XXD
Definition: avtextformat.h:93
AVTextFormatContext::priv
void * priv
private data for use by the filter
Definition: avtextformat.h:139
key
const char * key
Definition: hwcontext_opencl.c:189
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
AVTextFormatter::priv_size
int priv_size
private size for the formatter context
Definition: avtextformat.h:99
dec_val
double dec_val
Definition: avtextformat.c:46
AVTextFormatSection::unique_name
const char * unique_name
unique section name, in case the name is ambiguous
Definition: avtextformat.h:59
opts
static 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:76
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:457
av_hash_names
const char * av_hash_names(int i)
Get the names of available hash algorithms.
Definition: hash.c:98
AVTextFormatContext::section
const AVTextFormatSection * section[SECTION_MAX_NB_LEVELS]
section per each level
Definition: avtextformat.h:151
unit_second_str
static const char unit_second_str[]
Definition: avtextformat.c:241
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:40
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
av_unreachable
#define av_unreachable(msg)
Asserts that are used as compiler optimization hints depending upon ASSERT_LEVEL and NBDEBUG.
Definition: avassert.h:116
AV_TEXTFORMAT_VALUE_FMT_BYTE
@ AV_TEXTFORMAT_VALUE_FMT_BYTE
Definition: avtextformat.h:166
bprint_bytes
static void bprint_bytes(AVBPrint *bp, const uint8_t *ubuf, size_t ubuf_size)
Definition: avtextformat.c:95
AVTextWriter::name
const char * name
Definition: avtextwriters.h:33
AV_TEXTFORMAT_VALUE_FMT_DOUBLE
@ AV_TEXTFORMAT_VALUE_FMT_DOUBLE
Definition: avtextformat.h:167
options
Definition: swscale.c:45
AVTextFormatter::print_section_header
void(* print_section_header)(AVTextFormatContext *tctx, const void *data)
Definition: avtextformat.h:105
AV_TEXTFORMAT_STRING_VALIDATION_IGNORE
@ AV_TEXTFORMAT_STRING_VALIDATION_IGNORE
Definition: avtextformat.h:76
double
double
Definition: af_crystalizer.c:132
AVTextFormatContext::formatter
const AVTextFormatter * formatter
the AVTextFormatter of which this is an instance
Definition: avtextformat.h:135
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:703
base64.h
index
int index
Definition: gxfenc.c:90
SECTION_MAX_NB_LEVELS
#define SECTION_MAX_NB_LEVELS
Definition: avtextformat.h:112
avtext_print_unit_double
void avtext_print_unit_double(AVTextFormatContext *tctx, const char *key, double val, AVTextFormatValueFormat fmt, const char *unit)
Definition: avtextformat.c:444
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
avtextformatter_flat
const AVTextFormatter avtextformatter_flat
Definition: tf_flat.c:151
options
const OptionDef options[]
avtextwriter_context_open
int avtextwriter_context_open(AVTextWriterContext **pwctx, const AVTextWriter *writer)
Definition: avtextformat.c:645
AVTextWriter
Definition: avtextwriters.h:30
AV_TEXTFORMAT_STRING_VALIDATION_FAIL
@ AV_TEXTFORMAT_STRING_VALIDATION_FAIL
Definition: avtextformat.h:74
av_bprint_finalize
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition: bprint.c:235
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
AVTextFormatter::name
const char * name
Definition: avtextformat.h:100
avtext_print_section_footer
void avtext_print_section_footer(AVTextFormatContext *tctx)
Definition: avtextformat.c:261
AVTextWriterContext::writer
const AVTextWriter * writer
Definition: avtextwriters.h:44
size
int size
Definition: twinvq_data.h:10344
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
AVTextFormatContext::section_pbuf
AVBPrint section_pbuf[SECTION_MAX_NB_LEVELS]
generic print buffer dedicated to each section, used by various formatters
Definition: avtextformat.h:152
unit_value
Definition: avtextformat.c:359
SHOW_OPTIONAL_FIELDS_NEVER
#define SHOW_OPTIONAL_FIELDS_NEVER
Definition: avtextformat.c:41
AVTextFormatter::flags
int flags
a combination or AV_TEXTFORMAT__FLAG_*
Definition: avtextformat.h:109
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
av_strstart
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
Definition: avstring.c:36
textwriter_class
static const AVClass textwriter_class
Definition: avtextformat.c:617
AVTextFormatContext::sections
const AVTextFormatSection * sections
array containing all sections
Definition: avtextformat.h:141
unit_value::val
union unit_value::@17 val
avtext_print_rational
void avtext_print_rational(AVTextFormatContext *tctx, const char *key, AVRational q, char sep)
Definition: avtextformat.c:499
unit_value::unit
const char * unit
Definition: avtextformat.c:366
AVTextFormatContext::class
const AVClass * class
class of the formatter
Definition: avtextformat.h:134
bprint.h
AV_BASE64_SIZE
#define AV_BASE64_SIZE(x)
Calculate the output size needed to base64-encode x bytes to a null-terminated string.
Definition: base64.h:66
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
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
avtextformatter_xml
const AVTextFormatter avtextformatter_xml
Definition: tf_xml.c:202
AVTextFormatter::uninit
int(* uninit)(AVTextFormatContext *tctx)
Definition: avtextformat.h:103
AVTextFormatContext::string_validation_utf8_flags
unsigned int string_validation_utf8_flags
Definition: avtextformat.h:161
len
int len
Definition: vorbis_enc_data.h:426
writercontext_child_next
static void * writercontext_child_next(void *obj, void *prev)
Definition: avtextformat.c:609
avtextformatter_json
const AVTextFormatter avtextformatter_json
Definition: tf_json.c:203
log2
#define log2(x)
Definition: libm.h:406
AVTextFormatter::print_section_footer
void(* print_section_footer)(AVTextFormatContext *tctx)
Definition: avtextformat.h:106
AVTextFormatOptions::use_value_sexagesimal_format
int use_value_sexagesimal_format
Definition: avtextformat.h:129
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:81
avtext_print_unit_integer
void avtext_print_unit_integer(AVTextFormatContext *tctx, const char *key, int64_t val, AVTextFormatValueFormat fmt, const char *unit)
Definition: avtextformat.c:430
av_bprintf
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition: bprint.c:122
U
#define U(x)
Definition: vpx_arith.h:37
AVTextFormatValueFormat
AVTextFormatValueFormat
Definition: avtextformat.h:164
hash.h
AVTextFormatter::priv_class
const AVClass * priv_class
private class of the formatter, if any
Definition: avtextformat.h:98
AVTextFormatter::print_integer
void(* print_integer)(AVTextFormatContext *tctx, const char *, int64_t)
Definition: avtextformat.h:107
AVTextFormatOptions::show_optional_fields
int show_optional_fields
Definition: avtextformat.h:125
AVTextFormatContext::string_validation
int string_validation
Definition: avtextformat.h:159
AVRational::den
int den
Denominator.
Definition: rational.h:60
AVTextFormatOptions
Definition: avtextformat.h:115
float_fmt_singledigit
static const char float_fmt_singledigit[]
Definition: avtextformat.c:370
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
av_bprint_clear
void av_bprint_clear(AVBPrint *buf)
Reset the string to "" but keep internal allocated data.
Definition: bprint.c:227
sections
static const AVTextFormatSection sections[]
Definition: ffprobe.c: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
si_prefixes
static const struct @16 si_prefixes[]
AVTextFormatter::init
int(* init)(AVTextFormatContext *tctx)
Definition: avtextformat.h:102
av_base64_encode
char * av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size)
Encode data to base64 and null-terminate.
Definition: base64.c:147
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
AV_TEXTFORMAT_VALUE_FMT_DECIBEL
@ AV_TEXTFORMAT_VALUE_FMT_DECIBEL
Definition: avtextformat.h:169
AVTextFormatOptions::show_value_unit
int show_value_unit
Definition: avtextformat.h:126
print_data_xxd
static void print_data_xxd(AVBPrint *bp, const uint8_t *data, int size)
Definition: avtextformat.c:531
mem.h
avtextformatter_csv
const AVTextFormatter avtextformatter_csv
Definition: tf_compact.c:270
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:147
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:64
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
avtext_print_data
void avtext_print_data(AVTextFormatContext *tctx, const char *key, const uint8_t *data, int size)
Definition: avtextformat.c:568
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:130
AV_TEXTFORMAT_STRING_VALIDATION_REPLACE
@ AV_TEXTFORMAT_STRING_VALIDATION_REPLACE
Definition: avtextformat.h:75
AVDictionaryEntry::value
char * value
Definition: dict.h:92
show_data_hash
static char * show_data_hash
Definition: ffprobe.c:147
bin_val
double bin_val
Definition: avtextformat.c:45
AV_TEXTFORMAT_FLAG_SUPPORTS_OPTIONAL_FIELDS
#define AV_TEXTFORMAT_FLAG_SUPPORTS_OPTIONAL_FIELDS
Definition: avtextformat.h:69
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
unit_value::d
double d
Definition: avtextformat.c:361
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:148
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
avtextformatter_mermaidhtml
const AVTextFormatter avtextformatter_mermaidhtml
Definition: tf_mermaid.c:665
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
AVTextFormatOptions::use_byte_value_binary_prefix
int use_byte_value_binary_prefix
Definition: avtextformat.h:128
AVTextFormatContext::nb_sections
int nb_sections
number of sections
Definition: avtextformat.h:142
AVTextFormatContext::hash
struct AVHashContext * hash
Definition: avtextformat.h:157
avtext_print_section_header
void avtext_print_section_header(AVTextFormatContext *tctx, const void *data, int section_id)
Definition: avtextformat.c:243
AVTextFormatContext::string_validation_replacement
char * string_validation_replacement
Definition: avtextformat.h:160