ffmpeg / libavformat / ffmetaenc.c @ 56a10009
History | View | Annotate | Download (2.78 KB)
1 | a4651511 | Anton Khirnov | /*
|
---|---|---|---|
2 | * Metadata muxer
|
||
3 | * Copyright (c) 2010 Anton Khirnov
|
||
4 | *
|
||
5 | 2912e87a | Mans Rullgard | * This file is part of Libav.
|
6 | a4651511 | Anton Khirnov | *
|
7 | 2912e87a | Mans Rullgard | * Libav is free software; you can redistribute it and/or
|
8 | a4651511 | Anton Khirnov | * modify it under the terms of the GNU Lesser General Public
|
9 | * License as published by the Free Software Foundation; either
|
||
10 | * version 2.1 of the License, or (at your option) any later version.
|
||
11 | *
|
||
12 | 2912e87a | Mans Rullgard | * Libav is distributed in the hope that it will be useful,
|
13 | a4651511 | Anton Khirnov | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
15 | * Lesser General Public License for more details.
|
||
16 | *
|
||
17 | * You should have received a copy of the GNU Lesser General Public
|
||
18 | 2912e87a | Mans Rullgard | * License along with Libav; if not, write to the Free Software
|
19 | a4651511 | Anton Khirnov | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
20 | */
|
||
21 | |||
22 | c0ae5152 | Jai Menon | #include <inttypes.h> |
23 | |||
24 | a4651511 | Anton Khirnov | #include "avformat.h" |
25 | 14fa75ea | Anton Khirnov | #include "ffmeta.h" |
26 | a4651511 | Anton Khirnov | |
27 | |||
28 | ae628ec1 | Anton Khirnov | static void write_escape_str(AVIOContext *s, const uint8_t *str) |
29 | a4651511 | Anton Khirnov | { |
30 | const uint8_t *p = str;
|
||
31 | |||
32 | while (*p) {
|
||
33 | if (*p == '#' || *p == ';' || *p == '=' || *p == '\\' || *p == '\n') |
||
34 | 77eb5504 | Anton Khirnov | avio_w8(s, '\\');
|
35 | avio_w8(s, *p); |
||
36 | a4651511 | Anton Khirnov | p++; |
37 | } |
||
38 | } |
||
39 | |||
40 | ae628ec1 | Anton Khirnov | static void write_tags(AVIOContext *s, AVMetadata *m) |
41 | a4651511 | Anton Khirnov | { |
42 | AVMetadataTag *t = NULL;
|
||
43 | while ((t = av_metadata_get(m, "", t, AV_METADATA_IGNORE_SUFFIX))) { |
||
44 | write_escape_str(s, t->key); |
||
45 | 77eb5504 | Anton Khirnov | avio_w8(s, '=');
|
46 | a4651511 | Anton Khirnov | write_escape_str(s, t->value); |
47 | 77eb5504 | Anton Khirnov | avio_w8(s, '\n');
|
48 | a4651511 | Anton Khirnov | } |
49 | } |
||
50 | |||
51 | static int write_header(AVFormatContext *s) |
||
52 | { |
||
53 | bbc413f9 | Anton Khirnov | avio_write(s->pb, ID_STRING, sizeof(ID_STRING) - 1); |
54 | 77eb5504 | Anton Khirnov | avio_w8(s->pb, '1'); // version |
55 | avio_w8(s->pb, '\n');
|
||
56 | b7f2fdde | Anton Khirnov | avio_flush(s->pb); |
57 | a4651511 | Anton Khirnov | return 0; |
58 | } |
||
59 | |||
60 | static int write_trailer(AVFormatContext *s) |
||
61 | { |
||
62 | int i;
|
||
63 | |||
64 | write_tags(s->pb, s->metadata); |
||
65 | |||
66 | for (i = 0; i < s->nb_streams; i++) { |
||
67 | bbc413f9 | Anton Khirnov | avio_write(s->pb, ID_STREAM, sizeof(ID_STREAM) - 1); |
68 | 77eb5504 | Anton Khirnov | avio_w8(s->pb, '\n');
|
69 | a4651511 | Anton Khirnov | write_tags(s->pb, s->streams[i]->metadata); |
70 | } |
||
71 | |||
72 | for (i = 0; i < s->nb_chapters; i++) { |
||
73 | AVChapter *ch = s->chapters[i]; |
||
74 | bbc413f9 | Anton Khirnov | avio_write(s->pb, ID_CHAPTER, sizeof(ID_CHAPTER) - 1); |
75 | 77eb5504 | Anton Khirnov | avio_w8(s->pb, '\n');
|
76 | d9d86e00 | Anton Khirnov | avio_printf(s->pb, "TIMEBASE=%d/%d\n", ch->time_base.num, ch->time_base.den);
|
77 | avio_printf(s->pb, "START=%"PRId64"\n", ch->start); |
||
78 | avio_printf(s->pb, "END=%"PRId64"\n", ch->end); |
||
79 | a4651511 | Anton Khirnov | write_tags(s->pb, ch->metadata); |
80 | } |
||
81 | |||
82 | b7f2fdde | Anton Khirnov | avio_flush(s->pb); |
83 | a4651511 | Anton Khirnov | |
84 | return 0; |
||
85 | } |
||
86 | |||
87 | static int write_packet(AVFormatContext *s, AVPacket *pkt) |
||
88 | { |
||
89 | return 0; |
||
90 | } |
||
91 | |||
92 | c6610a21 | Diego Elio Pettenò | AVOutputFormat ff_ffmetadata_muxer = { |
93 | a4651511 | Anton Khirnov | .name = "ffmetadata",
|
94 | .long_name = NULL_IF_CONFIG_SMALL("FFmpeg metadata in text format"),
|
||
95 | .extensions = "ffmeta",
|
||
96 | .write_header = write_header, |
||
97 | .write_packet = write_packet, |
||
98 | .write_trailer = write_trailer, |
||
99 | .flags = AVFMT_NOTIMESTAMPS | AVFMT_NOSTREAMS, |
||
100 | }; |