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

Submitted by Shivam Goyal on May 2, 2019, 5:03 a.m.

Details

Message ID bcf854766a00f90591045d0b7548c69c.squirrel@webmail.iitk.ac.in
State New
Headers show

Commit Message

Shivam Goyal May 2, 2019, 5:03 a.m.
lavf/flv: Add XV (Xunlei Video) Support.
The patch fixes ticket #3720.
It would just skip the first packet, which stores the decrypted data and
moves on the next packet.
Also, Thank you Moritz Barsnick <barsnick@gmx.net> for commenting this on
the ticket. It really helped me.

I would also add the documentation for this once the patch is applied.

Thank you,
Shivam Goyal

Comments

Gyan May 2, 2019, 5:52 a.m.
On 02-05-2019 10:33 AM, shivgo@iitk.ac.in wrote:
> lavf/flv: Add XV (Xunlei Video) Support.
> The patch fixes ticket #3720.
> It would just skip the first packet, which stores the decrypted data and
> moves on the next packet.
> Also, Thank you Moritz Barsnick <barsnick@gmx.net> for commenting this on
> the ticket. It really helped me.
>
> I would also add the documentation for this once the patch is applied.
Better to submit the doc patch now so it can be reviewed.

Gyan
Shivam Goyal May 2, 2019, 6:25 a.m.
On 2019-05-02 11:22, Gyan wrote:

> On 02-05-2019 10:33 AM, shivgo@iitk.ac.in wrote: 
> 
>> lavf/flv: Add XV (Xunlei Video) Support.
>> The patch fixes ticket #3720.
>> It would just skip the first packet, which stores the decrypted data and
>> moves on the next packet.
>> Also, Thank you Moritz Barsnick <barsnick@gmx.net> for commenting this on
>> the ticket. It really helped me.
>> 
>> I would also add the documentation for this once the patch is applied.
> Better to submit the doc patch now so it can be reviewed.
> 
> Gyan

Ok, I am writing  it. 

Thank You 

Shivam Goyal
Moritz Barsnick May 2, 2019, 10:46 a.m.
On Thu, May 02, 2019 at 10:33:41 +0530, shivgo@iitk.ac.in wrote:

A minor nitpick (which the person pushing will/should notice):

>  #define LIBAVFORMAT_VERSION_MAJOR  58
> -#define LIBAVFORMAT_VERSION_MINOR  27
> +#define LIBAVFORMAT_VERSION_MINOR  28
>  #define LIBAVFORMAT_VERSION_MICRO 103

When bumping MINOR, you need to reset MICRO to 100.

Moritz
Shivam Goyal May 2, 2019, 12:53 p.m.
On 02-05-2019 16:16, Moritz Barsnick wrote:

> On Thu, May 02, 2019 at 10:33:41 +0530, shivgo@iitk.ac.in wrote:
> 
> A minor nitpick (which the person pushing will/should notice):
> 
>> #define LIBAVFORMAT_VERSION_MAJOR  58
>> -#define LIBAVFORMAT_VERSION_MINOR  27
>> +#define LIBAVFORMAT_VERSION_MINOR  28
>> #define LIBAVFORMAT_VERSION_MICRO 103
> 
> When bumping MINOR, you need to reset MICRO to 100.

Would reset it to 100. Sending another patch with the documentation too.


Thank you 
Shivam Goyal

Patch hide | download patch | download mbox

From 954f6583ec79d0c5484787ba4782a12073558995 Mon Sep 17 00:00:00 2001
From: Shivam Goyal <shivamgoyal1506@outlook.com>
Date: Thu, 2 May 2019 10:16:49 +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     | 74 ++++++++++++++++++++++++++++++++++++++++
 libavformat/version.h    |  2 +-
 5 files changed, 78 insertions(+), 1 deletion(-)

diff --git a/Changelog b/Changelog
index a3fa0c14a2..a9dc982d08 100644
--- a/Changelog
+++ b/Changelog
@@ -26,6 +26,7 @@  version <next>:
 - lscr decoder
 - lagfun filter
 - asoftclip filter
+- 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..bdb79400da 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;
@@ -783,6 +796,46 @@  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 enc_tag_size;
+    int rot;
+
+    //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 + 5, SEEK_SET);
+
+    enc_tag_size = ((avio_r8(ic) + rot & 0xff) << 16 |
+                    (avio_r8(ic) + rot & 0xff) << 8 |
+                    (avio_r8(ic) + rot & 0xff));
+    //Skip encrypted data
+    avio_skip(ic, enc_tag_size + 11);
+
+    s->start_time = 0;
+    xv->sum_flv_tag_size = 0;
+    xv->last_keyframe_stream_index = -1;
+
+    return 0;
+}
+
 static int flv_read_close(AVFormatContext *s)
 {
     int i;
@@ -1424,3 +1477,24 @@  AVInputFormat ff_kux_demuxer = {
     .extensions     = "kux",
     .priv_class     = &kux_class,
 };
+
+static const AVClass xv_class = {
+    .class_name = "xvdec",
+    .item_name  = av_default_item_name,
+    .option     = options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+AVInputFormat ff_xv_demuxer = {
+    .name           = "xv",
+    .long_name      = NULL_IF_CONFIG_SMALL("Xunlei(Thunder) Video File"),
+    .priv_data_size = sizeof(FLVContext),
+    .read_probe     = xv_probe,
+    .read_header    = xv_read_header,
+    .read_packet    = flv_read_packet,
+    .read_seek      = flv_read_seek,
+    .read_close     = flv_read_close,
+    .extensions     = "xv",
+    .priv_class     = &xv_class,
+    .flags          = AVFMT_TS_DISCONT
+};
diff --git a/libavformat/version.h b/libavformat/version.h
index 150a72e27d..17c841ae83 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -32,7 +32,7 @@ 
 // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium)
 // Also please add any ticket numbers that you believe might be affected here
 #define LIBAVFORMAT_VERSION_MAJOR  58
-#define LIBAVFORMAT_VERSION_MINOR  27
+#define LIBAVFORMAT_VERSION_MINOR  28
 #define LIBAVFORMAT_VERSION_MICRO 103
 
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
-- 
2.21.0