lavf/segment: add escaping for filename field of the CSV list file

CSV escaping code is borrowed from ffprobe.c.
This commit is contained in:
Stefano Sabatini 2012-09-01 16:12:29 +02:00
parent 299489714a
commit d815763548
2 changed files with 28 additions and 3 deletions

View File

@ -498,8 +498,8 @@ each line matching the format:
@end example @end example
@var{segment_filename} is the name of the output file generated by the @var{segment_filename} is the name of the output file generated by the
muxer according to the provided pattern, and should not contain the muxer according to the provided pattern. CSV escaping (according to
"," character for simplifying parsing operations. RFC4180) is applied if required.
@var{segment_start_time} and @var{segment_end_time} specify @var{segment_start_time} and @var{segment_end_time} specify
the segment start and end time expressed in seconds. the segment start and end time expressed in seconds.

View File

@ -67,6 +67,30 @@ typedef struct {
double start_time, end_time; double start_time, end_time;
} SegmentContext; } 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) static int segment_start(AVFormatContext *s)
{ {
SegmentContext *seg = s->priv_data; SegmentContext *seg = s->priv_data;
@ -169,7 +193,8 @@ static int segment_end(AVFormatContext *s)
if (seg->list_type == LIST_TYPE_FLAT) { if (seg->list_type == LIST_TYPE_FLAT) {
avio_printf(seg->list_pb, "%s\n", oc->filename); avio_printf(seg->list_pb, "%s\n", oc->filename);
} else if (seg->list_type == LIST_TYPE_EXT) { } 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) { } else if (seg->list_type == LIST_TYPE_M3U8) {
avio_printf(seg->list_pb, "#EXTINF:%f,\n%s\n", avio_printf(seg->list_pb, "#EXTINF:%f,\n%s\n",
seg->end_time - seg->start_time, oc->filename); seg->end_time - seg->start_time, oc->filename);