Message ID | 20200528190301.16120-1-gautamramk@gmail.com |
---|---|
State | Superseded |
Headers | show |
Series | [FFmpeg-devel,RFC] libavcodec/jpeg2000_parser: Add jpeg2000 parser | expand |
Context | Check | Description |
---|---|---|
andriy/default | pending | |
andriy/make | success | Make finished |
andriy/make_fate | success | Make fate finished |
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
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".
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".
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 [...]
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?
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
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".
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 [...]
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 --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;
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