shell-recorder-src: Set frame duration

We where not setting a duration for the frames, which caused the resulting videos to
have a broken header.

Fix that by making the source a live source and setting the correct frame duration.

https://bugzilla.gnome.org/show_bug.cgi?id=688487
This commit is contained in:
Adel Gadllah 2012-11-19 18:50:39 +01:00
parent a0c56c74e1
commit e0d127b3e4

View File

@ -14,6 +14,9 @@ struct _ShellRecorderSrc
GMutex mutex_data; GMutex mutex_data;
GMutex *mutex; GMutex *mutex;
GstClock *clock;
GstClockTime last_frame_time;
GstCaps *caps; GstCaps *caps;
GAsyncQueue *queue; GAsyncQueue *queue;
gboolean closed; gboolean closed;
@ -41,6 +44,10 @@ static void
shell_recorder_src_init (ShellRecorderSrc *src) shell_recorder_src_init (ShellRecorderSrc *src)
{ {
gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_TIME); gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_TIME);
gst_base_src_set_live (GST_BASE_SRC (src), TRUE);
src->clock = gst_system_clock_obtain ();
src->last_frame_time = 0;
src->queue = g_async_queue_new (); src->queue = g_async_queue_new ();
src->mutex = &src->mutex_data; src->mutex = &src->mutex_data;
@ -89,6 +96,10 @@ shell_recorder_src_create (GstPushSrc *push_src,
return GST_FLOW_EOS; return GST_FLOW_EOS;
buffer = g_async_queue_pop (src->queue); buffer = g_async_queue_pop (src->queue);
if (src->last_frame_time == 0)
src->last_frame_time = gst_clock_get_time (GST_CLOCK (src->clock));
if (buffer == RECORDER_QUEUE_END) if (buffer == RECORDER_QUEUE_END)
{ {
/* Returning UNEXPECTED here will cause a EOS message to be sent */ /* Returning UNEXPECTED here will cause a EOS message to be sent */
@ -100,6 +111,9 @@ shell_recorder_src_create (GstPushSrc *push_src,
- (int)(gst_buffer_get_size(buffer) / 1024)); - (int)(gst_buffer_get_size(buffer) / 1024));
*buffer_out = buffer; *buffer_out = buffer;
GST_BUFFER_DURATION(*buffer_out) = GST_CLOCK_DIFF (src->last_frame_time, gst_clock_get_time (GST_CLOCK (src->clock)));
src->last_frame_time = gst_clock_get_time (GST_CLOCK (src->clock));
return GST_FLOW_OK; return GST_FLOW_OK;
} }
@ -141,6 +155,8 @@ shell_recorder_src_finalize (GObject *object)
g_mutex_clear (src->mutex); g_mutex_clear (src->mutex);
gst_object_unref (src->clock);
G_OBJECT_CLASS (shell_recorder_src_parent_class)->finalize (object); G_OBJECT_CLASS (shell_recorder_src_parent_class)->finalize (object);
} }