On Fri, Apr 12, 2019 at 07:15:49AM +0530, Shivam wrote: > On 4/10/19 10:05 PM, Michael Niedermayer wrote: > >On Tue, Apr 09, 2019 at 11:50:16PM +0530, Shivam Goyal wrote: > >>lavf/flv: Add XV (Xunlei Video) Support. > >> > >>Fixes ticket #3720. > >> > >> > >> > >> Changelog | 1 > >> libavformat/Makefile | 1 > >> libavformat/allformats.c | 1 > >> libavformat/flvdec.c | 86 > >> +++++++++++++++++++++++++++++++++++++++++++++++ > >> libavformat/version.h | 2 - > >> 5 files changed, 90 insertions(+), 1 deletion(-) > >>c221c019d4dcd7063828c54567b8fc7c905b211b added_xv_support_v6.patch > >> From 605dc262abf948813c26d58f51d5e2d7f498d9cd Mon Sep 17 00:00:00 2001 > >>From: Shivam Goyal<shi...@iitk.ac.in> > >>Date: Tue, 9 Apr 2019 23:36:27 +0530 > >>Subject: [PATCH] lavf/flv: Add XV (Xunlei Video) Support. Fixes ticket > >>#3720. > >> > >>--- > >> Changelog | 1 + > >> libavformat/Makefile | 1 + > >> libavformat/allformats.c | 1 + > >> libavformat/flvdec.c | 86 ++++++++++++++++++++++++++++++++++++++++ > >> libavformat/version.h | 2 +- > >> 5 files changed, 90 insertions(+), 1 deletion(-) > >> > >>diff --git a/Changelog b/Changelog > >>index 8c866cd0c2..8caaab53c2 100644 > >>--- a/Changelog > >>+++ b/Changelog > >>@@ -22,6 +22,7 @@ version <next>: > >> - removed libndi-newtek > >> - agm decoder > >> - KUX demuxer > >>+- XV (Xunlei Video) demuxer > >> version 4.1: > >>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..a56f5b448a 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,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 rot; > >>+ int i; > >>+ int64_t pos; > >>+ > >>+ //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 + 4, SEEK_SET); > >>+ > >>+ > >>+ // Will modify the current buffer, as only > >>+ // the bytes from 0x200000 to 0x200400 are needed to decode > >>+ pos = ic->pos + ic->buf_ptr - ic->buf_end; > >>+ for (i = 0; i < 0x400; i++) { > >>+ if (pos >= 0x200400) break; > >>+ ic->buf_ptr[i] = (ic->buf_ptr[i] + rot) & 0xff; > >>+ pos++; > >>+ } > >the demuxer should not manipulate the protocols /avio internal buffer. > >This would make the demuxer depend on how this buffer is implemented. > >Also the data that needs changes may not be in the buffer but be read > >later i think- > >It would be quite annoying for maintaince if changing the internal > >AVIO code would require updating the implementations of demuxers > > > >[...] > > > > Yeah, I realise that this would be hard to maintain. and would not work if > we change the structure of the AVIOContaxt. > > But, what is the best solution for this. I also tried to pass the avio read > calls back to a custom function. But then i don't have access to a rot > value, which is needed to rotate the bytes.
The avio stuff has a opaque pointer that allows you to access a structure of your choosing when its your own avio context. This struct could contain rot and the avio context for the parent to pass calls on > > Or, could you help me in providing some examples, where this kind of problem > arised in any other demuxer. iam not sure but maybe git grep avio_alloc_context points to something usefull [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB Those who would give up essential Liberty, to purchase a little temporary Safety, deserve neither Liberty nor Safety -- Benjamin Franklin
signature.asc
Description: PGP signature
_______________________________________________ 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".