Please find my patch attached.

libavcodec/jpeg2000_parser: Fix parsing of tile-part header, and frames
where the end of frame marker is at the end of the buffer.

Fixes playback of Sol Levante MXF JPEG2000 file:
VIDEO_e4da5fcd-5ffc-4713-bcdd-95ea579d790b.mxf

http://download.opencontent.netflix.com.s3.amazonaws.com/SolLevante/imf/SolLevante_IMF_DolbyVision_PQP3D65_UHD_24fps.zip

Bug Summary:
When playing back VIDEO_e4da5fcd-5ffc-4713-bcdd-95ea579d790b.mxf, I noticed
a regression between release 4.2.4 and release 4.3.2. Release 4.3.2 skips
some frames. This can be seen in the first 15 seconds of the video. The
Netflix logo should fade out.

This regression is in the master branch and was introduced by commit
d09c356 which adds a JPEG2000 parser. I have also tested this patch against
my 3 other JPEG2000 samples.

The patches are against master branch 13ec662 and fix playback of this file.

1. Fixed a off by one error when calculating the number of bytes to skip.

2. Added a 'continue' to the Tile part header reading, to skip the reaming
paring code during a header read.

3. To deal with the end of frame tag being at the very end of the buffer,
return the frame size during the current loop iteration.

Is the PARSER_FLAG_COMPLETE_FRAMES flag supposed to be set for the Netflix
sample? The files playback correctly if the flag is set, as each buffer
contains a complete frame, but it is not set for the test case above.

Thank you,
Shaun Simpson
From 095f34ffd64e8381f301664e4bd53e1588c5f6e3 Mon Sep 17 00:00:00 2001
From: Shaun Simpson <shauns2...@gmail.com>
Date: Thu, 15 Jul 2021 22:59:01 +0100
Subject: [PATCH 1/2] libavcodec/jpeg2000_parser: Fix parsing of tile-part
 header, and frames were the end of frame marker is at the end of the buffer. 
 Fixes playback of Sol Levante MXF JPEG2000 file:
 VIDEO_e4da5fcd-5ffc-4713-bcdd-95ea579d790b.mxf        
 http://download.opencontent.netflix.com.s3.amazonaws.com/SolLevante/imf/SolLevante_IMF_DolbyVision_PQP3D65_UHD_24fps.zip

Signed-off-by: Shaun Simpson <shauns2...@gmail.com>
---
 libavcodec/jpeg2000_parser.c | 15 +++++----------
 1 file changed, 5 insertions(+), 10 deletions(-)

diff --git a/libavcodec/jpeg2000_parser.c b/libavcodec/jpeg2000_parser.c
index 123197fdca..b332a067e5 100644
--- a/libavcodec/jpeg2000_parser.c
+++ b/libavcodec/jpeg2000_parser.c
@@ -23,7 +23,6 @@
  * @file
  * JPEG2000 parser.
  */
-
 #include "parser.h"
 
 /* Whether frame is jp2 file or codestream
@@ -42,7 +41,6 @@ typedef struct JPEG2000ParserContext {
     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;
@@ -57,7 +55,6 @@ static inline void reset_context(JPEG2000ParserContext *m)
     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;
@@ -100,16 +97,13 @@ static int find_frame_end(JPEG2000ParserContext *m, const uint8_t *buf, int buf_
             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->skip_bytes = (state64 & 0xFFFFFFFF) - 9 > 0?
+                                (state64 & 0xFFFFFFFF) - 9 : 0;
             }
             m->read_tp--;
+            continue;
         }
         if (m->fheader_read) {
             if (m->fheader_read == 1) {
@@ -141,7 +135,8 @@ static int find_frame_end(JPEG2000ParserContext *m, const uint8_t *buf, int buf_
             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;
+                reset_context(m);
+                return i + 1; // End of frame detected, return frame size.
             }
             m->in_codestream = 0;
         } else if (m->in_codestream && (state & 0xFFFF) == 0xFF90) { // Are we in tile part header?
-- 
2.30.2

_______________________________________________
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".

Reply via email to