diff options
author | Stefano Sabatini <stefasab@gmail.com> | 2012-09-01 16:12:29 +0200 |
---|---|---|
committer | Stefano Sabatini <stefasab@gmail.com> | 2012-09-04 11:25:14 +0200 |
commit | d81576354853ece2280f8476c4672f741b68a366 (patch) | |
tree | f3e6744eb32dff69d7512a8c7164ce1042fd1365 /libavformat/segment.c | |
parent | 299489714abaa71cf36d5e5078d6229a4ba3c1a7 (diff) | |
download | ffmpeg-d81576354853ece2280f8476c4672f741b68a366.tar.gz |
lavf/segment: add escaping for filename field of the CSV list file
CSV escaping code is borrowed from ffprobe.c.
Diffstat (limited to 'libavformat/segment.c')
-rw-r--r-- | libavformat/segment.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/libavformat/segment.c b/libavformat/segment.c index 1dda310b3f..ecd4ae8694 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -67,6 +67,30 @@ typedef struct { double start_time, end_time; } SegmentContext; +static void 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 (strchr("\",\n\r", *p)) { + quote = 1; + break; + } + + 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 +193,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); + 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); |