diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 19d9e33a..7b3c3563 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -140,7 +140,7 @@ include_directories("../thirdparty/jsoncpp/include")
############### PROFILING #################
#set(PROFILER "/usr/lib/libprofiler.so")
-#set(PROFILER "/usr/lib/libtcmalloc.so")
+#set(PROFILER "/usr/lib/libtcmalloc.so.4")
#### GET LIST OF EFFECT FILES ####
FILE(GLOB EFFECT_FILES "${CMAKE_CURRENT_SOURCE_DIR}/effects/*.cpp")
diff --git a/src/FFmpegReader.cpp b/src/FFmpegReader.cpp
index c32b8605..b8666d6a 100644
--- a/src/FFmpegReader.cpp
+++ b/src/FFmpegReader.cpp
@@ -420,9 +420,9 @@ tr1::shared_ptr FFmpegReader::GetFrame(int requested_frame) throw(OutOfBo
// Get first frame
ReadStream(1);
- // Are we within 30 frames of the requested frame?
+ // Are we within X frames of the requested frame?
int diff = requested_frame - last_frame;
- if (diff >= 1 && diff <= 30)
+ if (diff >= 1 && diff <= 20)
{
// Continue walking the stream
return ReadStream(requested_frame);
@@ -506,9 +506,13 @@ tr1::shared_ptr FFmpegReader::ReadStream(int requested_frame)
else
check_seek = false;
- if (check_seek)
+ if (check_seek) {
+ // Remove packet (since this packet is pointless)
+ RemoveAVPacket(packet);
+
// Jump to the next iteration of this loop
continue;
+ }
#pragma omp critical (packet_cache)
frame_finished = GetAVFrame();
@@ -534,9 +538,13 @@ tr1::shared_ptr FFmpegReader::ReadStream(int requested_frame)
else
check_seek = false;
- if (check_seek)
+ if (check_seek) {
+ // Remove packet (since this packet is pointless)
+ RemoveAVPacket(packet);
+
// Jump to the next iteration of this loop
continue;
+ }
// Update PTS / Frame Offset (if any)
UpdatePTSOffset(false);
@@ -608,6 +616,7 @@ int FFmpegReader::GetNextPacket()
// Update current packet pointer
packet = packets[next_packet];
+
}else
{
// Free packet, since it's unused
@@ -928,7 +937,7 @@ void FFmpegReader::ProcessAudioPacket(int requested_frame, int target_frame, int
#pragma omp critical (packet_cache)
{
// Remove packet
- av_init_packet(my_packet); // TODO: this is a hack, to prevent a bug calling av_free_packet after avcodec_decode_audio3()
+ av_init_packet(my_packet); // TODO: this is a hack, to prevent a bug calling av_free_packet after avcodec_decode_audio3(). It causes a memory leak by not freeing pkt->data.
RemoveAVPacket(my_packet);
}
@@ -1572,6 +1581,9 @@ void FFmpegReader::RemoveAVFrame(AVPicture* remove_frame)
// Remove from cache
frames.erase(remove_frame);
+
+ // Delete the object
+ delete remove_frame;
}
}
@@ -1581,12 +1593,14 @@ void FFmpegReader::RemoveAVPacket(AVPacket* remove_packet)
// Remove packet (if any)
if (packets.count(remove_packet))
{
- // Remove from cache
- packets.erase(remove_packet);
-
// deallocate memory for packet
av_free_packet(remove_packet);
+ // Remove from cache
+ packets.erase(remove_packet);
+
+ // Delete the object
+ delete remove_packet;
}
}
diff --git a/src/Main.cpp b/src/Main.cpp
index 67af94d7..91d39508 100644
--- a/src/Main.cpp
+++ b/src/Main.cpp
@@ -33,6 +33,8 @@
#include "../include/OpenShot.h"
#include "../include/Json.h"
#include
+#include
+#include
using namespace openshot;
@@ -42,15 +44,24 @@ int main(int argc, char* argv[])
{
FFmpegReader sinelReader("/home/jonathan/Videos/sintel_trailer-720p.mp4");
- sinelReader.debug = true;
+ //sinelReader.debug = true;
sinelReader.Open();
+ // init random #s
+ //srand(time(NULL));
+
// Seek test
- int frames[15] = {1,624,585,222,333};
- for (int x = 0; x<6; x++) {
- tr1::shared_ptr f = sinelReader.GetFrame(frames[x]);
- f->AddOverlayNumber(frames[x]);
- f->Display();
+ int x = 0;
+ while (true) {
+ x++;
+ int frame_number = (rand() % 625) + 1;
+ cout << "X: " << x << ", Frame: " << frame_number << endl;
+ tr1::shared_ptr f = sinelReader.GetFrame(frame_number);
+ //f->AddOverlayNumber(frame_number);
+ //f->Display();
+
+ if (x == 5000)
+ break;
}
cout << sinelReader.OutputDebugJSON() << endl;