diff mbox series

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

Message ID 20200419200647.16861-1-gautamramk@gmail.com
State New
Headers show
Series [FFmpeg-devel,RFC,v2] libavcodec/jpeg2000_parser: Add jpeg2000 parser
Related show

Checks

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

Commit Message

Gautam Ramakrishnan April 19, 2020, 8:06 p.m. UTC
From: Gautam Ramakrishnan <gautamramk@gmail.com>

I have attempted to write a JPEG2000 Parser. Need
help on testing the code and some tips on how to
document this code. The variable names are also
a bit hard to understand. Would appreciate some
tips. The sample from #7445 seems to get decoded
now.

Additionally, I have fixed a bug pointed by
Michael. This was because the EOC marker was
appearing inside comments.
---
 libavcodec/Makefile          |   1 +
 libavcodec/jpeg2000_parser.c | 156 +++++++++++++++++++++++++++++++++++
 libavcodec/parsers.c         |   1 +
 3 files changed, 158 insertions(+)
 create mode 100644 libavcodec/jpeg2000_parser.c

Comments

Michael Niedermayer April 20, 2020, 10:08 a.m. UTC | #1
On Mon, Apr 20, 2020 at 01:36:47AM +0530, gautamramk@gmail.com wrote:
> From: Gautam Ramakrishnan <gautamramk@gmail.com>
> 
> I have attempted to write a JPEG2000 Parser. Need
> help on testing the code and some tips on how to

to test the code i would sugest to generate a file
or files with many jpeg2000 images and then try to
decode it to -f framecrc
if that work repeat while varying the packet size
input to the parser, a parser must work with anything
from 1 byte per input to sizes being larger than a
single frame.

there can to be corner cases in parsers when input
split the wrong header value

thx

[...]
Kieran O Leary April 20, 2020, 10:22 a.m. UTC | #2
Hi,

Forgive my ignorance ,but what is the difference between a parser and a
decoder in this context? What does this parser add that wasn't covered in
the decoder?

Best,

Kieran O'Leary
Irish Film Institute
Gautam Ramakrishnan April 20, 2020, 10:43 a.m. UTC | #3
On Mon, Apr 20, 2020 at 3:38 PM Michael Niedermayer
<michael@niedermayer.cc> wrote:
>
> On Mon, Apr 20, 2020 at 01:36:47AM +0530, gautamramk@gmail.com wrote:
> > From: Gautam Ramakrishnan <gautamramk@gmail.com>
> >
> > I have attempted to write a JPEG2000 Parser. Need
> > help on testing the code and some tips on how to
>
> to test the code i would sugest to generate a file
> or files with many jpeg2000 images and then try to
> decode it to -f framecrc
This helps me check whether the image is correct by comparing the CRC value?
> if that work repeat while varying the packet size
> input to the parser, a parser must work with anything
> from 1 byte per input to sizes being larger than a
> single frame.
>
So a packet to a parser is basically a smaller unit to which the parser is fed
data to? When I tried printing buffer size during parse, it shows 4096.
Does that mean the packet size was 4096?
> there can to be corner cases in parsers when input
> split the wrong header value
>
> thx
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> Whats the most studid thing your enemy could do ? Blow himself up
> Whats the most studid thing you could do ? Give up your rights and
> freedom because your enemy blew himself up.
>
> _______________________________________________
> 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".
Paul B Mahol April 20, 2020, 10:54 a.m. UTC | #4
On 4/20/20, Kieran O Leary <kieran.o.leary@gmail.com> wrote:
> Hi,
>
> Forgive my ignorance ,but what is the difference between a parser and a
> decoder in this context? What does this parser add that wasn't covered in
> the decoder?

