summaryrefslogtreecommitdiff
path: root/src/lib/ffmpeg_decoder.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2014-01-06 13:01:40 +0000
committerCarl Hetherington <cth@carlh.net>2014-01-06 13:01:40 +0000
commitaf1a5440992ba16f44dced89ac3958ba4f8bc702 (patch)
tree17543510bd1c5c5acb4857d0f53b0c6bbfe95186 /src/lib/ffmpeg_decoder.cc
parent4e2e24a44857dd6dbd777cd28d851fd792ca3124 (diff)
Fix subtitle colouring (#152).
Diffstat (limited to 'src/lib/ffmpeg_decoder.cc')
-rw-r--r--src/lib/ffmpeg_decoder.cc14
1 files changed, 10 insertions, 4 deletions
diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc
index 1546031b8..d9b779659 100644
--- a/src/lib/ffmpeg_decoder.cc
+++ b/src/lib/ffmpeg_decoder.cc
@@ -570,21 +570,27 @@ FFmpegDecoder::decode_subtitle_packet ()
if (rect->type != SUBTITLE_BITMAP) {
throw DecodeError (_("non-bitmap subtitles not yet supported"));
}
-
+
+ /* Note RGBA is expressed little-endian, so the first byte in the word is R, second
+ G, third B, fourth A.
+ */
shared_ptr<Image> image (new Image (PIX_FMT_RGBA, libdcp::Size (rect->w, rect->h), true));
/* Start of the first line in the subtitle */
uint8_t* sub_p = rect->pict.data[0];
- /* sub_p looks up into a RGB palette which is here */
+ /* sub_p looks up into a BGRA palette which is here
+ (i.e. first byte B, second G, third R, fourth A)
+ */
uint32_t const * palette = (uint32_t *) rect->pict.data[1];
/* Start of the output data */
uint32_t* out_p = (uint32_t *) image->data()[0];
-
+
for (int y = 0; y < rect->h; ++y) {
uint8_t* sub_line_p = sub_p;
uint32_t* out_line_p = out_p;
for (int x = 0; x < rect->w; ++x) {
- *out_line_p++ = palette[*sub_line_p++];
+ uint32_t const p = palette[*sub_line_p++];
+ *out_line_p++ = ((p & 0xff) << 16) | (p & 0xff00) | ((p & 0xff0000) >> 16) | (p & 0xff000000);
}
sub_p += rect->pict.linesize[0];
out_p += image->stride()[0] / sizeof (uint32_t);