diff options
| author | Carl Hetherington <cth@carlh.net> | 2023-12-01 21:25:54 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2024-01-12 12:07:19 +0100 |
| commit | 6ac468554c7fea0dfaefde85fb6cdd0fceaf5cad (patch) | |
| tree | 1271ef19694e3e3063349e0367178fba081d01fa /src/lib/ffmpeg_decoder.cc | |
| parent | 213afdc4e9399e3f2aaea3df54ab79535d43045e (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/lib/ffmpeg_decoder.cc')
| -rw-r--r-- | src/lib/ffmpeg_decoder.cc | 20 |
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 ); |
