diff mbox series

[FFmpeg-devel,RFC] libavcodec/jpeg2000_parser: Add jpeg2000 parser

Message ID 20200528190301.16120-1-gautamramk@gmail.com
State Superseded
Headers show
Series [FFmpeg-devel,RFC] libavcodec/jpeg2000_parser: Add jpeg2000 parser | expand

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

Gautam Ramakrishnan May 28, 2020, 7:03 p.m. UTC
From: Gautam Ramakrishnan <gautamramk@gmail.com>

I have attempted to write a JPEG2000 Parser. Have tested
by generating a file containing 14 frames, as mentioned
by Micheal. Have also tried testing with various packet
sizes by setting -frame_size option. Need feedback on the
code and on further testing.
---
 libavcodec/Makefile          |   1 +
 libavcodec/jpeg2000_parser.c | 190 +++++++++++++++++++++++++++++++++++
 libavcodec/parsers.c         |   1 +
 3 files changed, 192 insertions(+)
 create mode 100644 libavcodec/jpeg2000_parser.c

Comments

Michael Niedermayer May 28, 2020, 11:31 p.m. UTC | #1
On Fri, May 29, 2020 at 12:33:01AM +0530, gautamramk@gmail.com wrote:
> From: Gautam Ramakrishnan <gautamramk@gmail.com>
> 
> I have attempted to write a JPEG2000 Parser. Have tested
> by generating a file containing 14 frames, as mentioned
> by Micheal. Have also tried testing with various packet
> sizes by setting -frame_size option. Need feedback on the
> code and on further testing.
> ---
>  libavcodec/Makefile          |   1 +
>  libavcodec/jpeg2000_parser.c | 190 +++++++++++++++++++++++++++++++++++
>  libavcodec/parsers.c         |   1 +
>  3 files changed, 192 insertions(+)
>  create mode 100644 libavcodec/jpeg2000_parser.c

can you add some test to fate for this ?
(doesnt need to be related to the tests you did, but can of course)
such a test would also make it easy for others to test the code on
less common hardware like big endian ...
This can also be very simple test if its not easy


> 
> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
> index d0917a656f..1f7c91a91b 100644
> --- a/libavcodec/Makefile
> +++ b/libavcodec/Makefile
> @@ -1073,6 +1073,7 @@ OBJS-$(CONFIG_H261_PARSER)             += h261_parser.o
>  OBJS-$(CONFIG_H263_PARSER)             += h263_parser.o
>  OBJS-$(CONFIG_H264_PARSER)             += h264_parser.o h264_sei.o h264data.o
>  OBJS-$(CONFIG_HEVC_PARSER)             += hevc_parser.o hevc_data.o
> +OBJS-$(CONFIG_JPEG2000_PARSER)         += jpeg2000_parser.o
>  OBJS-$(CONFIG_MJPEG_PARSER)            += mjpeg_parser.o
>  OBJS-$(CONFIG_MLP_PARSER)              += mlp_parse.o mlp_parser.o mlp.o
>  OBJS-$(CONFIG_MPEG4VIDEO_PARSER)       += mpeg4video_parser.o h263.o \
> diff --git a/libavcodec/jpeg2000_parser.c b/libavcodec/jpeg2000_parser.c
> new file mode 100644
> index 0000000000..c28b694219