Bunch of stuff, like splitting packets.
Gautam Ramakrishnan April 20, 2020, 11:17 a.m. UTC | #5
On Mon, Apr 20, 2020 at 4:18 PM Kieran O Leary <kieran.o.leary@gmail.com> wrote:
>
> Hi,
>
> Forgive my ignorance ,but what is the difference between a parser and a
> decoder in this context? What does this parser add that wasn't covered in
> the decoder?
>
Quoting Carl from a previous thread:
Try the following:
$ cat 1.jpg 2.jpg | ffmpeg -i -f null -
(Is expected to decode two frames as can be seen in the console output,
also works for example with png)

$ cat 1.j2k 2.j2k | ffmpeg -i - -f null -
Will only decode one frame because there is no parser to split the
input.
> Best,
>
> Kieran O'Leary
> Irish Film Institute
> _______________________________________________
> 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 April 20, 2020, 10:11 p.m. UTC | #6
On Mon, Apr 20, 2020 at 04:13:44PM +0530, Gautam Ramakrishnan wrote:
> On Mon, Apr 20, 2020 at 3:38 PM Michael Niedermayer
> <michael@niedermayer.cc> wrote:
> >
> > On Mon, Apr 20, 2020 at 01:36:47AM +0530, gautamramk@gmail.com wrote:
> > > From: Gautam Ramakrishnan <gautamramk@gmail.com>
> > >
> > > I have attempted to write a JPEG2000 Parser. Need
> > > help on testing the code and some tips on how to
> >
> > to test the code i would sugest to generate a file
> > or files with many jpeg2000 images and then try to
> > decode it to -f framecrc
> This helps me check whether the image is correct by comparing the CRC value?
> > if that work repeat while varying the packet size
> > input to the parser, a parser must work with anything
> > from 1 byte per input to sizes being larger than a
> > single frame.
> >
> So a packet to a parser is basically a smaller unit to which the parser is fed
> data to? When I tried printing buffer size during parse, it shows 4096.

> Does that mean the packet size was 4096?

yes, that likely comes from 
libavformat/img2dec.c:            size[0] = 4096;

random pieces of bytes -> parser -> sequence of packets representing frames

thanks

[...]
Gautam Ramakrishnan May 20, 2020, 3:18 p.m. UTC | #7
On Tue, Apr 21, 2020 at 3:41 AM Michael Niedermayer
<michael@niedermayer.cc> wrote:
>
> On Mon, Apr 20, 2020 at 04:13:44PM +0530, Gautam Ramakrishnan wrote:
> > On Mon, Apr 20, 2020 at 3:38 PM Michael Niedermayer
> > <michael@niedermayer.cc> wrote:
> > >
> > > On Mon, Apr 20, 2020 at 01:36:47AM +0530, gautamramk@gmail.com wrote:
> > > > From: Gautam Ramakrishnan <gautamramk@gmail.com>
> > > >
> > > > I have attempted to write a JPEG2000 Parser. Need
> > > > help on testing the code and some tips on how to
> > >
> > > to test the code i would sugest to generate a file
> > > or files with many jpeg2000 images and then try to
> > > decode it to -f framecrc
> > This helps me check whether the image is correct by comparing the CRC value?
> > > if that work repeat while varying the packet size
> > > input to the parser, a parser must work with anything
> > > from 1 byte per input to sizes being larger than a
> > > single frame.
> > >
> > So a packet to a parser is basically a smaller unit to which the parser is fed
> > data to? When I tried printing buffer size during parse, it shows 4096.
>
> > Does that mean the packet size was 4096?
>
> yes, that likely comes from
> libavformat/img2dec.c:            size[0] = 4096;
From my understanding of the documentation, the -packetsize option can
change the
value from 4096 to any particular I want right? However when I try setting the
-packetsize option, the buf_size variable still shows up as 4096.
>
> random pieces of bytes -> parser -> sequence of packets representing frames
>
> thanks
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> If you drop bombs on a foreign country and kill a hundred thousand
> innocent people, expect your government to call the consequence
> "unprovoked inhuman terrorist attacks" and use it to justify dropping
> more bombs and killing more people. The technology changed, the idea is old.
> _______________________________________________
> 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 20, 2020, 8:21 p.m. UTC | #8
On Wed, May 20, 2020 at 08:48:41PM +0530, Gautam Ramakrishnan wrote:
> On Tue, Apr 21, 2020 at 3:41 AM Michael Niedermayer
> <michael@niedermayer.cc> wrote:
> >
> > On Mon, Apr 20, 2020 at 04:13:44PM +0530, Gautam Ramakrishnan wrote:
> > > On Mon, Apr 20, 2020 at 3:38 PM Michael Niedermayer
> > > <michael@niedermayer.cc> wrote:
> > > >
> > > > On Mon, Apr 20, 2020 at 01:36:47AM +0530, gautamramk@gmail.com wrote:
> > > > > From: Gautam Ramakrishnan <gautamramk@gmail.com>
> > > > >
> > > > > I have attempted to write a JPEG2000 Parser. Need
> > > > > help on testing the code and some tips on how to
> > > >
> > > > to test the code i would sugest to generate a file
> > > > or files with many jpeg2000 images and then try to
> > > > decode it to -f framecrc
> > > This helps me check whether the image is correct by comparing the CRC value?
> > > > if that work repeat while varying the packet size
> > > > input to the parser, a parser must work with anything
> > > > from 1 byte per input to sizes being larger than a
> > > > single frame.
> > > >
> > > So a packet to a parser is basically a smaller unit to which the parser is fed
> > > data to? When I tried printing buffer size during parse, it shows 4096.
> >
> > > Does that mean the packet size was 4096?
> >
> > yes, that likely comes from
> > libavformat/img2dec.c:            size[0] = 4096;
> From my understanding of the documentation, the -packetsize option can
> change the
> value from 4096 to any particular I want right? However when I try setting the
> -packetsize option, the buf_size variable still shows up as 4096.

