[FFmpeg-devel] [PATCH] add segment_path for save segment movie
Stefano Sabatini
stefasab at gmail.com
Fri Oct 25 15:56:57 CEST 2013
On date Friday 2013-10-25 16:01:11 +0800, Steven Liu encoded:
>
> Create file in segment_path, and *DO NOT WANT* write the path into the
> list file, use "-segment_path path" can do it. if *WANT* write the path into
> the list, *NO USE* "-segment_path path"
>
>
>
>
> ---
> libavformat/segment.c | 23 ++++++++++++++++++++---
> 1 file changed, 20 insertions(+), 3 deletions(-)
>
> diff --git a/libavformat/segment.c b/libavformat/segment.c
> index 05e29d4..4e4765e 100644
> --- a/libavformat/segment.c
> +++ b/libavformat/segment.c
> @@ -75,6 +75,7 @@ typedef struct {
> ListType list_type; ///< set the list type
> AVIOContext *list_pb; ///< list file put-byte context
> char *time_str; ///< segment duration specification string
> + char *path;
> int64_t time; ///< segment duration
>
> char *times_str; ///< segment times specification string
> @@ -175,6 +176,7 @@ static int segment_start(AVFormatContext *s, int write_header)
> SegmentContext *seg = s->priv_data;
> AVFormatContext *oc = seg->avf;
> int err = 0;
> + uint8_t seg_path[1024];
weird indent
> if (write_header) {
> avformat_free_context(oc);
> @@ -188,7 +190,13 @@ static int segment_start(AVFormatContext *s, int write_header)
> if ((err = set_segment_filename(s)) < 0)
> return err;
>
> - if ((err = avio_open2(&oc->pb, oc->filename, AVIO_FLAG_WRITE,
> + /* seg_path = path + filename */
> + if (!seg->path) {
> + snprintf(seg_path, sizeof(seg_path), "%s/%s", seg->path, oc->filename);
> + } else {
> + snprintf(seg_path, sizeof(seg_path), "%s", oc->filename);
> + }
inverted logic?
You should use av_asprintf() in order to avoid arbitrary limitations
on the path length.
Also I believe you should change the set_segment_filename() code
instead, in order to avoid code duplication.
> + if ((err = avio_open2(&oc->pb, seg_path, AVIO_FLAG_WRITE,
> &s->interrupt_callback, NULL)) < 0)
> return err;
>
> @@ -528,6 +536,7 @@ static int seg_write_header(AVFormatContext *s)
> SegmentContext *seg = s->priv_data;
> AVFormatContext *oc = NULL;
> int ret;
> + uint8_t seg_path[1024];
>
> seg->segment_count = 0;
> if (!seg->write_header_trailer)
> @@ -599,8 +608,15 @@ static int seg_write_header(AVFormatContext *s)
> goto fail;
>
> if (seg->write_header_trailer) {
> - if ((ret = avio_open2(&oc->pb, oc->filename, AVIO_FLAG_WRITE,
> - &s->interrupt_callback, NULL)) < 0)
> +
> + /* seg_path = path + filename */
> + if (!seg->path) {
> + snprintf(seg_path, sizeof(seg_path), "%s/%s", seg->path, oc->filename);
> + } else {
> + snprintf(seg_path, sizeof(seg_path), "%s", oc->filename);
> + }
> + if ((ret = avio_open2(&oc->pb, seg_path, AVIO_FLAG_WRITE,
> + &s->interrupt_callback, NULL)) < 0)
> goto fail;
> } else {
> if ((ret = open_null_ctx(&oc->pb)) < 0)
> @@ -779,6 +795,7 @@ static const AVOption options[] = {
> { "segment_time_delta","set approximation value used for the segment times", OFFSET(time_delta), AV_OPT_TYPE_DURATION, {.i64 = 0}, 0, 0, E },
> { "segment_times", "set segment split time points", OFFSET(times_str),AV_OPT_TYPE_STRING,{.str = NULL}, 0, 0, E },
> { "segment_frames", "set segment split frame numbers", OFFSET(frames_str),AV_OPT_TYPE_STRING,{.str = NULL}, 0, 0, E },
> + { "segment_path", "set segment save to path", OFFSET(path),AV_OPT_TYPE_STRING,{.str = NULL}, 0, 0, E },
set segment path?
Also weird indent.
[...]
Missing documentation updates in doc/muxers.texi.
--
FFmpeg = Freak and Faithful Magical Plastic Elegant Game
More information about the ffmpeg-devel
mailing list