From 0c1759ac4b1ff8f0305dab4f244fa929b77a6fab Mon Sep 17 00:00:00 2001 From: Luca Barbato Date: Sat, 25 Feb 2012 21:45:23 +0100 Subject: [PATCH] segment: implement wrap around Provide a way to wrap around the segment index so pseudostreaming live through a web server and html5 browser is simpler. Also ensure that 0 (disable) is a valid value across the options providing wrap around. --- doc/muxers.texi | 2 ++ libavformat/segment.c | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/doc/muxers.texi b/doc/muxers.texi index aab3b6a638..4878e7630e 100644 --- a/doc/muxers.texi +++ b/doc/muxers.texi @@ -353,6 +353,8 @@ Set segment duration to @var{t} seconds. Generate also a listfile named @var{name}. @item segment_list_size @var{size} Overwrite the listfile once it reaches @var{size} entries. +@item segment_wrap @var{limit} +Wrap around segment index once it reaches @var{limit}. @end table @example diff --git a/libavformat/segment.c b/libavformat/segment.c index 89ae62d312..1af412ad53 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -39,6 +39,7 @@ typedef struct { char *list; /**< Set by a private option. */ float time; /**< Set by a private option. */ int size; /**< Set by a private option. */ + int wrap; /**< Set by a private option. */ int64_t offset_time; int64_t recording_time; int has_video; @@ -51,6 +52,9 @@ static int segment_start(AVFormatContext *s) AVFormatContext *oc = c->avf; int err = 0; + if (c->wrap) + c->number %= c->wrap; + if (av_get_frame_filename(oc->filename, sizeof(oc->filename), s->filename, c->number++) < 0) return AVERROR(EINVAL); @@ -206,12 +210,11 @@ static int seg_write_packet(AVFormatContext *s, AVPacket *pkt) if (seg->list) { avio_printf(seg->pb, "%s\n", oc->filename); avio_flush(seg->pb); - if (!(seg->number % seg->size)) { + if (seg->size && !(seg->number % seg->size)) { avio_close(seg->pb); if ((ret = avio_open2(&seg->pb, seg->list, AVIO_FLAG_WRITE, &s->interrupt_callback, NULL)) < 0) goto fail; - } } } @@ -250,6 +253,7 @@ static const AVOption options[] = { { "segment_time", "segment length in seconds", OFFSET(time), AV_OPT_TYPE_FLOAT, {.dbl = 2}, 0, FLT_MAX, E }, { "segment_list", "output the segment list", OFFSET(list), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E }, { "segment_list_size", "maximum number of playlist entries", OFFSET(size), AV_OPT_TYPE_INT, {.dbl = 5}, 0, INT_MAX, E }, + { "segment_wrap", "number after which the index wraps", OFFSET(wrap), AV_OPT_TYPE_INT, {.dbl = 0}, 0, INT_MAX, E }, { NULL }, };