diff --git a/include/Frame.h b/include/Frame.h index e2025b59..a603208f 100644 --- a/include/Frame.h +++ b/include/Frame.h @@ -204,6 +204,9 @@ namespace openshot /// Display the wave form void DisplayWaveform(); + /// Get magnitude of range of samples (if channel is -1, return average of all channels for that sample) + float GetAudioSample(int channel, int sample, int magnitude_range); + /// Get an array of sample data float* GetAudioSamples(int channel); @@ -216,7 +219,7 @@ namespace openshot /// Get number of audio channels int GetAudioChannelsCount(); - /// Get number of audio channels + /// Get number of audio samples int GetAudioSamplesCount(); juce::AudioSampleBuffer *GetAudioSampleBuffer(); diff --git a/src/FFmpegReader.cpp b/src/FFmpegReader.cpp index dce20e41..b27cea13 100644 --- a/src/FFmpegReader.cpp +++ b/src/FFmpegReader.cpp @@ -537,7 +537,7 @@ tr1::shared_ptr FFmpegReader::ReadStream(long int requested_frame) ZmqLogger::Instance()->AppendDebugMethod("FFmpegReader::ReadStream (GetNextPacket)", "requested_frame", requested_frame, "processing_video_frames.size()", processing_video_frames.size(), "processing_audio_frames.size()", processing_audio_frames.size(), "minimum_packets", minimum_packets, "packets_processed", packets_processed, "", -1); // Video packet - if (packet->stream_index == videoStream) + if (info.has_video && packet->stream_index == videoStream) { // Reset this counter, since we have a video packet num_packets_since_video_frame = 0; @@ -572,7 +572,7 @@ tr1::shared_ptr FFmpegReader::ReadStream(long int requested_frame) } // Audio packet - else if (packet->stream_index == audioStream) + else if (info.has_audio && packet->stream_index == audioStream) { // Increment this (to track # of packets since the last video packet) num_packets_since_video_frame++; diff --git a/src/Frame.cpp b/src/Frame.cpp index bb1bca7e..d8b4123f 100644 --- a/src/Frame.cpp +++ b/src/Frame.cpp @@ -296,6 +296,19 @@ void Frame::DisplayWaveform() ClearWaveform(); } +// Get magnitude of range of samples (if channel is -1, return average of all channels for that sample) +float Frame::GetAudioSample(int channel, int sample, int magnitude_range) +{ + if (channel > 0) { + // return average magnitude for a specific channel/sample range + return audio->getMagnitude(channel, sample, magnitude_range); + + } else { + // Return average magnitude for all channels + return audio->getMagnitude(sample, magnitude_range); + } +} + // Get an array of sample data float* Frame::GetAudioSamples(int channel) { diff --git a/src/Qt/VideoPlaybackThread.cpp b/src/Qt/VideoPlaybackThread.cpp index 4b6d0af2..0e6d0e55 100644 --- a/src/Qt/VideoPlaybackThread.cpp +++ b/src/Qt/VideoPlaybackThread.cpp @@ -58,20 +58,17 @@ namespace openshot // Make other threads wait on the render event bool need_render = render.wait(500); - if (need_render) + if (need_render && frame) { // Debug ZmqLogger::Instance()->AppendDebugMethod("VideoPlaybackThread::run (before render)", "frame->number", frame->number, "need_render", need_render, "", -1, "", -1, "", -1, "", -1); // Render the frame to the screen renderer->paint(frame); - - // Signal to other threads that the rendered event has completed - rendered.signal(); - - // Debug - ZmqLogger::Instance()->AppendDebugMethod("VideoPlaybackThread::run (after render)", "frame->number", frame->number, "need_render", need_render, "", -1, "", -1, "", -1, "", -1); } + + // Signal to other threads that the rendered event has completed + rendered.signal(); } return;