int const si = _packet.stream_index;
- if (si == _video_stream) {
+ if (si == _video_stream && !_ignore_video) {
decode_video_packet ();
} else if (_ffmpeg_content->audio_stream() && _ffmpeg_content->audio_stream()->uses_index (_format_context, si)) {
decode_audio_packet ();
/* Deinterleave and convert to float */
- DCPOMATIC_ASSERT ((size % (bytes_per_audio_sample() * _ffmpeg_content->audio_channels())) == 0);
-
+ /* total_samples and frames will be rounded down here, so if there are stray samples at the end
+ of the block that do not form a complete sample or frame they will be dropped.
+ */
int const total_samples = size / bytes_per_audio_sample();
int const frames = total_samples / _ffmpeg_content->audio_channels();
shared_ptr<AudioBuffers> audio (new AudioBuffers (_ffmpeg_content->audio_channels(), frames));
{
VideoDecoder::seek (time, accurate);
AudioDecoder::seek (time, accurate);
-
+
/* If we are doing an `accurate' seek, we need to use pre-roll, as
we don't really know what the seek will give us.
*/
*/
ContentTime const u = time - _pts_offset;
- int64_t s = u.seconds() / av_q2d (_format_context->streams[_video_stream]->time_base);
-
- if (_ffmpeg_content->audio_stream ()) {
- s = min (
- s, int64_t (u.seconds() / av_q2d (_ffmpeg_content->audio_stream()->stream(_format_context)->time_base))
- );
- }
-
- av_seek_frame (_format_context, _video_stream, s, 0);
+ av_seek_frame (_format_context, _video_stream, u.seconds() / av_q2d (_format_context->streams[_video_stream]->time_base), 0);
avcodec_flush_buffers (video_codec_context());
if (audio_codec_context ()) {