img2dec hardcodes 4096, thats something you could change of course.
packetsize currently is listed with AV_OPT_FLAG_ENCODING_PARAM so its a muxer
option. Some demuxers seem to set packet_size though instead of using it as
input from the user
The header does not document packet_size with any detail

Its probably best to add a new AVOption to img2dec to adjust the 4096

also improving the documentation is certainly not a bad idea

Thanks

[...]
Gautam Ramakrishnan May 21, 2020, 4:56 p.m. UTC | #9
On Thu, May 21, 2020 at 1:51 AM Michael Niedermayer
<michael@niedermayer.cc> wrote:
>
> On Wed, May 20, 2020 at 08:48:41PM +0530, Gautam Ramakrishnan wrote:
> > On Tue, Apr 21, 2020 at 3:41 AM Michael Niedermayer
> > <michael@niedermayer.cc> wrote:
> > >
> > > On Mon, Apr 20, 2020 at 04:13:44PM +0530, Gautam Ramakrishnan wrote:
> > > > On Mon, Apr 20, 2020 at 3:38 PM Michael Niedermayer
> > > > <michael@niedermayer.cc> wrote:
> > > > >
> > > > > On Mon, Apr 20, 2020 at 01:36:47AM +0530, gautamramk@gmail.com wrote:
> > > > > > From: Gautam Ramakrishnan <gautamramk@gmail.com>
> > > > > >
> > > > > > I have attempted to write a JPEG2000 Parser. Need
> > > > > > help on testing the code and some tips on how to
> > > > >
> > > > > to test the code i would sugest to generate a file
> > > > > or files with many jpeg2000 images and then try to
> > > > > decode it to -f framecrc
> > > > This helps me check whether the image is correct by comparing the CRC value?
> > > > > if that work repeat while varying the packet size
> > > > > input to the parser, a parser must work with anything
> > > > > from 1 byte per input to sizes being larger than a
> > > > > single frame.
> > > > >
> > > > So a packet to a parser is basically a smaller unit to which the parser is fed
> > > > data to? When I tried printing buffer size during parse, it shows 4096.
> > >
> > > > Does that mean the packet size was 4096?
> > >
> > > yes, that likely comes from
> > > libavformat/img2dec.c:            size[0] = 4096;
> > From my understanding of the documentation, the -packetsize option can
> > change the
> > value from 4096 to any particular I want right? However when I try setting the
> > -packetsize option, the buf_size variable still shows up as 4096.
>
> img2dec hardcodes 4096, thats something you could change of course.
> packetsize currently is listed with AV_OPT_FLAG_ENCODING_PARAM so its a muxer
> option. Some demuxers seem to set packet_size though instead of using it as
> input from the user
> The header does not document packet_size with any detail
>
> Its probably best to add a new AVOption to img2dec to adjust the 4096
This would make debugging easy in general. Probably should start with this
>
> also improving the documentation is certainly not a bad idea
>
> Thanks
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> What does censorship reveal? It reveals fear. -- Julian Assange
> _______________________________________________
> 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".
Carl Eugen Hoyos May 21, 2020, 7:42 p.m. UTC | #10
Am Mi., 20. Mai 2020 um 22:21 Uhr schrieb Michael Niedermayer
<michael@niedermayer.cc>:
>
> On Wed, May 20, 2020 at 08:48:41PM +0530, Gautam Ramakrishnan wrote:
> > On Tue, Apr 21, 2020 at 3:41 AM Michael Niedermayer
> > <michael@niedermayer.cc> wrote:
> > >
> > > On Mon, Apr 20, 2020 at 04:13:44PM +0530, Gautam Ramakrishnan wrote:
> > > > On Mon, Apr 20, 2020 at 3:38 PM Michael Niedermayer
> > > > <michael@niedermayer.cc> wrote:
> > > > >
> > > > > On Mon, Apr 20, 2020 at 01:36:47AM +0530, gautamramk@gmail.com wrote:
> > > > > > From: Gautam Ramakrishnan <gautamramk@gmail.com>
> > > > > >
> > > > > > I have attempted to write a JPEG2000 Parser. Need
> > > > > > help on testing the code and some tips on how to
> > > > >
> > > > > to test the code i would sugest to generate a file
> > > > > or files with many jpeg2000 images and then try to
> > > > > decode it to -f framecrc
> > > > This helps me check whether the image is correct by comparing the CRC value?
> > > > > if that work repeat while varying the packet size
> > > > > input to the parser, a parser must work with anything
> > > > > from 1 byte per input to sizes being larger than a
> > > > > single frame.
> > > > >
> > > > So a packet to a parser is basically a smaller unit to which the parser is fed
> > > > data to? When I tried printing buffer size during parse, it shows 4096.
> > >
> > > > Does that mean the packet size was 4096?
> > >
> > > yes, that likely comes from
> > > libavformat/img2dec.c:            size[0] = 4096;
> > From my understanding of the documentation, the -packetsize option can
> > change the
> > value from 4096 to any particular I want right? However when I try setting the
> > -packetsize option, the buf_size variable still shows up as 4096.
>
> img2dec hardcodes 4096, thats something you could change of course.
> packetsize currently is listed with AV_OPT_FLAG_ENCODING_PARAM so its a muxer
> option. Some demuxers seem to set packet_size though instead of using it as
> input from the user
> The header does not document packet_size with any detail
>
> Its probably best to add a new AVOption to img2dec to adjust the 4096

