[FFmpeg-devel,v3] Added XV Support

Submitted by Shivam Goyal on April 8, 2019, 8:37 p.m.

Details

Message ID 453ef121-ae54-1490-7472-cc8024128d72@iitk.ac.in
State New
Headers show

Commit Message

Shivam Goyal April 8, 2019, 8:37 p.m.
Updated patch for ticket #3720 .

I have tried to improve the patch as suggested.

Comments

Carl Eugen Hoyos April 8, 2019, 9:11 p.m.
2019-04-08 22:37 GMT+02:00, Shivam Goyal <shivgo@iitk.ac.in>:
> Updated patch for ticket #3720 .
>
> I have tried to improve the patch as suggested.

Please fix the commit message as suggested by Lauri
and please make above (first) line part of the commit
message.

The first avio_seek() should be a skip, the header
function always starts reading the file from the top.

> +    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;

offset = ((avio_r8(ic) + rot & 0xff) << 24 |
          (avio_r8(ic) + rot & 0xff) << 16...

assuming this produces no warnings.
There is no 12-char indentation, only vertical alignment.

Carl Eugen

Patch hide | download patch | download mbox

From 8c4cd8cfc2b7b07cebbfefb96fc9bb9e92668385 Mon Sep 17 00:00:00 2001
From: Shivam Goyal <shivgo@iitk.ac.in>
Date: Tue, 9 Apr 2019 02:01:17 +0530
Subject: [PATCH] Added XV Support v3

---
 libavformat/Makefile     |  1 +
 libavformat/allformats.c |  1 +
 libavformat/flvdec.c     | 84 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 86 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..e98f32f94f 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;
@@ -459,6 +472,12 @@  static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, int64_t m
         }
     }
 
+    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 +802,50 @@  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 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
+    int64_t pos = ic->pos + ic->buf_ptr - ic->buf_end;
+    for(int i = 0; i < 0x400; i++){
+        if(pos >= 0x200400) break;
+        ic->buf_ptr[i] = (ic->buf_ptr[i] + rot) & 0xff;
+        pos++;
+    }
+
+    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 +1487,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
+};
-- 
2.21.0