[FFmpeg-devel] [PATCH] lavf: add a concat demuxer.

Michael Niedermayer michaelni at gmx.at
Tue Dec 11 08:54:18 CET 2012


On Wed, Aug 22, 2012 at 06:54:02PM +0200, Nicolas George wrote:
> 
> Signed-off-by: Nicolas George <nicolas.george at normalesup.org>
> ---
>  Changelog                |    1 +
>  doc/demuxers.texi        |   31 +++++++
>  libavformat/Makefile     |    1 +
>  libavformat/allformats.c |    1 +
>  libavformat/concatdec.c  |  221 ++++++++++++++++++++++++++++++++++++++++++++++
>  5 files changed, 255 insertions(+)
>  create mode 100644 libavformat/concatdec.c
> 
> 
> If the basic principle is deemed sound, I intend to extend the syntax and
> implementation, in particular to allow complete seeking in the virtual file,
> provided the underlying files are seekable too.
> 
> This is not redundant with HLS because HLS does the virtual concatenation at
> stream level, requiring the fragments to be in a concatenable format.
> 
> Concerning security: any kind of playlist support is potentially a security
> concern. My intention is to only allow filenames with safe characters,
> unless an option is explicitely enabled. Right now, since the format can not
> be probed, it does not matter.
> 
> Regards,
> 
> -- 
>   Nicolas George
> 
> 
> diff --git a/Changelog b/Changelog
> index 801cbff..93e6684 100644
> --- a/Changelog
> +++ b/Changelog
> @@ -52,6 +52,7 @@ version next:
>  - ffmpeg -shortest option is now per-output file
>  - volume measurement filter
>  - Ut Video encoder
> +- Virtual concatenation demuxer
>  
>  
>  version 0.11:
> diff --git a/doc/demuxers.texi b/doc/demuxers.texi
> index aea4c54..126dd1d 100644
> --- a/doc/demuxers.texi
> +++ b/doc/demuxers.texi
> @@ -184,4 +184,35 @@ the script is directly played, the actual times will match the absolute
>  timestamps up to the sound controller's clock accuracy, but if the user
>  somehow pauses the playback or seeks, all times will be shifted accordingly.
>  
> + at section concat
> +
> +Virtual concatenation script demuxer.
> +
> +This demuxer reads a list of files and other directives from a text file and
> +demuxes them one after the other, as if all their packet had been muxed
> +together.
> +
> +The timestamps in the files are adjusted so that the first file starts at 0
> +and each next file starts where the previous one finishes. Note that it is
> +done globally and may cause gaps if all streams do not have exactly the same
> +length.
> +
> +All files must have the same streams (same codecs, same time base, etc.).
> +
> +This script format can currently not be probed, it must be specified explicitly.
> +
> + at subsection Syntax
> +
> +The script is a text file in extended-ASCII, with one directive per line.
> +Empty lines, leading spaces and lines starting with '#' are ignored. The
> +following directive is recognized:
> +
> + at table @option
> +
> + at item @code{file @var{path}}
> +Path to a file to read; special characters and spaces must be escaped with
> +backslash or single quotes.
> +
> + at end table
> +
>  @c man end INPUT DEVICES
> diff --git a/libavformat/Makefile b/libavformat/Makefile
> index 72f9c22..dddfc4c 100644
> --- a/libavformat/Makefile
> +++ b/libavformat/Makefile
> @@ -70,6 +70,7 @@ OBJS-$(CONFIG_CAVSVIDEO_DEMUXER)         += cavsvideodec.o rawdec.o
>  OBJS-$(CONFIG_CAVSVIDEO_MUXER)           += rawenc.o
>  OBJS-$(CONFIG_CDG_DEMUXER)               += cdg.o
>  OBJS-$(CONFIG_CDXL_DEMUXER)              += cdxl.o
> +OBJS-$(CONFIG_CONCAT_DEMUXER)            += concatdec.o
>  OBJS-$(CONFIG_CRC_MUXER)                 += crcenc.o
>  OBJS-$(CONFIG_DAUD_DEMUXER)              += daud.o
>  OBJS-$(CONFIG_DAUD_MUXER)                += daud.o
> diff --git a/libavformat/allformats.c b/libavformat/allformats.c
> index 9df6280..6792ddb 100644
> --- a/libavformat/allformats.c
> +++ b/libavformat/allformats.c
> @@ -81,6 +81,7 @@ void av_register_all(void)
>      REGISTER_MUXDEMUX (CAVSVIDEO, cavsvideo);
>      REGISTER_DEMUXER  (CDG, cdg);
>      REGISTER_DEMUXER  (CDXL, cdxl);
> +    REGISTER_DEMUXER  (CONCAT, concat);
>      REGISTER_MUXER    (CRC, crc);
>      REGISTER_MUXDEMUX (DAUD, daud);
>      REGISTER_DEMUXER  (DFA, dfa);
> diff --git a/libavformat/concatdec.c b/libavformat/concatdec.c
> new file mode 100644
> index 0000000..29233e2
> --- /dev/null
> +++ b/libavformat/concatdec.c
> @@ -0,0 +1,221 @@
> +/*
> + * Copyright (c) 2012 Nicolas George
> + *
> + * This file is part of FFmpeg.
> + *
> + * FFmpeg is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public License
> + * as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * FFmpeg is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public License
> + * along with FFmpeg; if not, write to the Free Software Foundation, Inc.,
> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> + */
> +
> +#include "libavutil/avstring.h"
> +#include "avformat.h"
> +#include "internal.h"
> +
> +typedef struct {
> +    char *url;
> +    int64_t start_time;
> +    int64_t duration;
> +} ConcatFile;
> +
> +typedef struct {
> +    ConcatFile *files;
> +    ConcatFile *cur_file;
> +    unsigned nb_files;
> +    AVFormatContext *avf;
> +} ConcatContext;
> +
> +static int concat_probe(AVProbeData *probe)
> +{
> +    return 0;
> +}
> +
> +static char *get_keyword(uint8_t **cursor)
> +{
> +    char *ret = *cursor += strspn(*cursor, SPACE_CHARS);
> +    *cursor += strcspn(*cursor, SPACE_CHARS);
> +    if (**cursor) {
> +        *((*cursor)++) = 0;
> +        *cursor += strspn(*cursor, SPACE_CHARS);
> +    }
> +    return ret;
> +}
> +
> +#define FAIL(retcode) do { ret = (retcode); goto fail; } while(0)
> +
> +static int add_file(AVFormatContext *avf, char *filename, ConcatFile **rfile,
> +                    unsigned *nb_files_alloc)
> +{
> +    ConcatContext *cat = avf->priv_data;
> +    ConcatFile *file;
> +    char *url;
> +    size_t url_len;
> +
> +    url_len = strlen(avf->filename) + strlen(filename) + 16;
> +    if (!(url = av_malloc(url_len)))
> +        return AVERROR(ENOMEM);
> +    ff_make_absolute_url(url, url_len, avf->filename, filename);
> +    av_free(filename);
> +
> +    if (cat->nb_files >= *nb_files_alloc) {
> +        unsigned n = FFMAX(*nb_files_alloc * 2, 16);
> +        if (n <= cat->nb_files ||
> +            !(cat->files = av_realloc_f(cat->files, n, sizeof(*cat->files))))
> +            return AVERROR(ENOMEM);

leaks url (CID747737)

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

If you think the mosad wants you dead since a long time then you are either
wrong or dead since a long time.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20121211/7c7786c2/attachment.asc>


More information about the ffmpeg-devel mailing list