+
+ 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 */
+ 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++];
+ }
+ sub_p += rect->pict.linesize[0];
+ out_p += image->stride()[0] / sizeof (uint32_t);
+ }
+
+ libdcp::Size const vs = _ffmpeg_content->video_size ();
+
+ subtitle (
+ image,
+ dcpomatic::Rect<double> (
+ static_cast<double> (rect->x) / vs.width,
+ static_cast<double> (rect->y) / vs.height,
+ static_cast<double> (rect->w) / vs.width,
+ static_cast<double> (rect->h) / vs.height
+ ),
+ from,
+ to
+ );
+
+
+ avsubtitle_free (&sub);