00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "avformat.h"
00023 #include "ffmeta.h"
00024
00025
00026 static void write_escape_str(ByteIOContext *s, const uint8_t *str)
00027 {
00028 const uint8_t *p = str;
00029
00030 while (*p) {
00031 if (*p == '#' || *p == ';' || *p == '=' || *p == '\\' || *p == '\n')
00032 put_byte(s, '\\');
00033 put_byte(s, *p);
00034 p++;
00035 }
00036 }
00037
00038 static void write_tags(ByteIOContext *s, AVMetadata *m)
00039 {
00040 AVMetadataTag *t = NULL;
00041 while ((t = av_metadata_get(m, "", t, AV_METADATA_IGNORE_SUFFIX))) {
00042 write_escape_str(s, t->key);
00043 put_byte(s, '=');
00044 write_escape_str(s, t->value);
00045 put_byte(s, '\n');
00046 }
00047 }
00048
00049 static int write_header(AVFormatContext *s)
00050 {
00051 put_tag(s->pb, ID_STRING);
00052 put_byte(s->pb, '1');
00053 put_byte(s->pb, '\n');
00054 put_flush_packet(s->pb);
00055 return 0;
00056 }
00057
00058 static int write_trailer(AVFormatContext *s)
00059 {
00060 int i;
00061
00062 write_tags(s->pb, s->metadata);
00063
00064 for (i = 0; i < s->nb_streams; i++) {
00065 put_tag(s->pb, ID_STREAM);
00066 put_byte(s->pb, '\n');
00067 write_tags(s->pb, s->streams[i]->metadata);
00068 }
00069
00070 for (i = 0; i < s->nb_chapters; i++) {
00071 AVChapter *ch = s->chapters[i];
00072 put_tag(s->pb, ID_CHAPTER);
00073 put_byte(s->pb, '\n');
00074 url_fprintf(s->pb, "TIMEBASE=%d/%d\n", ch->time_base.num, ch->time_base.den);
00075 url_fprintf(s->pb, "START=%lld\n", ch->start);
00076 url_fprintf(s->pb, "END=%lld\n", ch->end);
00077 write_tags(s->pb, ch->metadata);
00078 }
00079
00080 put_flush_packet(s->pb);
00081
00082 return 0;
00083 }
00084
00085 static int write_packet(AVFormatContext *s, AVPacket *pkt)
00086 {
00087 return 0;
00088 }
00089
00090 AVOutputFormat ffmetadata_muxer = {
00091 .name = "ffmetadata",
00092 .long_name = NULL_IF_CONFIG_SMALL("FFmpeg metadata in text format"),
00093 .extensions = "ffmeta",
00094 .write_header = write_header,
00095 .write_packet = write_packet,
00096 .write_trailer = write_trailer,
00097 .flags = AVFMT_NOTIMESTAMPS | AVFMT_NOSTREAMS,
00098 };