The comments discuss this in a bit more depth, but basically we see
errors from avcodec_send_packet after seek. ffplay etc. seem basically
to ignore all errors from avcodec_send_packet, and I can't find a
"proper" fix, so here's a half-way house hack: ignore some errors
after seek. Nasty.
for (auto& i: _next_time) {
i.second = boost::optional<dcpomatic::ContentTime>();
}
for (auto& i: _next_time) {
i.second = boost::optional<dcpomatic::ContentTime>();
}
+
+ /* We find that we get some errors from av_send_packet after a seek. Perhaps we should ignore
+ * all of them (which seems risky), or perhaps we should have some proper fix. But instead
+ * let's ignore the next 2 errors.
+ */
+ _errors_to_ignore = 2;
/* We could cope with AVERROR(EAGAIN) and re-send the packet but I think it should never happen.
* Likewise I think AVERROR_EOF should not happen.
*/
/* We could cope with AVERROR(EAGAIN) and re-send the packet but I think it should never happen.
* Likewise I think AVERROR_EOF should not happen.
*/
+ if (_errors_to_ignore > 0) {
+ /* We see errors here after a seek, which is hopefully to be nothing to worry about */
+ --_errors_to_ignore;
+ LOG_GENERAL("Ignoring error %1 avcodec_send_packet after seek; will ignore %2 more", r, _errors_to_ignore);
+ return;
+ }
throw DecodeError (N_("avcodec_send_packet"), N_("FFmpegDecoder::decode_and_process_audio_packet"), r);
}
throw DecodeError (N_("avcodec_send_packet"), N_("FFmpegDecoder::decode_and_process_audio_packet"), r);
}
/** true if we have a subtitle which has not had emit_stop called for it yet */
bool _have_current_subtitle = false;
/** true if we have a subtitle which has not had emit_stop called for it yet */
bool _have_current_subtitle = false;
+ /** number of errors from avcodec_send_packet to ignore */
+ int _errors_to_ignore = 0;
+
std::shared_ptr<Image> _black_image;
std::map<std::shared_ptr<FFmpegAudioStream>, boost::optional<dcpomatic::ContentTime>> _next_time;
std::shared_ptr<Image> _black_image;
std::map<std::shared_ptr<FFmpegAudioStream>, boost::optional<dcpomatic::ContentTime>> _next_time;
test ("boon_telly.mkv", frames);
test ("Sintel_Trailer1.480p.DivX_Plus_HD.mkv", frames);
test ("prophet_long_clip.mkv", { 15, 42, 999, 15 });
test ("boon_telly.mkv", frames);
test ("Sintel_Trailer1.480p.DivX_Plus_HD.mkv", frames);
test ("prophet_long_clip.mkv", { 15, 42, 999, 15 });
+ test ("dolby_aurora.vob", { 0, 125, 250, 41 });