From e06941199da90359f41ce80c276752bc0f172d7e Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 28 Apr 2022 14:00:07 +0200 Subject: [PATCH] Handle multiple bitmap subtitles at the same time correctly (#2239). Previously if there were two images at the same time we would start them both, then the stop time would be set in the second one but not the first. This meant that the first one would hang around forever. --- src/lib/content_text.h | 6 ++++++ src/lib/ffmpeg_decoder.cc | 13 +++++++++---- src/lib/ffmpeg_decoder.h | 3 ++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/lib/content_text.h b/src/lib/content_text.h index fb86bc786..438a76a6e 100644 --- a/src/lib/content_text.h +++ b/src/lib/content_text.h @@ -45,9 +45,14 @@ private: dcpomatic::ContentTime _from; }; + class ContentBitmapText : public ContentText { public: + ContentBitmapText (dcpomatic::ContentTime from) + : ContentText(from) + {} + ContentBitmapText (dcpomatic::ContentTime f, std::shared_ptr im, dcpomatic::Rect r) : ContentText (f) , subs{ {im, r} } @@ -57,6 +62,7 @@ public: std::vector subs; }; + /** A text caption. We store the time period separately (as well as in the dcp::SubtitleStrings) * as the dcp::SubtitleString timings are sometimes quite heavily quantised and this causes problems * when we want to compare the quantised periods to the unquantised ones. diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index f76c7699e..bc7d28d7d 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -644,6 +644,7 @@ FFmpegDecoder::decode_and_process_subtitle_packet (AVPacket* packet) _have_current_subtitle = true; } + ContentBitmapText bitmap_text(from); for (unsigned int i = 0; i < sub.num_rects; ++i) { auto const rect = sub.rects[i]; @@ -651,7 +652,7 @@ FFmpegDecoder::decode_and_process_subtitle_packet (AVPacket* packet) case SUBTITLE_NONE: break; case SUBTITLE_BITMAP: - process_bitmap_subtitle (rect, from); + bitmap_text.subs.push_back(process_bitmap_subtitle(rect)); break; case SUBTITLE_TEXT: cout << "XXX: SUBTITLE_TEXT " << rect->text << "\n"; @@ -662,6 +663,10 @@ FFmpegDecoder::decode_and_process_subtitle_packet (AVPacket* packet) } } + if (!bitmap_text.subs.empty()) { + only_text()->emit_bitmap_start(bitmap_text); + } + if (_current_subtitle_to) { only_text()->emit_stop (*_current_subtitle_to); } @@ -670,8 +675,8 @@ FFmpegDecoder::decode_and_process_subtitle_packet (AVPacket* packet) } -void -FFmpegDecoder::process_bitmap_subtitle (AVSubtitleRect const * rect, ContentTime from) +BitmapText +FFmpegDecoder::process_bitmap_subtitle (AVSubtitleRect const * rect) { /* Note BGRA is expressed little-endian, so the first byte in the word is B, second G, third R, fourth A. @@ -754,7 +759,7 @@ FFmpegDecoder::process_bitmap_subtitle (AVSubtitleRect const * rect, ContentTime static_cast(rect->h) / target_height ); - only_text()->emit_bitmap_start ({ from, image, scaled_rect }); + return { image, scaled_rect }; } diff --git a/src/lib/ffmpeg_decoder.h b/src/lib/ffmpeg_decoder.h index 663a3c687..ce2476fb0 100644 --- a/src/lib/ffmpeg_decoder.h +++ b/src/lib/ffmpeg_decoder.h @@ -24,6 +24,7 @@ */ +#include "bitmap_text.h" #include "decoder.h" #include "ffmpeg.h" #include "util.h" @@ -72,7 +73,7 @@ private: void decode_and_process_audio_packet (AVPacket* packet); void decode_and_process_subtitle_packet (AVPacket* packet); - void process_bitmap_subtitle (AVSubtitleRect const * rect, dcpomatic::ContentTime from); + BitmapText process_bitmap_subtitle (AVSubtitleRect const * rect); void process_ass_subtitle (std::string ass, dcpomatic::ContentTime from); void maybe_add_subtitle (); -- 2.30.2