From b81696affdf6199e5959420a0e84cac27945533a Mon Sep 17 00:00:00 2001 From: Jonathan Thomas Date: Sat, 6 Jan 2018 16:44:54 -0600 Subject: [PATCH] Fixing black frames at end of video clips, if audio stream longer than video stream, and end-of-stream is reached. --- src/FFmpegReader.cpp | 8 ++++++-- src/examples/Example.cpp | 16 ++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/FFmpegReader.cpp b/src/FFmpegReader.cpp index b87539eb..f14f316e 100644 --- a/src/FFmpegReader.cpp +++ b/src/FFmpegReader.cpp @@ -1685,7 +1685,6 @@ void FFmpegReader::CheckWorkingFrames(bool end_of_stream, int64_t requested_fram } if (info.has_audio && !is_audio_ready) { - const GenericScopedLock lock(processingCriticalSection); // Mark audio as processed, and indicate the frame has audio data is_audio_ready = true; } @@ -1698,10 +1697,15 @@ void FFmpegReader::CheckWorkingFrames(bool end_of_stream, int64_t requested_fram if ((!end_of_stream && is_video_ready && is_audio_ready) || end_of_stream || is_seek_trash) { // Debug output - ZmqLogger::Instance()->AppendDebugMethod("FFmpegReader::CheckWorkingFrames (mark frame as final)", "requested_frame", requested_frame, "f->number", f->number, "is_seek_trash", is_seek_trash, "Working Cache Count", working_cache.Count(), "Final Cache Count", final_cache.Count(), "", -1); + ZmqLogger::Instance()->AppendDebugMethod("FFmpegReader::CheckWorkingFrames (mark frame as final)", "requested_frame", requested_frame, "f->number", f->number, "is_seek_trash", is_seek_trash, "Working Cache Count", working_cache.Count(), "Final Cache Count", final_cache.Count(), "end_of_stream", end_of_stream); if (!is_seek_trash) { + // Add missing image (if needed - sometimes end_of_stream causes frames with only audio) + if (info.has_video && !is_video_ready && last_video_frame) + // Copy image from last frame + f->AddImage(std::shared_ptr(new QImage(*last_video_frame->GetImage()))); + // Reset counter since last 'final' frame num_checks_since_final = 0; diff --git a/src/examples/Example.cpp b/src/examples/Example.cpp index 6c9b2ff8..e57445bf 100644 --- a/src/examples/Example.cpp +++ b/src/examples/Example.cpp @@ -49,15 +49,15 @@ int main(int argc, char* argv[]) { for (int attempt = 1; attempt < 10; attempt++) { cout << "** Attempt " << attempt << " **" << endl; - // Read every frame in reader as fast as possible - for (int64_t frame_number = 1; frame_number < r.info.video_length; frame_number++) { - // Get frame object - std::shared_ptr f = r.GetFrame(frame_number); + // Read every frame in reader as fast as possible + for (int64_t frame_number = 1; frame_number < r.info.video_length; frame_number++) { + // Get frame object + std::shared_ptr f = r.GetFrame(frame_number); - // Print frame numbers - cout << frame_number << " [" << f->number << "], " << flush; - if (frame_number % 10 == 0) - cout << endl; + // Print frame numbers + cout << frame_number << " [" << f->number << "], " << flush; + if (frame_number % 10 == 0) + cout << endl; } } cout << "Completed successfully!" << endl;