[FFmpeg-devel] [PATCH v6] lavf/flv: Add XV (Xunlei Video) Support. Fixes ticket #3720

Michael Niedermayer michael at niedermayer.cc
Fri Apr 12 16:09:53 EEST 2019


On Fri, Apr 12, 2019 at 07:15:49AM +0530, Shivam wrote:
> On 4/10/19 10:05 PM, Michael Niedermayer wrote:
> >On Tue, Apr 09, 2019 at 11:50:16PM +0530, Shivam Goyal wrote:
> >>lavf/flv: Add XV (Xunlei Video) Support.
> >>
> >>Fixes ticket #3720.
> >>
> >>
> >>
> >>  Changelog                |    1
> >>  libavformat/Makefile     |    1
> >>  libavformat/allformats.c |    1
> >>  libavformat/flvdec.c     |   86 +++++++++++++++++++++++++++++++++++++++++++++++
> >>  libavformat/version.h    |    2 -
> >>  5 files changed, 90 insertions(+), 1 deletion(-)
> >>c221c019d4dcd7063828c54567b8fc7c905b211b  added_xv_support_v6.patch
> >> From 605dc262abf948813c26d58f51d5e2d7f498d9cd Mon Sep 17 00:00:00 2001
> >>From: Shivam Goyal<shivgo at iitk.ac.in>
> >>Date: Tue, 9 Apr 2019 23:36:27 +0530
> >>Subject: [PATCH] lavf/flv: Add XV (Xunlei Video) Support. Fixes ticket #3720.
> >>
> >>---
> >>  Changelog                |  1 +
> >>  libavformat/Makefile     |  1 +
> >>  libavformat/allformats.c |  1 +
> >>  libavformat/flvdec.c     | 86 ++++++++++++++++++++++++++++++++++++++++
> >>  libavformat/version.h    |  2 +-
> >>  5 files changed, 90 insertions(+), 1 deletion(-)
> >>
> >>diff --git a/Changelog b/Changelog
> >>index 8c866cd0c2..8caaab53c2 100644
> >>--- a/Changelog
> >>+++ b/Changelog
> >>@@ -22,6 +22,7 @@ version <next>:
> >>  - removed libndi-newtek
> >>  - agm decoder
> >>  - KUX demuxer
> >>+- XV (Xunlei Video) demuxer
> >>  version 4.1:
> >>diff --git a/libavformat/Makefile b/libavformat/Makefile
> >>index 99be60d184..e090c051f1 100644
> >>--- a/libavformat/Makefile
> >>+++ b/libavformat/Makefile
> >>@@ -561,6 +561,7 @@ OBJS-$(CONFIG_WV_MUXER)                  += wvenc.o wv.o apetag.o img2.o
> >>  OBJS-$(CONFIG_XA_DEMUXER)                += xa.o
> >>  OBJS-$(CONFIG_XBIN_DEMUXER)              += bintext.o sauce.o
> >>  OBJS-$(CONFIG_XMV_DEMUXER)               += xmv.o
> >>+OBJS-$(CONFIG_XV_DEMUXER)                += flvdec.o
> >>  OBJS-$(CONFIG_XVAG_DEMUXER)              += xvag.o
> >>  OBJS-$(CONFIG_XWMA_DEMUXER)              += xwma.o
> >>  OBJS-$(CONFIG_YOP_DEMUXER)               += yop.o
> >>diff --git a/libavformat/allformats.c b/libavformat/allformats.c
> >>index d316a0529a..b499186071 100644
> >>--- a/libavformat/allformats.c
> >>+++ b/libavformat/allformats.c
> >>@@ -456,6 +456,7 @@ extern AVOutputFormat ff_wv_muxer;
> >>  extern AVInputFormat  ff_xa_demuxer;
> >>  extern AVInputFormat  ff_xbin_demuxer;
> >>  extern AVInputFormat  ff_xmv_demuxer;
> >>+extern AVInputFormat  ff_xv_demuxer;
> >>  extern AVInputFormat  ff_xvag_demuxer;
> >>  extern AVInputFormat  ff_xwma_demuxer;
> >>  extern AVInputFormat  ff_yop_demuxer;
> >>diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c
> >>index b531a39adc..a56f5b448a 100644
> >>--- a/libavformat/flvdec.c
> >>+++ b/libavformat/flvdec.c
> >>@@ -127,6 +127,19 @@ static int kux_probe(const AVProbeData *p)
> >>      return 0;
> >>  }
> >>+static int xv_probe(const AVProbeData *p)
> >>+{
> >>+    const uint8_t *d = p->buf;
> >>+
> >>+    if (d[0] == 'X' &&
> >>+        d[1] == 'L' &&
> >>+        d[2] == 'V' &&
> >>+        d[3] == 'F') {
> >>+        return AVPROBE_SCORE_EXTENSION + 1;
> >>+    }
> >>+    return 0;
> >>+}
> >>+
> >>  static void add_keyframes_index(AVFormatContext *s)
> >>  {
> >>      FLVContext *flv   = s->priv_data;
> >>@@ -459,6 +472,12 @@ static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, int64_t m
> >>          }
> >>      }
> >>+    if (!strcmp(s->iformat->name , "xv")) {
> >>+        for (i = 0; i < FFMIN(2,fileposlen); i++) {
> >>+            filepositions[i] += 0x200000;
> >>+        }
> >>+    }
> >>+
> >>      if (timeslen == fileposlen && fileposlen>1 && max_pos <= filepositions[0]) {
> >>          for (i = 0; i < FFMIN(2,fileposlen); i++) {
> >>              flv->validate_index[i].pos = filepositions[i];
> >>@@ -783,6 +802,52 @@ static int flv_read_header(AVFormatContext *s)
> >>      return 0;
> >>  }
> >>+static int xv_read_header(AVFormatContext *s)
> >>+{
> >>+    int flags;
> >>+    FLVContext *xv = s->priv_data;
> >>+    AVIOContext *ic = s->pb;
> >>+    int offset;
> >>+    int rot;
> >>+    int i;
> >>+    int64_t pos;
> >>+
> >>+    //Find the rot value for rotating the bytes
> >>+    avio_skip(ic, 0x200000);
> >>+    rot = 0x46 - avio_r8(ic);
> >>+
> >>+    avio_skip(ic, 3);
> >>+
> >>+    flags = (avio_r8(ic) + rot) & 0xff;
> >>+
> >>+    xv->missing_streams = flags & (FLV_HEADER_FLAG_HASVIDEO | FLV_HEADER_FLAG_HASAUDIO);
> >>+
> >>+    s->ctx_flags |= AVFMTCTX_NOHEADER;
> >>+
> >>+    offset = ((avio_r8(ic) + rot & 0xff) << 24 |
> >>+              (avio_r8(ic) + rot & 0xff) << 16 |
> >>+              (avio_r8(ic) + rot & 0xff) << 8 |
> >>+              (avio_r8(ic) + rot & 0xff)) + 0x200000;
> >>+
> >>+    avio_seek(ic, offset + 4, SEEK_SET);
> >>+
> >>+
> >>+    // Will modify the current buffer, as only
> >>+    // the bytes from 0x200000 to 0x200400 are needed to decode
> >>+    pos = ic->pos + ic->buf_ptr - ic->buf_end;
> >>+    for (i = 0; i < 0x400; i++) {
> >>+        if (pos >= 0x200400) break;
> >>+        ic->buf_ptr[i] = (ic->buf_ptr[i] + rot) & 0xff;
> >>+        pos++;
> >>+    }
> >the demuxer should not manipulate the protocols /avio internal buffer.
> >This would make the demuxer depend on how this buffer is implemented.
> >Also the data that needs changes may not be in the buffer but be read
> >later i think-
> >It would be quite annoying for maintaince if changing the internal
> >AVIO code would require updating the implementations of demuxers
> >
> >[...]
> >
> 
> Yeah, I realise that this would be hard to maintain. and would not work if
> we change the structure of the AVIOContaxt.
> 
> But, what is the best solution for this. I also tried to pass the avio read
> calls back to a custom function. But then i don't have access to a rot
> value, which is needed to rotate the bytes.

The avio stuff has a opaque pointer that allows you to access a structure of
your choosing when its your own avio context. This struct could contain rot
and the avio context for the parent to pass calls on


> 
> Or, could you help me in providing some examples, where this kind of problem
> arised in any other demuxer.

iam not sure but maybe
git grep avio_alloc_context

points to something usefull

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Those who would give up essential Liberty, to purchase a little
temporary Safety, deserve neither Liberty nor Safety -- Benjamin Franklin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20190412/1bbfb683/attachment.sig>


More information about the ffmpeg-devel mailing list