summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2023-12-01 21:25:54 +0100
committerCarl Hetherington <cth@carlh.net>2024-01-12 12:07:19 +0100
commit6ac468554c7fea0dfaefde85fb6cdd0fceaf5cad (patch)
tree1271ef19694e3e3063349e0367178fba081d01fa /src
parent213afdc4e9399e3f2aaea3df54ab79535d43045e (diff)
Fix scaling of bitmap subs when the corresponding video is cropped (#2670).
Previously we would scale the bitmap size/position to a proportion of the original video frame, then scale it back up again to the DCP container. This didn't take into account some cropped cases where the picture would end up the same shape but the subtitles would be stretched.
Diffstat (limited to 'src')
-rw-r--r--src/lib/ffmpeg_decoder.cc20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc
index 6e9d671a2..dcad184fa 100644
--- a/src/lib/ffmpeg_decoder.cc
+++ b/src/lib/ffmpeg_decoder.cc
@@ -781,11 +781,23 @@ FFmpegDecoder::process_bitmap_subtitle (AVSubtitleRect const * rect)
if (target_height == 0 && video_codec_context()) {
target_height = video_codec_context()->height;
}
- DCPOMATIC_ASSERT (target_width);
- DCPOMATIC_ASSERT (target_height);
+
+ int x_offset = 0;
+ int y_offset = 0;
+ if (_ffmpeg_content->video && _ffmpeg_content->video->use()) {
+ auto const crop = _ffmpeg_content->video->actual_crop();
+ target_width -= crop.left + crop.right;
+ target_height -= crop.top + crop.bottom;
+ x_offset = -crop.left;
+ y_offset = -crop.top;
+ }
+
+ DCPOMATIC_ASSERT(target_width > 0);
+ DCPOMATIC_ASSERT(target_height > 0);
+
dcpomatic::Rect<double> const scaled_rect (
- static_cast<double>(rect->x) / target_width,
- static_cast<double>(rect->y) / target_height,
+ static_cast<double>(rect->x + x_offset) / target_width,
+ static_cast<double>(rect->y + y_offset) / target_height,
static_cast<double>(rect->w) / target_width,
static_cast<double>(rect->h) / target_height
);