> --- /dev/null
> +++ b/libavcodec/jpeg2000_parser.c
> @@ -0,0 +1,190 @@
> +/*
> + * JPEG2000 parser

> + * Copyright (c) 2000, 2001 Fabrice Bellard

Thats ok if you used code from fabrice but you probably want to
add your name assuming you wrote the parser

[...]

thx
Gautam Ramakrishnan May 29, 2020, 3:40 p.m. UTC | #2
On Fri, May 29, 2020 at 5:01 AM Michael Niedermayer
<michael@niedermayer.cc> wrote:
>
> On Fri, May 29, 2020 at 12:33:01AM +0530, gautamramk@gmail.com wrote:
> > From: Gautam Ramakrishnan <gautamramk@gmail.com>
> >
> > I have attempted to write a JPEG2000 Parser. Have tested
> > by generating a file containing 14 frames, as mentioned
> > by Micheal. Have also tried testing with various packet
> > sizes by setting -frame_size option. Need feedback on the
> > code and on further testing.
> > ---
> >  libavcodec/Makefile          |   1 +
> >  libavcodec/jpeg2000_parser.c | 190 +++++++++++++++++++++++++++++++++++
> >  libavcodec/parsers.c         |   1 +
> >  3 files changed, 192 insertions(+)
> >  create mode 100644 libavcodec/jpeg2000_parser.c
>
> can you add some test to fate for this ?
> (doesnt need to be related to the tests you did, but can of course)
> such a test would also make it easy for others to test the code on
> less common hardware like big endian ...
> This can also be very simple test if its not easy
I'll look into FATE
>
>
> >
> > diff --git a/libavcodec/Makefile b/libavcodec/Makefile
> > index d0917a656f..1f7c91a91b 100644
> > --- a/libavcodec/Makefile
> > +++ b/libavcodec/Makefile
> > @@ -1073,6 +1073,7 @@ OBJS-$(CONFIG_H261_PARSER)             += h261_parser.o
> >  OBJS-$(CONFIG_H263_PARSER)             += h263_parser.o
> >  OBJS-$(CONFIG_H264_PARSER)             += h264_parser.o h264_sei.o h264data.o
> >  OBJS-$(CONFIG_HEVC_PARSER)             += hevc_parser.o hevc_data.o
> > +OBJS-$(CONFIG_JPEG2000_PARSER)         += jpeg2000_parser.o
> >  OBJS-$(CONFIG_MJPEG_PARSER)            += mjpeg_parser.o
> >  OBJS-$(CONFIG_MLP_PARSER)              += mlp_parse.o mlp_parser.o mlp.o
> >  OBJS-$(CONFIG_MPEG4VIDEO_PARSER)       += mpeg4video_parser.o h263.o \
> > diff --git a/libavcodec/jpeg2000_parser.c b/libavcodec/jpeg2000_parser.c
> > new file mode 100644
> > index 0000000000..c28b694219
>
> > --- /dev/null
> > +++ b/libavcodec/jpeg2000_parser.c
> > @@ -0,0 +1,190 @@
> > +/*
> > + * JPEG2000 parser
>
> > + * Copyright (c) 2000, 2001 Fabrice Bellard
>
> Thats ok if you used code from fabrice but you probably want to
> add your name assuming you wrote the parser
Missed that out :)
>
> [...]
>
> thx
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> The smallest minority on earth is the individual. Those who deny
> individual rights cannot claim to be defenders of minorities. - Ayn Rand
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Gautam Ramakrishnan May 29, 2020, 5:53 p.m. UTC | #3
On Fri, May 29, 2020 at 5:01 AM Michael Niedermayer
<michael@niedermayer.cc> wrote:
>
> On Fri, May 29, 2020 at 12:33:01AM +0530, gautamramk@gmail.com wrote:
> > From: Gautam Ramakrishnan <gautamramk@gmail.com>
> >
> > I have attempted to write a JPEG2000 Parser. Have tested
> > by generating a file containing 14 frames, as mentioned
> > by Micheal. Have also tried testing with various packet
> > sizes by setting -frame_size option. Need feedback on the
> > code and on further testing.
> > ---
> >  libavcodec/Makefile          |   1 +
> >  libavcodec/jpeg2000_parser.c | 190 +++++++++++++++++++++++++++++++++++
> >  libavcodec/parsers.c         |   1 +
> >  3 files changed, 192 insertions(+)
> >  create mode 100644 libavcodec/jpeg2000_parser.c
>
> can you add some test to fate for this ?
> (doesnt need to be related to the tests you did, but can of course)
> such a test would also make it easy for others to test the code on
> less common hardware like big endian ...
> This can also be very simple test if its not easy
Small doubt, so the jpeg2000 stream to be parsed goes in the
test-suite directory and the corresponding framecrc goes into the
test/ref directory? Is my understanding right?
>
>
> >
> > diff --git a/libavcodec/Makefile b/libavcodec/Makefile
> > index d0917a656f..1f7c91a91b 100644
> > --- a/libavcodec/Makefile
> > +++ b/libavcodec/Makefile
> > @@ -1073,6 +1073,7 @@ OBJS-$(CONFIG_H261_PARSER)             += h261_parser.o
> >  OBJS-$(CONFIG_H263_PARSER)             += h263_parser.o
> >  OBJS-$(CONFIG_H264_PARSER)             += h264_parser.o h264_sei.o h264data.o
> >  OBJS-$(CONFIG_HEVC_PARSER)             += hevc_parser.o hevc_data.o
> > +OBJS-$(CONFIG_JPEG2000_PARSER)         += jpeg2000_parser.o
> >  OBJS-$(CONFIG_MJPEG_PARSER)            += mjpeg_parser.o
> >  OBJS-$(CONFIG_MLP_PARSER)              += mlp_parse.o mlp_parser.o mlp.o
> >  OBJS-$(CONFIG_MPEG4VIDEO_PARSER)       += mpeg4video_parser.o h263.o \
> > diff --git a/libavcodec/jpeg2000_parser.c b/libavcodec/jpeg2000_parser.c
> > new file mode 100644
> > index 0000000000..c28b694219
>
> > --- /dev/null
> > +++ b/libavcodec/jpeg2000_parser.c
> > @@ -0,0 +1,190 @@
> > +/*
> > + * JPEG2000 parser
>
> > + * Copyright (c) 2000, 2001 Fabrice Bellard
>
> Thats ok if you used code from fabrice but you probably want to
> add your name assuming you wrote the parser
>
> [...]
>
> thx
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> The smallest minority on earth is the individual. Those who deny
> individual rights cannot claim to be defenders of minorities. - Ayn Rand
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Michael Niedermayer May 29, 2020, 6:24 p.m. UTC | #4
On Fri, May 29, 2020 at 11:23:20PM +0530, Gautam Ramakrishnan wrote:
> On Fri, May 29, 2020 at 5:01 AM Michael Niedermayer
> <michael@niedermayer.cc> wrote:
> >
> > On Fri, May 29, 2020 at 12:33:01AM +0530, gautamramk@gmail.com wrote:
> > > From: Gautam Ramakrishnan <gautamramk@gmail.com>
> > >
> > > I have attempted to write a JPEG2000 Parser. Have tested
> > > by generating a file containing 14 frames, as mentioned
> > > by Micheal. Have also tried testing with various packet
> > > sizes by setting -frame_size option. Need feedback on the
> > > code and on further testing.
> > > ---
> > >  libavcodec/Makefile          |   1 +
> > >  libavcodec/jpeg2000_parser.c | 190 +++++++++++++++++++++++++++++++++++
> > >  libavcodec/parsers.c         |   1 +
> > >  3 files changed, 192 insertions(+)
> > >  create mode 100644 libavcodec/jpeg2000_parser.c
> >
> > can you add some test to fate for this ?
> > (doesnt need to be related to the tests you did, but can of course)
> > such a test would also make it easy for others to test the code on
> > less common hardware like big endian ...
> > This can also be very simple test if its not easy
> Small doubt, so the jpeg2000 stream to be parsed goes in the
> test-suite directory and the corresponding framecrc goes into the
> test/ref directory? Is my understanding right?

ideally the teststream is generated by our muxers / encoders, that way 
it doesnt need to be added to the fate suite
and it also teste more code as a side effect

thx

[...]
Gautam Ramakrishnan June 1, 2020, 7:01 p.m. UTC | #5
On Fri, May 29, 2020 at 11:54 PM Michael Niedermayer
<michael@niedermayer.cc> wrote:
>
> On Fri, May 29, 2020 at 11:23:20PM +0530, Gautam Ramakrishnan wrote:
> > On Fri, May 29, 2020 at 5:01 AM Michael Niedermayer
> > <michael@niedermayer.cc> wrote:
> > >
> > > On Fri, May 29, 2020 at 12:33:01AM +0530, gautamramk@gmail.com wrote:
> > > > From: Gautam Ramakrishnan <gautamramk@gmail.com>
> > > >
> > > > I have attempted to write a JPEG2000 Parser. Have tested
> > > > by generating a file containing 14 frames, as mentioned
> > > > by Micheal. Have also tried testing with various packet
> > > > sizes by setting -frame_size option. Need feedback on the
> > > > code and on further testing.
> > > > ---
> > > >  libavcodec/Makefile          |   1 +
> > > >  libavcodec/jpeg2000_parser.c | 190 +++++++++++++++++++++++++++++++++++
> > > >  libavcodec/parsers.c         |   1 +
> > > >  3 files changed, 192 insertions(+)
> > > >  create mode 100644 libavcodec/jpeg2000_parser.c
> > >
> > > can you add some test to fate for this ?
> > > (doesnt need to be related to the tests you did, but can of course)
> > > such a test would also make it easy for others to test the code on
> > > less common hardware like big endian ...
> > > This can also be very simple test if its not easy
> > Small doubt, so the jpeg2000 stream to be parsed goes in the
> > test-suite directory and the corresponding framecrc goes into the
> > test/ref directory? Is my understanding right?
>
> ideally the teststream is generated by our muxers / encoders, that way
> it doesnt need to be added to the fate suite
> and it also teste more code as a side effect
I did not understand this clearly. Do you mean the test should take some
images already there in the test-suite, create a teststream, and run the test
on that teststream?
>
> thx
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> Take away the freedom of one citizen and you will be jailed, take away
> the freedom of all citizens and you will be congratulated by your peers
> in Parliament.
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".


https://trac.ffmpeg.org/wiki/FATE/AddingATest
Is this what I should be looking at?
Carl Eugen Hoyos June 1, 2020, 7:28 p.m. UTC | #6
Am Mo., 1. Juni 2020 um 21:26 Uhr schrieb Gautam Ramakrishnan
<gautamramk@gmail.com>:

> > > > can you add some test to fate for this ?
> > > > (doesnt need to be related to the tests you did, but can of course)
> > > > such a test would also make it easy for others to test the code on
> > > > less common hardware like big endian ...
> > > > This can also be very simple test if its not easy
> > > Small doubt, so the jpeg2000 stream to be parsed goes in the
> > > test-suite directory and the corresponding framecrc goes into the
> > > test/ref directory? Is my understanding right?
> >
> > ideally the teststream is generated by our muxers / encoders, that way
> > it doesnt need to be added to the fate suite
> > and it also teste more code as a side effect
> I did not understand this clearly. Do you mean the test should take some
> images already there in the test-suite, create a teststream, and run the test
> on that teststream?

This is possible but using -f lavfi -i testsr2 as input may be simpler.

Carl Eugen
Gautam Ramakrishnan June 2, 2020, 7:19 p.m. UTC | #7
On Tue, Jun 2, 2020 at 1:55 AM Carl Eugen Hoyos <ceffmpeg@gmail.com> wrote:
>
> Am Mo., 1. Juni 2020 um 21:26 Uhr schrieb Gautam Ramakrishnan
> <gautamramk@gmail.com>:
>
> > > > > can you add some test to fate for this ?
> > > > > (doesnt need to be related to the tests you did, but can of course)
> > > > > such a test would also make it easy for others to test the code on
> > > > > less common hardware like big endian ...
> > > > > This can also be very simple test if its not easy
> > > > Small doubt, so the jpeg2000 stream to be parsed goes in the
> > > > test-suite directory and the corresponding framecrc goes into the
> > > > test/ref directory? Is my understanding right?
> > >
> > > ideally the teststream is generated by our muxers / encoders, that way
> > > it doesnt need to be added to the fate suite
> > > and it also teste more code as a side effect
> > I did not understand this clearly. Do you mean the test should take some
> > images already there in the test-suite, create a teststream, and run the test
> > on that teststream?
>
> This is possible but using -f lavfi -i testsr2 as input may be simpler.
I assume, this is the right link to refer to create the test
https://trac.ffmpeg.org/wiki/FATE/AddingATest
I could run the enc_dec_pcm, where I encode the
lavfi generated stream and decode it using jpeg2000 codec?
>
> Carl Eugen
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Michael Niedermayer June 2, 2020, 9:57 p.m. UTC | #8
On Wed, Jun 03, 2020 at 12:49:10AM +0530, Gautam Ramakrishnan wrote:
> On Tue, Jun 2, 2020 at 1:55 AM Carl Eugen Hoyos <ceffmpeg@gmail.com> wrote:
> >
> > Am Mo., 1. Juni 2020 um 21:26 Uhr schrieb Gautam Ramakrishnan
> > <gautamramk@gmail.com>:
> >
> > > > > > can you add some test to fate for this ?
> > > > > > (doesnt need to be related to the tests you did, but can of course)
> > > > > > such a test would also make it easy for others to test the code on
> > > > > > less common hardware like big endian ...
> > > > > > This can also be very simple test if its not easy
> > > > > Small doubt, so the jpeg2000 stream to be parsed goes in the
> > > > > test-suite directory and the corresponding framecrc goes into the
> > > > > test/ref directory? Is my understanding right?
> > > >
> > > > ideally the teststream is generated by our muxers / encoders, that way
> > > > it doesnt need to be added to the fate suite
> > > > and it also teste more code as a side effect
> > > I did not understand this clearly. Do you mean the test should take some
> > > images already there in the test-suite, create a teststream, and run the test
> > > on that teststream?
> >
> > This is possible but using -f lavfi -i testsr2 as input may be simpler.
> I assume, this is the right link to refer to create the test
> https://trac.ffmpeg.org/wiki/FATE/AddingATest

> I could run the enc_dec_pcm, where I encode the
> lavfi generated stream and decode it using jpeg2000 codec?

enc_dec_pcm is for audio, but maybe i misunderstand your suggestion

thx

[...]
Gautam Ramakrishnan June 3, 2020, 4:16 p.m. UTC | #9
On Wed, Jun 3, 2020 at 3:27 AM Michael Niedermayer
<michael@niedermayer.cc> wrote:
>
> On Wed, Jun 03, 2020 at 12:49:10AM +0530, Gautam Ramakrishnan wrote:
> > On Tue, Jun 2, 2020 at 1:55 AM Carl Eugen Hoyos <ceffmpeg@gmail.com> wrote:
> > >
> > > Am Mo., 1. Juni 2020 um 21:26 Uhr schrieb Gautam Ramakrishnan
> > > <gautamramk@gmail.com>:
> > >
> > > > > > > can you add some test to fate for this ?
> > > > > > > (doesnt need to be related to the tests you did, but can of course)
> > > > > > > such a test would also make it easy for others to test the code on
> > > > > > > less common hardware like big endian ...
> > > > > > > This can also be very simple test if its not easy
> > > > > > Small doubt, so the jpeg2000 stream to be parsed goes in the
> > > > > > test-suite directory and the corresponding framecrc goes into the
> > > > > > test/ref directory? Is my understanding right?
> > > > >
> > > > > ideally the teststream is generated by our muxers / encoders, that way
> > > > > it doesnt need to be added to the fate suite
> > > > > and it also teste more code as a side effect
> > > > I did not understand this clearly. Do you mean the test should take some
> > > > images already there in the test-suite, create a teststream, and run the test
> > > > on that teststream?
> > >
> > > This is possible but using -f lavfi -i testsr2 as input may be simpler.
> > I assume, this is the right link to refer to create the test
> > https://trac.ffmpeg.org/wiki/FATE/AddingATest
>
> > I could run the enc_dec_pcm, where I encode the
> > lavfi generated stream and decode it using jpeg2000 codec?
>
> enc_dec_pcm is for audio, but maybe i misunderstand your suggestion
>
So my plan for the test was, to create a rawvideo consisting of JPEG2000 frames.
These frames would be generated using lavfi.
An example command would be:
ffmpeg  -f lavfi -i "testsrc2=s=640x480" -t 1 -c:v jpeg2000 -f
rawvideo parser_trial.rawvideo
The parser could be tested by trying to decode parser_trial.rawvideo
to framecrc.

To translate this into a test, I thought of using the enc_dec command.
However, I am unable
to pass lavfi stream as an input as it assumes that a filename is being passed.
What is a possible solution for this? Can I fix fate-run.sh so that if
the source format is lavfi
do not convert the parameter to a path?
The documentation for adding a test was slightly underwritten, so I
have inferred whatever I can
by reading the code.
> thx
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> Concerning the gods, I have no means of knowing whether they exist or not
> or of what sort they may be, because of the obscurity of the subject, and
> the brevity of human life -- Protagoras
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
diff mbox series

Patch

diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index d0917a656f..1f7c91a91b 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -1073,6 +1073,7 @@  OBJS-$(CONFIG_H261_PARSER)             += h261_parser.o
 OBJS-$(CONFIG_H263_PARSER)             += h263_parser.o
 OBJS-$(CONFIG_H264_PARSER)             += h264_parser.o h264_sei.o h264data.o
 OBJS-$(CONFIG_HEVC_PARSER)             += hevc_parser.o hevc_data.o
+OBJS-$(CONFIG_JPEG2000_PARSER)         += jpeg2000_parser.o
 OBJS-$(CONFIG_MJPEG_PARSER)            += mjpeg_parser.o
 OBJS-$(CONFIG_MLP_PARSER)              += mlp_parse.o mlp_parser.o mlp.o
 OBJS-$(CONFIG_MPEG4VIDEO_PARSER)       += mpeg4video_parser.o h263.o \
diff --git a/libavcodec/jpeg2000_parser.c b/libavcodec/jpeg2000_parser.c
new file mode 100644
index 0000000000..c28b694219
--- /dev/null
+++ b/libavcodec/jpeg2000_parser.c
@@ -0,0 +1,190 @@ 
+/*
+ * JPEG2000 parser
+ * Copyright (c) 2000, 2001 Fabrice Bellard
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * JPEG2000 parser.
+ */
+
+#include "parser.h"
+
+/* Whether frame is jp2 file or codestream
+*/
+enum frame_type {
+    jp2_file = 1,
+    j2k_cstream
+};
+
+typedef struct JPEG2000ParserContext{
+    ParseContext pc;
+    uint64_t bytes_read;
+    uint64_t fheader_state;
+    uint32_t skip_bytes; // skip bytes inside codestream data
+    enum frame_type ft; // 1 if file, 2 if codestream
+    uint8_t fheader_read; // are we reading
+    uint8_t reading_file_header;
+    uint8_t skipped_codestream;
+    uint8_t codestream_frame_end;
+    uint8_t read_tp;
+    uint8_t in_codestream;
+}JPEG2000ParserContext;
+
+static inline void reset_context(JPEG2000ParserContext *m)
+{
+    ParseContext *pc = &m->pc;
+
+    pc->frame_start_found= 0;
+    pc->state = 0;
+    m->bytes_read = 0;
+    m->ft = 0;
+    m->skipped_codestream = 0;
+    m->fheader_read = 0;
+    m->codestream_frame_end = 0;
+    m->skip_bytes = 0;
+    m->read_tp = 0;
+    m->in_codestream = 0;
+}
+
+/* Returns 1 if marker has any data which can be skipped
+*/
+static uint8_t info_marker(uint16_t marker)
+{
+    if (marker == 0xFF92 || marker == 0xFF4F ||
+        marker == 0xFF90 || marker == 0xFF93 ||
+        marker == 0xFFD9)
+        return 0;
+    else
+        if (marker > 0xFF00) return 1;
+    return 0;
+}
+
+/**
+ * Find the end of the current frame in the bitstream.
+ * @return the position of the first byte of the next frame, or -1
+ */
+static int find_frame_end(JPEG2000ParserContext *m, const uint8_t *buf, int buf_size)
+{
+    ParseContext *pc= &m->pc;
+    int i;
+    uint32_t state;
+    uint64_t state64;
+    state= pc->state;
+    state64 = pc->state64;
+    if (buf_size == 0) {
+        return 0;
+    }
+
+    for (i = 0; i < buf_size; i++) {
+        state = state << 8 | buf[i];
+        state64 = state64 << 8 | buf[i];
+        m->bytes_read++;
+        if (m->skip_bytes) {
+            m->skip_bytes--;
+            continue;
+        }
+        if (m->codestream_frame_end) {
+            reset_context(m);
+            return i;
+        }
+        if (m->read_tp) { // Find out how many bytes inside Tile part codestream to skip.
+            if (m->read_tp == 1){
+                m->skip_bytes = (state64 & 0xFFFFFFFF) - 10 > 0?
+                                (state64 & 0xFFFFFFFF) - 10 : 0;
+            }
+            m->read_tp--;
+        }
+        if (m->fheader_read) {
+            if (m->fheader_read == 1) {
+                if (state64 == 0x6A5020200D0A870A) { // JP2 signature box value.
+                    if (pc->frame_start_found) {
+                        pc->frame_start_found = 0;
+                        reset_context(m);
+                        return i - 11;
+                    } else {
+                        pc->frame_start_found = 1;
+                        m->ft = jp2_file;
+                    }
+                }
+            }
+            m->fheader_read--;
+        }
+        if (state == 0x0000000C && m->bytes_read >= 3) { // Indicates start of JP2 file. Check signature next.
+            m->fheader_read = 8;
+        } else if ((state & 0xFFFF) == 0xFF4F) {
+            m->in_codestream = 1;
+            if (!pc->frame_start_found) {
+                pc->frame_start_found = 1;
+                m->ft = j2k_cstream;
+            } else if (pc->frame_start_found && m->ft == jp2_file && m->skipped_codestream) {
+                reset_context(m);
+                return i - 1;
+            }
+        } else if ((state & 0xFFFF) == 0xFFD9) {
+            if (pc->frame_start_found && m->ft == jp2_file) {
+                m->skipped_codestream = 1;
+            } else if (pc->frame_start_found && m->ft == j2k_cstream) {
+                m->codestream_frame_end = 1;
+            }
+            m->in_codestream = 0;
+        } else if (m->in_codestream && (state & 0xFFFF) == 0xFF90) { // Are we in tile part header?
+            m->read_tp = 8;
+        } else if (pc->frame_start_found && info_marker((state & 0xFFFF0000)>>16) && m->in_codestream) {
+            m->skip_bytes = (state & 0xFFFF) - 2;
+        }
+    }
+
+    pc->state = state;
+    pc->state64 = state64;
+    return END_NOT_FOUND;
+}
+
+static int jpeg2000_parse(AVCodecParserContext *s,
+                          AVCodecContext *avctx,
+                          const uint8_t **poutbuf, int *poutbuf_size,
+                          const uint8_t *buf, int buf_size)
+{
+    JPEG2000ParserContext *m = s->priv_data;
+    ParseContext *pc = &m->pc;
+    int next;
+
+    if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
+        next= buf_size;
+    }else{
+        next= find_frame_end(m, buf, buf_size);
+
+        if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) {
+            *poutbuf = NULL;
+            *poutbuf_size = 0;
+            return buf_size;
+        }
+    }
+
+    *poutbuf = buf;
+    *poutbuf_size = buf_size;
+    return next;
+}
+
+AVCodecParser ff_jpeg2000_parser = {
+    .codec_ids      = { AV_CODEC_ID_JPEG2000 },
+    .priv_data_size = sizeof(JPEG2000ParserContext),
+    .parser_parse   = jpeg2000_parse,
+    .parser_close   = ff_parse_close,
+};
\ No newline at end of file
diff --git a/libavcodec/parsers.c b/libavcodec/parsers.c
index 9fbf182594..7d75cea830 100644
--- a/libavcodec/parsers.c
+++ b/libavcodec/parsers.c
@@ -48,6 +48,7 @@  extern AVCodecParser ff_h261_parser;
 extern AVCodecParser ff_h263_parser;
 extern AVCodecParser ff_h264_parser;
 extern AVCodecParser ff_hevc_parser;
+extern AVCodecParser ff_jpeg2000_parser;
 extern AVCodecParser ff_mjpeg_parser;
 extern AVCodecParser ff_mlp_parser;
 extern AVCodecParser ff_mpeg4video_parser;