summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/content_text.h6
-rw-r--r--src/lib/ffmpeg_decoder.cc13
-rw-r--r--src/lib/ffmpeg_decoder.h3
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<const Image> im, dcpomatic::Rect<double> r)
: ContentText (f)
, subs{ {im, r} }
@@ -57,6 +62,7 @@ public:
std::vector<BitmapText> 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<double>(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 ();