The patch fixes ticket #3720. Add Xunlei video support.
Suggestions are appreciated.
Thank you
Shivam Goyal
From 0f0d87b499c1e91bf2b6265a61e964c1a16da8de Mon Sep 17 00:00:00 2001
From: Shivam Goyal <shivamgoyal1...@outlook.com>
Date: Thu, 2 May 2019 23:27:24 +0530
Subject: [PATCH] lavf/flv: Add XV (Xunlei Video) Support. fixes ticket #3720
---
Changelog | 1 +
doc/demuxers.texi | 7 ++++
libavformat/Makefile | 1 +
libavformat/allformats.c | 1 +
libavformat/flvdec.c | 74 ++++++++++++++++++++++++++++++++++++++++
libavformat/version.h | 4 +--
6 files changed, 86 insertions(+), 2 deletions(-)
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/doc/demuxers.texi b/doc/demuxers.texi
index 57d1532212..4e27f5dfc8 100644
--- a/doc/demuxers.texi
+++ b/doc/demuxers.texi
@@ -266,6 +266,13 @@ Ignore the size of previous tag value.
Output all context of the onMetadata.
@end table
+@subsection XV (Xunlei Video file)
+
+Xunlei video files are modified flv files with some data encrypted. An XV video file @file{vid.xv} can be converted back to the original flv by using-
+@example
+ffmpeg -i vid.xv -c copy out.flv
+@end example
+
@section gif
Animated GIF demuxer.
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..52dd95f5c6 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -32,8 +32,8 @@
// 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_MICRO 103
+#define LIBAVFORMAT_VERSION_MINOR 28
+#define LIBAVFORMAT_VERSION_MICRO 100
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \
--
2.21.0
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".