diff --git a/src/FFmpegWriter.cpp b/src/FFmpegWriter.cpp
index ea1767b6..8fa5fdf9 100644
--- a/src/FFmpegWriter.cpp
+++ b/src/FFmpegWriter.cpp
@@ -33,7 +33,6 @@ FFmpegWriter::FFmpegWriter(string path) throw (InvalidFile, InvalidFormat, Inval
initial_audio_input_frame_size(0), resampler(NULL), img_convert_ctx(NULL), cache_size(8), num_of_rescalers(32),
rescaler_position(0), video_codec(NULL), audio_codec(NULL), is_writing(false), write_video_count(0), write_audio_count(0)
{
-
// Init FileInfo struct (clear all values)
InitFileInfo();
@@ -478,9 +477,39 @@ void FFmpegWriter::flush_encoders()
pkt.data = NULL;
pkt.size = 0;
+ // Pointer for video buffer (if using old FFmpeg version)
+ uint8_t *video_outbuf = NULL;
+
/* encode the image */
int got_packet = 0;
+ int error_code = 0;
+
+ #if LIBAVFORMAT_VERSION_MAJOR >= 54
+ // Newer versions of FFMpeg
error_code = avcodec_encode_video2(video_codec, &pkt, NULL, &got_packet);
+
+ #else
+ // Older versions of FFmpeg (much sloppier)
+
+ // Encode Picture and Write Frame
+ int video_outbuf_size = 0;
+ //video_outbuf = new uint8_t[200000];
+
+ /* encode the image */
+ int out_size = avcodec_encode_video(video_codec, NULL, video_outbuf_size, NULL);
+
+ /* if zero size, it means the image was buffered */
+ if (out_size > 0) {
+ if(video_codec->coded_frame->key_frame)
+ pkt.flags |= AV_PKT_FLAG_KEY;
+ pkt.data= video_outbuf;
+ pkt.size= out_size;
+
+ // got data back (so encode this frame)
+ got_packet = 1;
+ }
+ #endif
+
if (error_code < 0) {
string error_description = "Unknown";
@@ -520,6 +549,10 @@ void FFmpegWriter::flush_encoders()
cout << "error: " << error_code << ": " << error_description << endl;
throw ErrorEncodingVideo("Error while writing video packet to flush encoder", -1);
}
+
+ // Deallocate memory (if needed)
+ if (video_outbuf)
+ delete[] video_outbuf;
}
// FLUSH AUDIO ENCODER
diff --git a/src/Main.cpp b/src/Main.cpp
index f45ab7db..030ce3e6 100644
--- a/src/Main.cpp
+++ b/src/Main.cpp
@@ -159,9 +159,9 @@ int main()
// c1.time.PrintValues();
// Add clips
- //t.AddClip(&c1);
+ t.AddClip(&c1);
//t.AddClip(&c2);
- t.AddClip(&c3);
+ //t.AddClip(&c3);
// Create a writer
@@ -182,7 +182,7 @@ int main()
// Output stream info
w.OutputStreamInfo();
- for (int frame = 1; frame <= 300; frame++)
+ for (int frame = 1; frame <= 180; frame++)
{
tr1::shared_ptr f = t.GetFrame(frame);
if (f)
diff --git a/src/Timeline.cpp b/src/Timeline.cpp
index a3fe32ad..23055c85 100644
--- a/src/Timeline.cpp
+++ b/src/Timeline.cpp
@@ -269,7 +269,7 @@ tr1::shared_ptr Timeline::GetFrame(int requested_frame) throw(ReaderClose
// Loop through all requested frames
for (int frame_number = requested_frame; frame_number < requested_frame + minimum_frames; frame_number++)
{
- #pragma omp task firstprivate(frame_number)
+ #pragma xxx omp task firstprivate(frame_number)
{
// Create blank frame (which will become the requested frame)
tr1::shared_ptr new_frame(tr1::shared_ptr(new Frame(frame_number, width, height, "#000000", GetSamplesPerFrame(frame_number), channels)));