From 28b9fbabd139616ecd4ee77cf9a86b53b5a8c893 Mon Sep 17 00:00:00 2001 From: Jonathan Thomas Date: Thu, 27 Oct 2011 09:40:03 -0500 Subject: [PATCH] Fixed some bugs related to audio only files. Now audio only files are correctly divided into frames (30 fps), and seek correctly. --- src/FFmpegReader.cpp | 22 ++++++++++++++++++---- src/Main.cpp | 8 ++++---- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/FFmpegReader.cpp b/src/FFmpegReader.cpp index 551ac6fd..90bbd4db 100644 --- a/src/FFmpegReader.cpp +++ b/src/FFmpegReader.cpp @@ -128,6 +128,18 @@ void FFmpegReader::UpdateAudioInfo() info.duration = info.audio_length * time_base; info.audio_timebase.num = aStream->time_base.num; info.audio_timebase.den = aStream->time_base.den; + + // Set video timebase (if no video stream was found) + if (!info.has_video) + { + // Set a few important default video settings (so audio can be divided into frames) + double video_time_base = Fraction(1, 30).ToDouble(); + info.video_length = info.duration / video_time_base; + info.video_timebase.num = 1; + info.video_timebase.den = 30; + info.fps.num = 30; + info.fps.den = 1; + } } void FFmpegReader::UpdateVideoInfo() @@ -529,7 +541,7 @@ void FFmpegReader::Seek(int requested_frame) // Find a valid stream index int stream_index = -1; - if (info.video_stream_index >= 0) + if (info.has_video) { // VIDEO SEEK is_video_seek = true; @@ -539,7 +551,7 @@ void FFmpegReader::Seek(int requested_frame) seeking_pts = ConvertFrameToVideoPTS(requested_frame); seek_target = ((double)seeking_pts * info.video_timebase.ToDouble()) * (double)AV_TIME_BASE; } - else if (info.audio_stream_index >= 0) + else if (info.has_audio) { // AUDIO SEEK is_video_seek = false; @@ -576,8 +588,10 @@ void FFmpegReader::Seek(int requested_frame) } // Flush buffers - avcodec_flush_buffers(pCodecCtx); - avcodec_flush_buffers(aCodecCtx); + if (info.has_video) + avcodec_flush_buffers(pCodecCtx); + if (info.has_audio) + avcodec_flush_buffers(aCodecCtx); } // Convert image to RGB format diff --git a/src/Main.cpp b/src/Main.cpp index b058670d..96bb632c 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -18,9 +18,9 @@ int main() // openshot::FFmpegReader r("/home/jonathan/Aptana Studio Workspace/OpenShotLibrary/src/examples/test1.mp4"); // openshot::FFmpegReader r("/home/jonathan/Videos/OpenShot_Now_In_3d.mp4"); // openshot::FFmpegReader r("/home/jonathan/Videos/sintel-1024-stereo.mp4"); - openshot::FFmpegReader r("/home/jonathan/Videos/sintel_trailer-720p.mp4"); - // openshot::FFmpegReader r("/home/jonathan/Aptana Studio Workspace/OpenShotLibrary/src/examples/test.wav"); - // openshot::FFmpegReader r("/home/jonathan/Music/Army of Lovers/Crucified/Army of Lovers - Crucified [Single Version].mp3"); + // openshot::FFmpegReader r("/home/jonathan/Videos/sintel_trailer-720p.mp4"); + // openshot::FFmpegReader r("/home/jonathan/Music/beat.wav"); + openshot::FFmpegReader r("/home/jonathan/Music/lonely island/B004YRCAOO_(disc_1)_09_-_Shy_Ronnie_2__Ronnie_&_Clyde_[Expli.mp3"); // openshot::FFmpegReader r("/home/jonathan/Documents/OpenShot Art/bannertemplate.png"); // openshot::FFmpegReader r("/home/jonathan/Aptana Studio Workspace/OpenShotLibrary/src/examples/CMakeLists.txt"); // openshot::FFmpegReader r("/home/jonathan/Aptana Studio Workspace/OpenShotLibrary/src/examples/asdf.wdf"); @@ -28,7 +28,7 @@ int main() // Display debug info r.DisplayInfo(); - for (int frame = 300; frame < 400; frame++) + for (int frame = 990; frame < 2000; frame++) { Frame f = r.GetFrame(frame); f.Play();