[FFmpeg-devel] [PATCH] lavf/segment: add CVS escaping for CSV list file filename field
Stefano Sabatini
stefasab at gmail.com
Sat Sep 1 16:15:50 CEST 2012
---
doc/muxers.texi | 4 ++--
libavformat/segment.c | 25 ++++++++++++++++++++++++-
2 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/doc/muxers.texi b/doc/muxers.texi
index 834edf8..1375356 100644
--- a/doc/muxers.texi
+++ b/doc/muxers.texi
@@ -498,8 +498,8 @@ each line matching the format:
@end example
@var{segment_filename} is the name of the output file generated by the
-muxer according to the provided pattern, and should not contain the
-"," character for simplifying parsing operations.
+muxer according to the provided pattern. CSV escaping (according to
+RFC4180) is applied if required.
@var{segment_start_time} and @var{segment_end_time} specify
the segment start and end time expressed in seconds.
diff --git a/libavformat/segment.c b/libavformat/segment.c
index e148dc0..e7c3f2b 100644
--- a/libavformat/segment.c
+++ b/libavformat/segment.c
@@ -67,6 +67,28 @@ typedef struct {
double start_time, end_time;
} SegmentContext;
+static void avio_print_csv_escaped_str(AVIOContext *ctx, const char *str)
+{
+ const char *p;
+ int quote = 0;
+
+ /* check if input needs quoting */
+ for (p = str; *p; p++)
+ if (*p == '"' || *p == ',' || *p == '\n' || *p == '\r')
+ quote = 1;
+
+ if (quote)
+ avio_w8(ctx, '"');
+
+ for (p = str; *p; p++) {
+ if (*p == '"')
+ avio_w8(ctx, '"');
+ avio_w8(ctx, *p);
+ }
+ if (quote)
+ avio_w8(ctx, '"');
+}
+
static int segment_start(AVFormatContext *s)
{
SegmentContext *seg = s->priv_data;
@@ -169,7 +191,8 @@ static int segment_end(AVFormatContext *s)
if (seg->list_type == LIST_TYPE_FLAT) {
avio_printf(seg->list_pb, "%s\n", oc->filename);
} else if (seg->list_type == LIST_TYPE_EXT) {
- avio_printf(seg->list_pb, "%s,%f,%f\n", oc->filename, seg->start_time, seg->end_time);
+ avio_print_csv_escaped_str(seg->list_pb, oc->filename);
+ avio_printf(seg->list_pb, ",%f,%f\n", seg->start_time, seg->end_time);
} else if (seg->list_type == LIST_TYPE_M3U8) {
avio_printf(seg->list_pb, "#EXTINF:%f,\n%s\n",
seg->end_time - seg->start_time, oc->filename);
--
1.7.5.4
More information about the ffmpeg-devel
mailing list