From patchwork Sun Apr 7 06:53:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shivam Goyal X-Patchwork-Id: 12629 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 6DCA9448D13 for ; Sun, 7 Apr 2019 09:53:35 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4975C68AC38; Sun, 7 Apr 2019 09:53:35 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail3.iitk.ac.in (mail3.iitk.ac.in [202.3.77.190]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 02A5568ABF9 for ; Sun, 7 Apr 2019 09:53:28 +0300 (EEST) Received: from smtp.cc.iitk.ac.in (smtp.cc.iitk.ac.in [172.31.1.22]) (using TLSv1 with cipher ADH-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by mail3.iitk.ac.in (Postfix) with ESMTPS id 91523100032D for ; Sun, 7 Apr 2019 12:23:24 +0530 (IST) Received: from [172.27.30.33] (unknown [172.27.30.33]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (No client certificate requested) (Authenticated sender: shivgo) by smtp.cc.iitk.ac.in (Postfix) with ESMTPSA id 7D87E51 for ; Sun, 7 Apr 2019 12:23:24 +0530 (IST) To: ffmpeg-devel@ffmpeg.org From: Shivam Goyal Message-ID: <44851af6-bf54-c6be-98dc-f36f635e2a61@iitk.ac.in> Date: Sun, 7 Apr 2019 12:23:14 +0530 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.5.3 MIME-Version: 1.0 Content-Language: en-US Subject: [FFmpeg-devel] [PATCH v2] Added XV Support 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" This time i modified the initial buffer at the time of reading header instead of changing the IO layer. Suggest any changes required. From 277a4267f8cbb68c5fa57a0bddd215e04ca662bd Mon Sep 17 00:00:00 2001 From: Shivam Goyal Date: Sun, 7 Apr 2019 12:13:21 +0530 Subject: [PATCH] Added XV Support --- libavformat/Makefile | 1 + libavformat/allformats.c | 1 + libavformat/flvdec.c | 87 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+) diff --git a/libavformat/Makefile b/libavformat/Makefile index 99be60d184..262df876e9 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -563,6 +563,7 @@ OBJS-$(CONFIG_XBIN_DEMUXER) += bintext.o sauce.o OBJS-$(CONFIG_XMV_DEMUXER) += xmv.o OBJS-$(CONFIG_XVAG_DEMUXER) += xvag.o OBJS-$(CONFIG_XWMA_DEMUXER) += xwma.o +OBJS-$(CONFIG_XV_DEMUXER) += flvdec.o OBJS-$(CONFIG_YOP_DEMUXER) += yop.o OBJS-$(CONFIG_YUV4MPEGPIPE_DEMUXER) += yuv4mpegdec.o OBJS-$(CONFIG_YUV4MPEGPIPE_MUXER) += yuv4mpegenc.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..df732ca65e 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_MAX; + } + return 0; +} + static void add_keyframes_index(AVFormatContext *s) { FLVContext *flv = s->priv_data; @@ -459,6 +472,13 @@ static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, int64_t m } } + // For XV file the flv data starts from 0x200000 byte + 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 +803,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 pre_tag_size = 0; + int rot; + + //Find the rot value for rotating the bytes + avio_seek(ic, 0x200000, SEEK_SET); + 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 + int size = ic->buf_end - ic->buf_ptr; + int64_t pos = ic->pos - size; + for(int i=0;i<0x400; i++){ + if(pos >= 0x200400) break; + (*(ic->buf_ptr + i)) = (((*(ic->buf_ptr + i)) + rot) & 0xff ); + pos+=1; + } + + 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 +1490,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("Xunlie 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 +}; -- 2.21.0