X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_decoder.cc;h=a5b6af7de51497550c8c1d450d20f9d04241ad68;hb=d08123f5e160b5737fa912cd36119e810abaa4cd;hp=378b59901163339f2a8dbb1175f1847e87b0fb1e;hpb=4b2cf0764a4091b9466f90e6dbbeb029e04bc2be;p=dcpomatic.git diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index 378b59901..a5b6af7de 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -98,7 +98,8 @@ FFmpegDecoder::FFmpegDecoder (shared_ptr c, shared_ptr } if (c->subtitle) { - subtitle.reset (new SubtitleDecoder (this, c->subtitle, log)); + /* XXX: this time here should be the time of the first subtitle, not 0 */ + subtitle.reset (new SubtitleDecoder (this, c->subtitle, log, ContentTime())); } _next_time.resize (_format_context->nb_streams); @@ -128,7 +129,7 @@ FFmpegDecoder::flush () if (video) { double const vfr = _ffmpeg_content->video_frame_rate().get(); Frame const f = full_length.frames_round (vfr); - Frame v = video->position().frames_round (vfr); + Frame v = video->position().frames_round (vfr) + 1; while (v < f) { video->emit (shared_ptr (new RawImageProxy (_black_image)), v); ++v; @@ -562,6 +563,8 @@ FFmpegDecoder::decode_subtitle_packet () _have_current_subtitle = true; if (sub_period.to) { _current_subtitle_to = *sub_period.to + _pts_offset; + } else { + _current_subtitle_to = optional(); } for (unsigned int i = 0; i < sub.num_rects; ++i) { @@ -582,16 +585,20 @@ FFmpegDecoder::decode_subtitle_packet () } } + if (_current_subtitle_to) { + subtitle->emit_stop (*_current_subtitle_to); + } + avsubtitle_free (&sub); } void FFmpegDecoder::decode_bitmap_subtitle (AVSubtitleRect const * rect, ContentTime from) { - /* Note RGBA is expressed little-endian, so the first byte in the word is R, second - G, third B, fourth A. + /* Note BGRA is expressed little-endian, so the first byte in the word is B, second + G, third R, fourth A. */ - shared_ptr image (new Image (AV_PIX_FMT_RGBA, dcp::Size (rect->w, rect->h), true)); + shared_ptr image (new Image (AV_PIX_FMT_BGRA, dcp::Size (rect->w, rect->h), true)); #ifdef DCPOMATIC_HAVE_AVSUBTITLERECT_PICT /* Start of the first line in the subtitle */ @@ -635,8 +642,8 @@ FFmpegDecoder::decode_bitmap_subtitle (AVSubtitleRect const * rect, ContentTime uint32_t* out_line_p = out_p; for (int x = 0; x < rect->w; ++x) { RGBA const p = mapped_palette[*sub_line_p++]; - /* XXX: this seems to be wrong to me (isn't the output image RGBA?) but it looks right on screen */ - *out_line_p++ = (p.a << 24) | (p.r << 16) | (p.g << 8) | p.b; + /* XXX: this seems to be wrong to me (isn't the output image BGRA?) but it looks right on screen */ + *out_line_p++ = (p.a << 24) | (p.b << 16) | (p.g << 8) | p.r; } #ifdef DCPOMATIC_HAVE_AVSUBTITLERECT_PICT sub_p += rect->pict.linesize[0];