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 0x20 byte
+if(!strcmp(s->iformat->name , "xv")){
+for (i=0; i < FFMIN(2,fileposlen); i++){
+filepositions[i] += 0x20;
+}
+}
+
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, 0x20, 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)))+ 0x20;
+
+avio_seek(ic, offset + 4, SEEK_SET);
+
+
+// Will modify the current buffer, as only
+// the bytes from 0x20 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 = _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 = _class,
+.flags = AVFMT_TS_DISCONT
+};
--
2.21.0
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org