From patchwork Thu May 2 18:25:34 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shivam Goyal X-Patchwork-Id: 12968 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id D4C49447257 for ; Thu, 2 May 2019 21:25:45 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B254A68AB8E; Thu, 2 May 2019 21:25:45 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail5.iitk.ac.in (mail5.iitk.ac.in [202.3.77.18]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5228A68AB5E for ; Thu, 2 May 2019 21:25:38 +0300 (EEST) Received: from nwm.iitk.ac.in (nwm.iitk.ac.in [172.31.1.87]) by mail5.iitk.ac.in (Postfix) with ESMTP id 9E0EC6D for ; Thu, 2 May 2019 23:55:34 +0530 (IST) Received: from nwm.iitk.ac.in (localhost [127.0.0.1]) by nwm.iitk.ac.in (Postfix) with ESMTP id 8CF7324E2086 for ; Thu, 2 May 2019 23:55:34 +0530 (IST) MIME-Version: 1.0 Date: Thu, 02 May 2019 23:55:34 +0530 From: Shivam Goyal To: FFmpeg development discussions and patches Message-ID: <1de6d6b7c7a7d22402f027bd20ab8c1f@iitk.ac.in> X-Sender: shivgo@iitk.ac.in User-Agent: Roundcube Webmail/1.2.3 X-Remote-Browser: Mozilla/5.0 (X11; Linux x86_64; rv:66.0) Gecko/20100101 Firefox/66.0 X-Content-Filtered-By: Mailman/MimeDel 2.1.20 Subject: [FFmpeg-devel] [PATCH v8] lavf/flv: Add XV (Xunlei Video) Support. fixes ticket #3720 X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" 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 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 : - 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