X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fplayer.cc;h=99aece8d660d5c67c1140410868b6bdd32d3b9f5;hb=3753cb8685e1755b067676345a5871db24149d0f;hp=b5a96163182b458acf00a58661be273251ceab60;hpb=d99ca0a95e61b53105f765497bc465a7420e7a47;p=dcpomatic.git diff --git a/src/lib/player.cc b/src/lib/player.cc index b5a961631..99aece8d6 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -22,10 +22,8 @@ #include "film.h" #include "ffmpeg_decoder.h" #include "ffmpeg_content.h" -#include "still_image_decoder.h" -#include "still_image_content.h" -#include "moving_image_decoder.h" -#include "moving_image_content.h" +#include "image_decoder.h" +#include "image_content.h" #include "sndfile_decoder.h" #include "sndfile_content.h" #include "subtitle_content.h" @@ -64,6 +62,8 @@ public: , decoder (d) , video_position (c->position ()) , audio_position (c->position ()) + , repeat_to_do (0) + , repeat_done (0) {} /** Set this piece to repeat a video frame a given number of times */ @@ -146,7 +146,6 @@ Player::pass () { if (!_have_valid_pieces) { setup_pieces (); - _have_valid_pieces = true; } Time earliest_t = TIME_MAX; @@ -227,7 +226,8 @@ Player::pass () continue; } - if (dynamic_pointer_cast ((*i)->decoder)) { + shared_ptr ad = dynamic_pointer_cast ((*i)->decoder); + if (ad && ad->has_audio ()) { audio_done_up_to = min (audio_done_up_to.get_value_or (TIME_MAX), (*i)->audio_position); } } @@ -272,40 +272,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 (); + libdcp::Size const image_size = content->scale().size (content, _video_container_size); - 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); + 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); @@ -349,10 +347,18 @@ Player::process_audio (weak_ptr weak_piece, shared_ptr dcp_mapped (new AudioBuffers (_film->audio_channels(), audio->frames())); dcp_mapped->make_silent (); - list > map = content->audio_mapping().content_to_dcp (); - for (list >::iterator i = map.begin(); i != map.end(); ++i) { - if (i->first < audio->channels() && i->second < dcp_mapped->channels()) { - dcp_mapped->accumulate_channel (audio.get(), i->first, i->second); + + AudioMapping map = content->audio_mapping (); + for (int i = 0; i < map.content_channels(); ++i) { + for (int j = 0; j < _film->audio_channels(); ++j) { + if (map.get (i, static_cast (j)) > 0) { + dcp_mapped->accumulate_channel ( + audio.get(), + i, + static_cast (j), + map.get (i, static_cast (j)) + ); + } } } @@ -380,16 +386,16 @@ void Player::flush () { TimedAudioBuffers