summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2012-09-17 09:48:56 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2012-09-17 09:48:56 +0200
commitee295d3fd51540c3ca28b051cde5a055b9a5d111 (patch)
treef874c77ba5ba07a006766c90e793df507cdf43a2 /ext
parent3e86ea8fb5cbca1900207c045dd60c3073a587a2 (diff)
vp8enc: Correctly finish frames
Previously we would always get the same frame if multiple frames are pending, leaking memory of the previous frames and breaking timestamps.
Diffstat (limited to 'ext')
-rw-r--r--ext/vpx/gstvp8enc.c27
1 files changed, 6 insertions, 21 deletions
diff --git a/ext/vpx/gstvp8enc.c b/ext/vpx/gstvp8enc.c
index 99104cb8b..a00fcd2de 100644
--- a/ext/vpx/gstvp8enc.c
+++ b/ext/vpx/gstvp8enc.c
@@ -1732,13 +1732,6 @@ gst_vp8_enc_set_format (GstVideoEncoder * video_encoder,
return ret;
}
-static void
-_gst_video_codec_frame_unref0 (GstVideoCodecFrame * frame)
-{
- if (frame)
- gst_video_codec_frame_unref (frame);
-}
-
static GstFlowReturn
gst_vp8_enc_process (GstVP8Enc * encoder)
{
@@ -1748,7 +1741,6 @@ gst_vp8_enc_process (GstVP8Enc * encoder)
GstVP8EncUserData *user_data;
GstVideoCodecFrame *frame;
GstFlowReturn ret = GST_FLOW_OK;
- GList *l, *frames = NULL;
video_encoder = GST_VIDEO_ENCODER (encoder);
@@ -1773,7 +1765,9 @@ gst_vp8_enc_process (GstVP8Enc * encoder)
buffer = gst_buffer_new ();
GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_LIVE);
frame->output_buffer = buffer;
- frames = g_list_prepend (frames, frame);
+ g_mutex_unlock (&encoder->encoder_lock);
+ ret = gst_video_encoder_finish_frame (video_encoder, frame);
+ g_mutex_lock (&encoder->encoder_lock);
}
pkt = vpx_codec_get_cx_data (&encoder->encoder, &iter);
@@ -1807,24 +1801,15 @@ gst_vp8_enc_process (GstVP8Enc * encoder)
user_data->invisible = g_list_append (user_data->invisible, buffer);
} else {
frame->output_buffer = buffer;
- frames = g_list_prepend (frames, frame);
+ g_mutex_unlock (&encoder->encoder_lock);
+ ret = gst_video_encoder_finish_frame (video_encoder, frame);
+ g_mutex_lock (&encoder->encoder_lock);
}
pkt = vpx_codec_get_cx_data (&encoder->encoder, &iter);
}
g_mutex_unlock (&encoder->encoder_lock);
- frames = g_list_reverse (frames);
- for (l = frames; l; l = l->next) {
- ret = gst_video_encoder_finish_frame (video_encoder, l->data);
- l->data = NULL;
- if (ret != GST_FLOW_OK)
- break;
- }
-
- g_list_foreach (frames, (GFunc) _gst_video_codec_frame_unref0, NULL);
- g_list_free (frames);
-
return ret;
}