[FFmpeg-devel] [PATCH 1/1] Extended ASF functionality

Vadim Belov vadim.belov at gmail.com
Wed Jul 1 17:42:08 CEST 2015


Thanks Michael,
I've sent a fix of this patch,

Currently it doesn't change PACKET_SIZE, which was pretty specific for the
product I'm dealing with.


On Wed, Jul 1, 2015 at 4:21 PM, Michael Niedermayer <michaelni at gmx.at>
wrote:

> On Wed, Jul 01, 2015 at 03:49:11PM +0300, Vadim Belov wrote:
> > ---
> >  libavformat/Makefile             |   2 +-
> >  libavformat/asf.c                |   4 +
> >  libavformat/asf.h                |  12 ++-
> >  libavformat/asf_ex.h             |  58 ++++++++++
> >  libavformat/asf_trim.c           | 228
> +++++++++++++++++++++++++++++++++++++++
> >  libavformat/asf_trim.h           |  95 ++++++++++++++++
> >  libavformat/asfdec.c             |  17 ++-
> >  libavformat/asfenc.c             |  64 ++++++++++-
> >  8 files changed, 954 insertions(+), 485 deletions(-)
> >  create mode 100644 libavformat/asf_ex.h
> >  create mode 100644 libavformat/asf_trim.c
> >  create mode 100644 libavformat/asf_trim.h
> >
> >  1.9.5.msysgit.1
> >
> >  Signed-off-by: Vadim Belov <vadim.belov at gmail.com>
> >
> > diff --git a/libavformat/Makefile b/libavformat/Makefile
> > index bca9d5b..2743467 100644
> > --- a/libavformat/Makefile
> > +++ b/libavformat/Makefile
> > @@ -84,7 +84,7 @@ OBJS-$(CONFIG_APNG_MUXER)                += apngenc.o
> >  OBJS-$(CONFIG_AQTITLE_DEMUXER)           += aqtitledec.o subtitles.o
> >  OBJS-$(CONFIG_ASF_DEMUXER)               += asfdec.o asf.o asfcrypt.o \
> >                                              avlanguage.o
> > -OBJS-$(CONFIG_ASF_MUXER)                 += asfenc.o asf.o
> > +OBJS-$(CONFIG_ASF_MUXER)                 += asfenc.o asf.o asf_trim.o
> >  OBJS-$(CONFIG_ASS_DEMUXER)               += assdec.o subtitles.o
> >  OBJS-$(CONFIG_ASS_MUXER)                 += assenc.o
> >  OBJS-$(CONFIG_AST_DEMUXER)               += ast.o astdec.o
> > diff --git a/libavformat/asf.c b/libavformat/asf.c
> > index 80d24db..d2a0a8f 100644
> > --- a/libavformat/asf.c
> > +++ b/libavformat/asf.c
> > @@ -143,6 +143,10 @@ const ff_asf_guid ff_asf_digital_signature = {
> >      0xfc, 0xb3, 0x11, 0x22, 0x23, 0xbd, 0xd2, 0x11, 0xb4, 0xb7, 0x00,
> 0xa0, 0xc9, 0x55, 0xfc, 0x6e
> >  };
> >
> > +const ff_asf_guid ff_asf_index_header = {
> > +    0xd3, 0x29, 0xe2, 0xd6, 0xda, 0x35, 0xd1, 0x11, 0x90, 0x34, 0x00,
> 0xa0, 0xc9, 0x03, 0x49, 0xbe
> > +};
> > +
> >  /* List of official tags at
> http://msdn.microsoft.com/en-us/library/dd743066(VS.85).aspx */
> >  const AVMetadataConv ff_asf_metadata_conv[] = {
> >      { "WM/AlbumArtist",          "album_artist"     },
> > diff --git a/libavformat/asf.h b/libavformat/asf.h
> > index 0c9598a..0ef4ea6 100644
> > --- a/libavformat/asf.h
> > +++ b/libavformat/asf.h
> > @@ -1,5 +1,6 @@
> >  /*
> >   * Copyright (c) 2000, 2001 Fabrice Bellard
> > + * Copyright (c) 2015 Vadim Belov
> >   *
> >   * This file is part of FFmpeg.
> >   *
> > @@ -28,6 +29,11 @@
> >
> >  #define PACKET_SIZE 3200
> >
> > +/**
> > + * "asf_ex.h" is IMPORTANT to be placed After PACKET_SIZE definition
> > + */
> > +#include "asf_ex.h"
> > +
> >  typedef struct ASFPayload {
> >      uint8_t type;
> >      uint16_t size;
> > @@ -57,7 +63,9 @@ typedef struct ASFStream {
> >      uint32_t palette[256];
> >
> >      int payload_ext_ct;
> > -    ASFPayload payload[8];
> > +    ASFPayload payload[8];
> > +
> > +    ASFIndexData idx_data;
> >  } ASFStream;
> >
> >  typedef struct ASFMainHeader {
> > @@ -123,7 +131,7 @@ extern const ff_asf_guid ff_asf_language_guid;
> >  extern const ff_asf_guid ff_asf_content_encryption;
> >  extern const ff_asf_guid ff_asf_ext_content_encryption;
> >  extern const ff_asf_guid ff_asf_digital_signature;
> > -
> > +extern const ff_asf_guid ff_asf_index_header;
> >  extern const AVMetadataConv ff_asf_metadata_conv[];
> >
> >  #define ASF_PACKET_FLAG_ERROR_CORRECTION_PRESENT 0x80 //1000 0000
> > diff --git a/libavformat/asf_ex.h b/libavformat/asf_ex.h
> > new file mode 100644
> > index 0000000..480105a
> > --- /dev/null
> > +++ b/libavformat/asf_ex.h
> > @@ -0,0 +1,58 @@
> > +/**
> > + * @file asf_ex.h
> > + * Extensions to ASF handling
> > + * @author Vadim Belov
> > + *
> > + * Copyright (c) 2015 Vadim Belov
> > + *
> > + * 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
> > + */
> > +
> > +#ifndef AVFORMAT_ASF_EX_H
> > +#define AVFORMAT_ASF_EX_H
> > +
> > +#include <stdint.h>
> > +
>
> > +/**
> > + * Packet size according to the size that Custom ASF File Creator writes
> > + * to its output packets:
> > + * ASF_PACKET_SIZE is 8192, but is decremented later.
> > + * Final result: in the ASF core file the value is 8032
> > + */
> > +#ifdef PACKET_SIZE
> > +#undef PACKET_SIZE
> > +#endif
> > +#define PACKET_SIZE 8032
>
> is this specific value needed ?
> are there any disadvantages in using it ?
>
> either way if its changed it should be changed not overriden by undef
> also PACKET_SIZE could be moved to asfenc.c in a seperate patch
>
> it could even be made user configurable if theres an advantage in
> the user choosing the packet size
>
>
> > +
> > +#define STREAM_DIRECTION_STR "streamDirection"
> > +#define DIRECTION_DICT_KEY "direction"
> > +#define NO_STREAM_DIRECTION -1
> > +#define ASF_MAX_STREAMS_NUM 128
> > +
> > +typedef struct ASFStreamIndex { // Index Entry value
> > +    uint64_t offset;
> > +} ASFStreamIndex;
> > +
>
> > +typedef struct ASFIndexData {
> > +    ASFStreamIndex* indices; // array of ASFStreamIndex
> > +    uint32_t indices_max_count; // allocated size
> > +    uint32_t next_duration_mark; // for next index
> > +    uint32_t indices_count;           // current index
> > +    int64_t  duration_overall;
> > +} ASFIndexData;
>
> please replace tabs by spaces, they cannot be pushed  to ffmpeg git
>
>
> > +
> > +#endif /* AVFORMAT_ASF_EX_H */
> > diff --git a/libavformat/asf_trim.c b/libavformat/asf_trim.c
> > new file mode 100644
> > index 0000000..ce75170
> > --- /dev/null
> > +++ b/libavformat/asf_trim.c
> > @@ -0,0 +1,228 @@
> > +/*
> > + * @file asf_trim.c
> > + * Extensions to ASF handling
> > + * @author Vadim Belov
> > + *
> > + * Copyright (c) 2015 Vadim Belov
> > + *
> > + * 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 "asf_trim.h"
> > +
> > +#define ASF_INDEX_ENTRY_TIME_INTERVAL 10000
> > +#define SPECIFIER_INDEX_TYPE 3
> > +
> > +#define BLOCK_PART      0xFFFFFFFF00000000
> > +#define OFFSET_PART     0x00000000FFFFFFFF
> > +#define INVALID_OFFSET  0xFFFFFFFF
> > +
> > +int asf_get_streams_direction(AVFormatContext *s)
> > +{
> > +    int ret = 0;
> > +    int n;
> > +    for (n = 0; n < s->nb_streams; n++) {
> > +        AVDictionaryEntry *t = av_dict_get(
> > +            s->streams[n]->metadata, DIRECTION_DICT_KEY, NULL, 0);
> > +
> > +        av_log(s, AV_LOG_DEBUG, "direction metadata ptr is %p\n", t);
> > +
> > +        if (t) ret++;
> > +    }
> > +    return ret;
> > +}
> > +
>
> > +void set_stream_direction(
> > +    AVFormatContext *s,
> > +    int direction[ASF_MAX_STREAMS_NUM],
> > +    AVStream *st,
> > +    int i)
> > +{
>
> non static functions need a ff_ prefix (or other prefix if they are
> public to the end user but here it should be ff_)
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> Why not whip the teacher when the pupil misbehaves? -- Diogenes of Sinope
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
>


More information about the ffmpeg-devel mailing list