diff mbox

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

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

Commit Message

Shivam Goyal May 2, 2019, 5:03 a.m. UTC
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 Doshi May 2, 2019, 5:52 a.m. UTC | #1
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. UTC | #2
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. UTC | #3
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. UTC | #4
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
diff mbox

Patch

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