Can't the image2pipe demuxer option -frame_size be used instead?

Carl Eugen
Michael Niedermayer May 22, 2020, 7:37 p.m. UTC | #11
On Thu, May 21, 2020 at 09:42:18PM +0200, Carl Eugen Hoyos wrote:
> Am Mi., 20. Mai 2020 um 22:21 Uhr schrieb Michael Niedermayer
> <michael@niedermayer.cc>:
> >
> > On Wed, May 20, 2020 at 08:48:41PM +0530, Gautam Ramakrishnan wrote:
> > > On Tue, Apr 21, 2020 at 3:41 AM Michael Niedermayer
> > > <michael@niedermayer.cc> wrote:
> > > >
> > > > On Mon, Apr 20, 2020 at 04:13:44PM +0530, Gautam Ramakrishnan wrote:
> > > > > On Mon, Apr 20, 2020 at 3:38 PM Michael Niedermayer
> > > > > <michael@niedermayer.cc> wrote:
> > > > > >
> > > > > > On Mon, Apr 20, 2020 at 01:36:47AM +0530, gautamramk@gmail.com wrote:
> > > > > > > From: Gautam Ramakrishnan <gautamramk@gmail.com>
> > > > > > >
> > > > > > > I have attempted to write a JPEG2000 Parser. Need
> > > > > > > help on testing the code and some tips on how to
> > > > > >
> > > > > > to test the code i would sugest to generate a file
> > > > > > or files with many jpeg2000 images and then try to
> > > > > > decode it to -f framecrc
> > > > > This helps me check whether the image is correct by comparing the CRC value?
> > > > > > if that work repeat while varying the packet size
> > > > > > input to the parser, a parser must work with anything
> > > > > > from 1 byte per input to sizes being larger than a
> > > > > > single frame.
> > > > > >
> > > > > So a packet to a parser is basically a smaller unit to which the parser is fed
> > > > > data to? When I tried printing buffer size during parse, it shows 4096.
> > > >
> > > > > Does that mean the packet size was 4096?
> > > >
> > > > yes, that likely comes from
> > > > libavformat/img2dec.c:            size[0] = 4096;
> > > From my understanding of the documentation, the -packetsize option can
> > > change the
> > > value from 4096 to any particular I want right? However when I try setting the
> > > -packetsize option, the buf_size variable still shows up as 4096.
> >
> > img2dec hardcodes 4096, thats something you could change of course.
> > packetsize currently is listed with AV_OPT_FLAG_ENCODING_PARAM so its a muxer
> > option. Some demuxers seem to set packet_size though instead of using it as
> > input from the user
> > The header does not document packet_size with any detail
> >
> > Its probably best to add a new AVOption to img2dec to adjust the 4096
> 
> Can't the image2pipe demuxer option -frame_size be used instead?

