Use dcp::file_to_string().
[dcpomatic.git] / src / lib / examine_ffmpeg_subtitles_job.cc
index dbd265ecaacd33d8e4251b29d196c05f636fb147..8c762d893bb311e9c47a6545d7fa60ee1820dcd7 100644 (file)
@@ -33,7 +33,7 @@ extern "C" {
 
 using std::string;
 using std::cout;
-using boost::shared_ptr;
+using std::shared_ptr;
 
 ExamineFFmpegSubtitlesJob::ExamineFFmpegSubtitlesJob (shared_ptr<const Film> film, shared_ptr<FFmpegContent> c)
        : Job (film)
@@ -43,6 +43,11 @@ ExamineFFmpegSubtitlesJob::ExamineFFmpegSubtitlesJob (shared_ptr<const Film> fil
 
 }
 
+ExamineFFmpegSubtitlesJob::~ExamineFFmpegSubtitlesJob ()
+{
+       stop_thread ();
+}
+
 string
 ExamineFFmpegSubtitlesJob::name () const
 {
@@ -60,8 +65,11 @@ ExamineFFmpegSubtitlesJob::run ()
 {
        int64_t const len = _file_group.length ();
        while (true) {
-               int r = av_read_frame (_format_context, &_packet);
+               auto packet = av_packet_alloc ();
+               DCPOMATIC_ASSERT (packet);
+               int r = av_read_frame (_format_context, packet);
                if (r < 0) {
+                       av_packet_free (&packet);
                        break;
                }
 
@@ -71,10 +79,10 @@ ExamineFFmpegSubtitlesJob::run ()
                        set_progress_unknown ();
                }
 
-               if (_content->subtitle_stream() && _content->subtitle_stream()->uses_index(_format_context, _packet.stream_index) && _content->only_text()->use()) {
+               if (_content->subtitle_stream() && _content->subtitle_stream()->uses_index(_format_context, packet->stream_index) && _content->only_text()->use()) {
                        int got_subtitle;
                        AVSubtitle sub;
-                       if (avcodec_decode_subtitle2(subtitle_codec_context(), &sub, &got_subtitle, &_packet) >= 0 && got_subtitle) {
+                       if (avcodec_decode_subtitle2(subtitle_codec_context(), &sub, &got_subtitle, packet) >= 0 && got_subtitle) {
                                for (unsigned int i = 0; i < sub.num_rects; ++i) {
                                        AVSubtitleRect const * rect = sub.rects[i];
                                        if (rect->type == SUBTITLE_BITMAP) {
@@ -82,21 +90,24 @@ ExamineFFmpegSubtitlesJob::run ()
                                                /* 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];
+                                               uint8_t const * palette = rect->pict.data[1];
 #else
                                                /* 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->data[1];
+                                               uint8_t const * palette = rect->data[1];
 #endif
-                                               RGBA c ((palette[i] & 0xff0000) >> 16, (palette[i] & 0xff00) >> 8, palette[i] & 0xff, (palette[i] & 0xff000000) >> 24);
-                                               _content->subtitle_stream()->set_colour (c, c);
+                                               for (int j = 0; j < rect->nb_colors; ++j) {
+                                                       RGBA c (palette[2], palette[1], palette[0], palette[3]);
+                                                       _content->subtitle_stream()->set_colour (c, c);
+                                                       palette += 4;
+                                               }
                                        }
                                }
                        }
                }
 
-               av_packet_unref (&_packet);
+               av_packet_free (&packet);
        }
 
        set_progress (1);