X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fplayer.cc;h=cacb42651b1656d706773a7b335c21c054af2458;hb=5625ba9542e38504e87799dd655be5071161fb1f;hp=87b10a3989a2021be3e04c0971f14f7e7fe166fa;hpb=90b84151b9817b33381187f678cb2fdd062ed785;p=dcpomatic.git diff --git a/src/lib/player.cc b/src/lib/player.cc index 87b10a398..cacb42651 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -144,7 +144,6 @@ Player::pass () { if (!_have_valid_pieces) { setup_pieces (); - _have_valid_pieces = true; } Time earliest_t = TIME_MAX; @@ -270,40 +269,38 @@ Player::process_video (weak_ptr weak_piece, shared_ptr image return; } - /* Convert to RGB first, as FFmpeg doesn't seem to like handling YUV images with odd widths */ - shared_ptr work_image = image->scale (image->size (), _film->scaler(), PIX_FMT_RGB24, true); - - work_image = work_image->crop (content->crop(), true); - + Time const time = content->position() + relative_time + extra - content->trim_start (); float const ratio = content->ratio() ? content->ratio()->ratio() : content->video_size_after_crop().ratio(); - libdcp::Size image_size = fit_ratio_within (ratio, _video_container_size); + libdcp::Size const image_size = fit_ratio_within (ratio, _video_container_size); + + shared_ptr pi ( + new PlayerImage ( + image, + content->crop(), + image_size, + _video_container_size, + _film->scaler() + ) + ); - work_image = work_image->scale (image_size, _film->scaler(), PIX_FMT_RGB24, true); - - Time time = content->position() + relative_time + extra - content->trim_start (); - if (_film->with_subtitles () && _out_subtitle.image && time >= _out_subtitle.from && time <= _out_subtitle.to) { - work_image->alpha_blend (_out_subtitle.image, _out_subtitle.position); - } - if (image_size != _video_container_size) { - assert (image_size.width <= _video_container_size.width); - assert (image_size.height <= _video_container_size.height); - shared_ptr im (new Image (PIX_FMT_RGB24, _video_container_size, true)); - im->make_black (); - im->copy (work_image, Position ((_video_container_size.width - image_size.width) / 2, (_video_container_size.height - image_size.height) / 2)); - work_image = im; - } + Position const container_offset ( + (_video_container_size.width - image_size.width) / 2, + (_video_container_size.height - image_size.width) / 2 + ); + pi->set_subtitle (_out_subtitle.image, _out_subtitle.position + container_offset); + } + #ifdef DCPOMATIC_DEBUG _last_video = piece->content; #endif - Video (work_image, eyes, content->colour_conversion(), same, time); + Video (pi, eyes, content->colour_conversion(), same, time); - time += TIME_HZ / _film->video_frame_rate(); _last_emit_was_black = false; - _video_position = piece->video_position = time; + _video_position = piece->video_position = (time + TIME_HZ / _film->video_frame_rate()); if (frc.repeat > 1 && !piece->repeating ()) { piece->set_repeat (_last_incoming_video, frc.repeat - 1); @@ -378,16 +375,16 @@ void Player::flush () { TimedAudioBuffers