yes, indeed, that should work

thanks

[...]
Gautam Ramakrishnan May 23, 2020, 12:17 p.m. UTC | #12
On Sat, May 23, 2020 at 1:08 AM Michael Niedermayer
<michael@niedermayer.cc> wrote:
>
> On Thu, May 21, 2020 at 09:42:18PM +0200, Carl Eugen Hoyos wrote:
> > Am Mi., 20. Mai 2020 um 22:21 Uhr schrieb Michael Niedermayer
> > <michael@niedermayer.cc>:
> > >
> > > On Wed, May 20, 2020 at 08:48:41PM +0530, Gautam Ramakrishnan wrote:
> > > > On Tue, Apr 21, 2020 at 3:41 AM Michael Niedermayer
> > > > <michael@niedermayer.cc> wrote:
> > > > >
> > > > > On Mon, Apr 20, 2020 at 04:13:44PM +0530, Gautam Ramakrishnan wrote:
> > > > > > On Mon, Apr 20, 2020 at 3:38 PM Michael Niedermayer
> > > > > > <michael@niedermayer.cc> wrote:
> > > > > > >
> > > > > > > On Mon, Apr 20, 2020 at 01:36:47AM +0530, gautamramk@gmail.com wrote:
> > > > > > > > From: Gautam Ramakrishnan <gautamramk@gmail.com>
> > > > > > > >
> > > > > > > > I have attempted to write a JPEG2000 Parser. Need
> > > > > > > > help on testing the code and some tips on how to
> > > > > > >
> > > > > > > to test the code i would sugest to generate a file
> > > > > > > or files with many jpeg2000 images and then try to
> > > > > > > decode it to -f framecrc
> > > > > > This helps me check whether the image is correct by comparing the CRC value?
> > > > > > > if that work repeat while varying the packet size
> > > > > > > input to the parser, a parser must work with anything
> > > > > > > from 1 byte per input to sizes being larger than a
> > > > > > > single frame.
> > > > > > >
> > > > > > So a packet to a parser is basically a smaller unit to which the parser is fed
> > > > > > data to? When I tried printing buffer size during parse, it shows 4096.
> > > > >
> > > > > > Does that mean the packet size was 4096?
> > > > >
> > > > > yes, that likely comes from
> > > > > libavformat/img2dec.c:            size[0] = 4096;
> > > > From my understanding of the documentation, the -packetsize option can
> > > > change the
> > > > value from 4096 to any particular I want right? However when I try setting the
> > > > -packetsize option, the buf_size variable still shows up as 4096.
> > >
> > > img2dec hardcodes 4096, thats something you could change of course.
> > > packetsize currently is listed with AV_OPT_FLAG_ENCODING_PARAM so its a muxer
> > > option. Some demuxers seem to set packet_size though instead of using it as
> > > input from the user
> > > The header does not document packet_size with any detail
> > >
> > > Its probably best to add a new AVOption to img2dec to adjust the 4096
> >
> > Can't the image2pipe demuxer option -frame_size be used instead?
>
> yes, indeed, that should work
I'll try using this then, thanks
>
> thanks
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> I have never wished to cater to the crowd; for what I know they do not
> approve, and what they approve I do not know. -- Epicurus
> _______________________________________________
> 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 88944d9a3a..dedd7a0429 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -1062,6 +1062,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..3d6bbe8ef7
--- /dev/null
+++ b/libavcodec/jpeg2000_parser.c
@@ -0,0 +1,156 @@ 
+/*
+ * 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"
+
+typedef struct JPEG2000ParserContext{
+    ParseContext pc;
+    uint64_t bytes_read;
+    uint64_t fheader_state;
+    uint16_t skip_bytes; // ignore any bytes in comments of codestream
+    uint8_t fheader_read;
+    uint8_t frame_type; // 1 if file, 2 if codestream
+    uint8_t reading_file_header;
+    uint8_t skipped_codestream;
+    uint8_t codestream_frame_end;
+}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->frame_type = 0;
+    m->skipped_codestream = 0;
+    m->fheader_read = 0;
+    m->fheader_state = 0;
+    m->reading_file_header = 0;
+    m->codestream_frame_end = 0;
+    m->skip_bytes = 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;
+    state= pc->state;
+
+    if (buf_size == 0) {
+        return 0;
+    }
+
+    for (i = 0; i < buf_size; i++) {
+        state = state << 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->reading_file_header) {
+            m->fheader_state = m->fheader_state << 8 | buf[i];
+            m->fheader_read++;
+            if (m->fheader_read == 8) {
+                if (m->fheader_state == 0x6A5020200D0A870A) {
+                    if (pc->frame_start_found) {
+                        pc->frame_start_found = 0;
+                        reset_context(m);
+                        return i - 11;
+                    } else {
+                        pc->frame_start_found = 1;
+                        m->frame_type = 1;
+                    }
+                }
+                m->reading_file_header = 0;
+                m->fheader_read = 0;
+            }
+        }
+        if (state == 0x0000000C && m->bytes_read >= 3) {
+            m->reading_file_header = 1;
+        } else if ((state & 0xFFFF) == 0xFF4F) {
+            if (!pc->frame_start_found) {
+                pc->frame_start_found = 1;
+                m->frame_type = 2;
+            } else if (pc->frame_start_found && m->frame_type == 1 && m->skipped_codestream) {
+                reset_context(m);
+                return i - 1;
+            }
+        } else if ((state & 0xFFFF) == 0xFFD9) {
+            if (pc->frame_start_found && m->frame_type == 1) {
+                m->skipped_codestream = 1;
+            } else if (pc->frame_start_found && m->frame_type == 2) {
+                m->codestream_frame_end = 1;
+            }
+        } else if (pc->frame_start_found && (state & 0xFFFF0000) == 0xFF640000) {
+            m->skip_bytes = (state & 0xFFFF);
+        }
+    }
+
+    pc->state= state;
+    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;