Lines Matching refs:wctx
464 int (*init) (WriterContext *wctx);
465 void (*uninit)(WriterContext *wctx);
467 void (*print_section_header)(WriterContext *wctx);
468 void (*print_section_footer)(WriterContext *wctx);
469 void (*print_integer) (WriterContext *wctx, const char *, long long int);
470 void (*print_rational) (WriterContext *wctx, AVRational *q, char *sep);
471 void (*print_string) (WriterContext *wctx, const char *, const char *);
482 void (* writer_w8)(WriterContext *wctx, int b);
483 void (* writer_put_str)(WriterContext *wctx, const char *str);
484 void (* writer_printf)(WriterContext *wctx, const char *fmt, ...);
513 WriterContext *wctx = p;
514 return wctx->writer->name;
548 static int writer_close(WriterContext **wctx)
553 if (!*wctx)
556 if ((*wctx)->writer->uninit)
557 (*wctx)->writer->uninit(*wctx);
559 av_bprint_finalize(&(*wctx)->section_pbuf[i], NULL);
560 if ((*wctx)->writer->priv_class)
561 av_opt_free((*wctx)->priv);
562 av_freep(&((*wctx)->priv));
563 av_opt_free(*wctx);
564 if ((*wctx)->avio) {
565 avio_flush((*wctx)->avio);
566 ret = avio_close((*wctx)->avio);
568 av_freep(wctx);
580 static inline void writer_w8_avio(WriterContext *wctx, int b)
582 avio_w8(wctx->avio, b);
585 static inline void writer_put_str_avio(WriterContext *wctx, const char *str)
587 avio_write(wctx->avio, str, strlen(str));
590 static inline void writer_printf_avio(WriterContext *wctx, const char *fmt, ...)
595 avio_vprintf(wctx->avio, fmt, ap);
599 static inline void writer_w8_printf(WriterContext *wctx, int b)
604 static inline void writer_put_str_printf(WriterContext *wctx, const char *str)
609 static inline void writer_printf_printf(WriterContext *wctx, const char *fmt, ...)
618 static int writer_open(WriterContext **wctx, const Writer *writer, const char *args,
623 if (!(*wctx = av_mallocz(sizeof(WriterContext)))) {
628 if (!((*wctx)->priv = av_mallocz(writer->priv_size))) {
633 (*wctx)->class = &writer_class;
634 (*wctx)->writer = writer;
635 (*wctx)->level = -1;
636 (*wctx)->sections = sections;
637 (*wctx)->nb_sections = nb_sections;
639 av_opt_set_defaults(*wctx);
642 void *priv_ctx = (*wctx)->priv;
653 av_log(*wctx, AV_LOG_ERROR, "Failed to parse option string '%s' provided to writer context\n", args);
659 if ((ret = av_opt_set(*wctx, opt->key, opt->value, AV_OPT_SEARCH_CHILDREN)) < 0) {
660 av_log(*wctx, AV_LOG_ERROR, "Failed to set option '%s' with value '%s' provided to writer context\n",
672 const uint8_t *p = (*wctx)->string_validation_replacement;
677 ret = av_utf8_decode(&code, &p, endp, (*wctx)->string_validation_utf8_flags);
682 av_log(wctx, AV_LOG_ERROR,
684 bp.str, (*wctx)->string_validation_replacement);
691 (*wctx)->writer_w8 = writer_w8_printf;
692 (*wctx)->writer_put_str = writer_put_str_printf;
693 (*wctx)->writer_printf = writer_printf_printf;
695 if ((ret = avio_open(&(*wctx)->avio, output, AVIO_FLAG_WRITE)) < 0) {
696 av_log(*wctx, AV_LOG_ERROR,
700 (*wctx)->writer_w8 = writer_w8_avio;
701 (*wctx)->writer_put_str = writer_put_str_avio;
702 (*wctx)->writer_printf = writer_printf_avio;
706 av_bprint_init(&(*wctx)->section_pbuf[i], 1, AV_BPRINT_SIZE_UNLIMITED);
708 if ((*wctx)->writer->init)
709 ret = (*wctx)->writer->init(*wctx);
716 writer_close(wctx);
720 static inline void writer_print_section_header(WriterContext *wctx,
724 wctx->level++;
725 av_assert0(wctx->level < SECTION_MAX_NB_LEVELS);
726 parent_section_id = wctx->level ?
727 (wctx->section[wctx->level-1])->id : SECTION_ID_NONE;
729 wctx->nb_item[wctx->level] = 0;
730 wctx->section[wctx->level] = &wctx->sections[section_id];
733 wctx->nb_section_packet = wctx->nb_section_frame =
734 wctx->nb_section_packet_frame = 0;
736 wctx->nb_section_packet_frame = section_id == SECTION_ID_PACKET ?
737 wctx->nb_section_packet : wctx->nb_section_frame;
740 if (wctx->writer->print_section_header)
741 wctx->writer->print_section_header(wctx);
744 static inline void writer_print_section_footer(WriterContext *wctx)
746 int section_id = wctx->section[wctx->level]->id;
747 int parent_section_id = wctx->level ?
748 wctx->section[wctx->level-1]->id : SECTION_ID_NONE;
751 wctx->nb_item[wctx->level-1]++;
753 if (section_id == SECTION_ID_PACKET) wctx->nb_section_packet++;
754 else wctx->nb_section_frame++;
756 if (wctx->writer->print_section_footer)
757 wctx->writer->print_section_footer(wctx);
758 wctx->level--;
761 static inline void writer_print_integer(WriterContext *wctx,
764 const struct section *section = wctx->section[wctx->level];
767 wctx->writer->print_integer(wctx, key, val);
768 wctx->nb_item[wctx->level]++;
772 static inline int validate_string(WriterContext *wctx, char **dstp, const char *src)
786 if (av_utf8_decode(&code, &p, endp, wctx->string_validation_utf8_flags) < 0) {
790 av_log(wctx, AV_LOG_DEBUG,
798 switch (wctx->string_validation) {
800 av_log(wctx, AV_LOG_ERROR,
807 av_bprintf(&dstbuf, "%s", wctx->string_validation_replacement);
812 if (!invalid || wctx->string_validation == WRITER_STRING_VALIDATION_IGNORE)
816 if (invalid_chars_nb && wctx->string_validation == WRITER_STRING_VALIDATION_REPLACE) {
817 av_log(wctx, AV_LOG_WARNING,
819 invalid_chars_nb, src, wctx->string_validation_replacement);
830 static inline int writer_print_string(WriterContext *wctx,
833 const struct section *section = wctx->section[wctx->level];
839 && !(wctx->writer->flags & WRITER_FLAG_DISPLAY_OPTIONAL_FIELDS)))
845 ret = validate_string(wctx, &key1, key);
847 ret = validate_string(wctx, &val1, val);
849 wctx->writer->print_string(wctx, key1, val1);
852 av_log(wctx, AV_LOG_ERROR,
859 wctx->writer->print_string(wctx, key, val);
862 wctx->nb_item[wctx->level]++;
868 static inline void writer_print_rational(WriterContext *wctx,
874 writer_print_string(wctx, key, buf.str, 0);
877 static void writer_print_time(WriterContext *wctx, const char *key,
883 writer_print_string(wctx, key, "N/A", PRINT_STRING_OPT);
890 writer_print_string(wctx, key, buf, 0);
894 static void writer_print_ts(WriterContext *wctx, const char *key, int64_t ts, int is_duration)
897 writer_print_string(wctx, key, "N/A", PRINT_STRING_OPT);
899 writer_print_integer(wctx, key, ts);
903 static void writer_print_data(WriterContext *wctx, const char *name,
927 writer_print_string(wctx, name, bp.str, 0);
931 static void writer_print_data_hash(WriterContext *wctx, const char *name,
943 writer_print_string(wctx, name, buf, 0);
946 static void writer_print_integers(WriterContext *wctx, const char *name,
968 writer_print_string(wctx, name, bp.str, 0);
1048 static void default_print_section_header(WriterContext *wctx)
1050 DefaultContext *def = wctx->priv;
1052 const struct section *section = wctx->section[wctx->level];
1053 const struct section *parent_section = wctx->level ?
1054 wctx->section[wctx->level-1] : NULL;
1056 av_bprint_clear(&wctx->section_pbuf[wctx->level]);
1059 def->nested_section[wctx->level] = 1;
1060 av_bprintf(&wctx->section_pbuf[wctx->level], "%s%s:",
1061 wctx->section_pbuf[wctx->level-1].str,
1066 if (def->noprint_wrappers || def->nested_section[wctx->level])
1070 writer_printf(wctx, "[%s]\n", upcase_string(buf, sizeof(buf), section->name));
1073 static void default_print_section_footer(WriterContext *wctx)
1075 DefaultContext *def = wctx->priv;
1076 const struct section *section = wctx->section[wctx->level];
1079 if (def->noprint_wrappers || def->nested_section[wctx->level])
1083 writer_printf(wctx, "[/%s]\n", upcase_string(buf, sizeof(buf), section->name));
1086 static void default_print_str(WriterContext *wctx, const char *key, const char *value)
1088 DefaultContext *def = wctx->priv;
1091 writer_printf(wctx, "%s%s=", wctx->section_pbuf[wctx->level].str, key);
1092 writer_printf(wctx, "%s\n", value);
1095 static void default_print_int(WriterContext *wctx, const char *key, long long int value)
1097 DefaultContext *def = wctx->priv;
1100 writer_printf(wctx, "%s%s=", wctx->section_pbuf[wctx->level].str, key);
1101 writer_printf(wctx, "%lld\n", value);
1196 static av_cold int compact_init(WriterContext *wctx)
1198 CompactContext *compact = wctx->priv;
1201 av_log(wctx, AV_LOG_ERROR, "Item separator '%s' specified, but must contain a single character\n",
1211 av_log(wctx, AV_LOG_ERROR, "Unknown escape mode '%s'\n", compact->escape_mode_str);
1218 static void compact_print_section_header(WriterContext *wctx)
1220 CompactContext *compact = wctx->priv;
1221 const struct section *section = wctx->section[wctx->level];
1222 const struct section *parent_section = wctx->level ?
1223 wctx->section[wctx->level-1] : NULL;
1224 compact->terminate_line[wctx->level] = 1;
1225 compact->has_nested_elems[wctx->level] = 0;
1227 av_bprint_clear(&wctx->section_pbuf[wctx->level]);
1230 compact->nested_section[wctx->level] = 1;
1231 compact->has_nested_elems[wctx->level-1] = 1;
1232 av_bprintf(&wctx->section_pbuf[wctx->level], "%s%s:",
1233 wctx->section_pbuf[wctx->level-1].str,
1235 wctx->nb_item[wctx->level] = wctx->nb_item[wctx->level-1];
1237 if (parent_section && compact->has_nested_elems[wctx->level-1] &&
1239 compact->terminate_line[wctx->level-1] = 0;
1242 wctx->level && wctx->nb_item[wctx->level-1])
1243 writer_w8(wctx, compact->item_sep);
1246 writer_printf(wctx, "%s%c", section->name, compact->item_sep);
1250 static void compact_print_section_footer(WriterContext *wctx)
1252 CompactContext *compact = wctx->priv;
1254 if (!compact->nested_section[wctx->level] &&
1255 compact->terminate_line[wctx->level] &&
1256 !(wctx->section[wctx->level]->flags & (SECTION_FLAG_IS_WRAPPER|SECTION_FLAG_IS_ARRAY)))
1257 writer_w8(wctx, '\n');
1260 static void compact_print_str(WriterContext *wctx, const char *key, const char *value)
1262 CompactContext *compact = wctx->priv;
1265 if (wctx->nb_item[wctx->level]) writer_w8(wctx, compact->item_sep);
1267 writer_printf(wctx, "%s%s=", wctx->section_pbuf[wctx->level].str, key);
1269 writer_put_str(wctx, compact->escape_str(&buf, value, compact->item_sep, wctx));
1273 static void compact_print_int(WriterContext *wctx, const char *key, long long int value)
1275 CompactContext *compact = wctx->priv;
1277 if (wctx->nb_item[wctx->level]) writer_w8(wctx, compact->item_sep);
1279 writer_printf(wctx, "%s%s=", wctx->section_pbuf[wctx->level].str, key);
1280 writer_printf(wctx, "%lld", value);
1348 static av_cold int flat_init(WriterContext *wctx)
1350 FlatContext *flat = wctx->priv;
1353 av_log(wctx, AV_LOG_ERROR, "Item separator '%s' specified, but must contain a single character\n",
1395 static void flat_print_section_header(WriterContext *wctx)
1397 FlatContext *flat = wctx->priv;
1398 AVBPrint *buf = &wctx->section_pbuf[wctx->level];
1399 const struct section *section = wctx->section[wctx->level];
1400 const struct section *parent_section = wctx->level ?
1401 wctx->section[wctx->level-1] : NULL;
1407 av_bprintf(buf, "%s", wctx->section_pbuf[wctx->level-1].str);
1411 av_bprintf(buf, "%s%s", wctx->section[wctx->level]->name, flat->sep_str);
1415 wctx->nb_section_packet_frame : wctx->nb_item[wctx->level-1];
1421 static void flat_print_int(WriterContext *wctx, const char *key, long long int value)
1423 writer_printf(wctx, "%s%s=%lld\n", wctx->section_pbuf[wctx->level].str, key, value);
1426 static void flat_print_str(WriterContext *wctx, const char *key, const char *value)
1428 FlatContext *flat = wctx->priv;
1431 writer_put_str(wctx, wctx->section_pbuf[wctx->level].str);
1433 writer_printf(wctx, "%s=", flat_escape_key_str(&buf, key, flat->sep));
1435 writer_printf(wctx, "\"%s\"\n", flat_escape_value_str(&buf, value));
1495 static void ini_print_section_header(WriterContext *wctx)
1497 INIContext *ini = wctx->priv;
1498 AVBPrint *buf = &wctx->section_pbuf[wctx->level];
1499 const struct section *section = wctx->section[wctx->level];
1500 const struct section *parent_section = wctx->level ?
1501 wctx->section[wctx->level-1] : NULL;
1505 writer_put_str(wctx, "# ffprobe output\n\n");
1509 if (wctx->nb_item[wctx->level-1])
1510 writer_w8(wctx, '\n');
1512 av_bprintf(buf, "%s", wctx->section_pbuf[wctx->level-1].str);
1515 av_bprintf(buf, "%s%s", buf->str[0] ? "." : "", wctx->section[wctx->level]->name);
1519 wctx->nb_section_packet_frame : wctx->nb_item[wctx->level-1];
1525 writer_printf(wctx, "[%s]\n", buf->str);
1528 static void ini_print_str(WriterContext *wctx, const char *key, const char *value)
1533 writer_printf(wctx, "%s=", ini_escape_str(&buf, key));
1535 writer_printf(wctx, "%s\n", ini_escape_str(&buf, value));
1539 static void ini_print_int(WriterContext *wctx, const char *key, long long int value)
1541 writer_printf(wctx, "%s=%lld\n", key, value);
1574 static av_cold int json_init(WriterContext *wctx)
1576 JSONContext *json = wctx->priv;
1604 #define JSON_INDENT() writer_printf(wctx, "%*c", json->indent_level * 4, ' ')
1606 static void json_print_section_header(WriterContext *wctx)
1608 JSONContext *json = wctx->priv;
1610 const struct section *section = wctx->section[wctx->level];
1611 const struct section *parent_section = wctx->level ?
1612 wctx->section[wctx->level-1] : NULL;
1614 if (wctx->level && wctx->nb_item[wctx->level-1])
1615 writer_put_str(wctx, ",\n");
1618 writer_put_str(wctx, "{\n");
1622 json_escape_str(&buf, section->name, wctx);
1627 writer_printf(wctx, "\"%s\": [\n", buf.str);
1629 writer_printf(wctx, "\"%s\": {%s", buf.str, json->item_start_end);
1631 writer_printf(wctx, "{%s", json->item_start_end);
1637 writer_printf(wctx, "\"type\": \"%s\"", section->name);
1638 wctx->nb_item[wctx->level]++;
1645 static void json_print_section_footer(WriterContext *wctx)
1647 JSONContext *json = wctx->priv;
1648 const struct section *section = wctx->section[wctx->level];
1650 if (wctx->level == 0) {
1652 writer_put_str(wctx, "\n}\n");
1654 writer_w8(wctx, '\n');
1657 writer_w8(wctx, ']');
1659 writer_put_str(wctx, json->item_start_end);
1663 writer_w8(wctx, '}');
1667 static inline void json_print_item_str(WriterContext *wctx,
1673 writer_printf(wctx, "\"%s\":", json_escape_str(&buf, key, wctx));
1675 writer_printf(wctx, " \"%s\"", json_escape_str(&buf, value, wctx));
1679 static void json_print_str(WriterContext *wctx, const char *key, const char *value)
1681 JSONContext *json = wctx->priv;
1682 const struct section *parent_section = wctx->level ?
1683 wctx->section[wctx->level-1] : NULL;
1685 if (wctx->nb_item[wctx->level] || (parent_section && parent_section->id == SECTION_ID_PACKETS_AND_FRAMES))
1686 writer_put_str(wctx, json->item_sep);
1689 json_print_item_str(wctx, key, value);
1692 static void json_print_int(WriterContext *wctx, const char *key, long long int value)
1694 JSONContext *json = wctx->priv;
1695 const struct section *parent_section = wctx->level ?
1696 wctx->section[wctx->level-1] : NULL;
1699 if (wctx->nb_item[wctx->level] || (parent_section && parent_section->id == SECTION_ID_PACKETS_AND_FRAMES))
1700 writer_put_str(wctx, json->item_sep);
1705 writer_printf(wctx, "\"%s\": %lld", json_escape_str(&buf, key, wctx), value);
1744 static av_cold int xml_init(WriterContext *wctx)
1746 XMLContext *xml = wctx->priv;
1752 av_log(wctx, AV_LOG_ERROR, \
1765 #define XML_INDENT() writer_printf(wctx, "%*c", xml->indent_level * 4, ' ')
1767 static void xml_print_section_header(WriterContext *wctx)
1769 XMLContext *xml = wctx->priv;
1770 const struct section *section = wctx->section[wctx->level];
1771 const struct section *parent_section = wctx->level ?
1772 wctx->section[wctx->level-1] : NULL;
1774 if (wctx->level == 0) {
1779 writer_put_str(wctx, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
1780 writer_printf(wctx, "<%sffprobe%s>\n",
1788 writer_put_str(wctx, ">\n");
1794 wctx->level && wctx->nb_item[wctx->level-1])
1795 writer_w8(wctx, '\n');
1799 XML_INDENT(); writer_printf(wctx, "<%s>\n", section->name);
1801 XML_INDENT(); writer_printf(wctx, "<%s ", section->name);
1807 static void xml_print_section_footer(WriterContext *wctx)
1809 XMLContext *xml = wctx->priv;
1810 const struct section *section = wctx->section[wctx->level];
1812 if (wctx->level == 0) {
1813 writer_printf(wctx, "</%sffprobe>\n", xml->fully_qualified ? "ffprobe:" : "");
1816 writer_put_str(wctx, "/>\n");
1821 XML_INDENT(); writer_printf(wctx, "</%s>\n", section->name);
1826 static void xml_print_str(WriterContext *wctx, const char *key, const char *value)
1829 XMLContext *xml = wctx->priv;
1830 const struct section *section = wctx->section[wctx->level];
1838 writer_printf(wctx, "<%s key=\"%s\"",
1844 writer_printf(wctx, " value=\"%s\"/>\n", buf.str);
1846 if (wctx->nb_item[wctx->level])
1847 writer_w8(wctx, ' ');
1851 writer_printf(wctx, "%s=\"%s\"", key, buf.str);
1857 static void xml_print_int(WriterContext *wctx, const char *key, long long int value)
1859 if (wctx->nb_item[wctx->level])
1860 writer_w8(wctx, ' ');
1861 writer_printf(wctx, "%s=\"%lld\"", key, value);
3410 static int probe_file(WriterContext *wctx, const char *filename,
3449 wctx->writer->flags & WRITER_FLAG_PUT_PACKETS_AND_FRAMES_IN_SAME_CHAPTER)
3456 writer_print_section_header(wctx, section_id);
3457 ret = read_packets(wctx, &ifile);
3459 writer_print_section_footer(wctx);
3464 ret = show_programs(wctx, &ifile);
3469 ret = show_streams(wctx, &ifile);
3473 ret = show_chapters(wctx, &ifile);
3477 ret = show_format(wctx, &ifile);
4026 WriterContext *wctx;
4126 if ((ret = writer_open(&wctx, w, w_args,
4129 wctx->string_validation_utf8_flags |= AV_UTF8_FLAG_EXCLUDE_XML_INVALID_CONTROL_CODES;
4131 writer_print_section_header(wctx, SECTION_ID_ROOT);
4134 ffprobe_show_program_version(wctx);
4136 ffprobe_show_library_versions(wctx);
4138 ffprobe_show_pixel_formats(wctx);
4148 ret = probe_file(wctx, input_filename, print_input_filename);
4150 show_error(wctx, ret);
4155 writer_print_section_footer(wctx);
4156 ret = writer_close(&wctx);