pinossrc: add always-copy property

This commit is contained in:
Wim Taymans 2017-05-17 11:49:57 +02:00
parent eca852cdd3
commit 3c7f1e09fb
2 changed files with 30 additions and 1 deletions

View file

@ -54,12 +54,15 @@ static GQuark process_mem_data_quark;
GST_DEBUG_CATEGORY_STATIC (pinos_src_debug);
#define GST_CAT_DEFAULT pinos_src_debug
#define DEFAULT_ALWAYS_COPY false
enum
{
PROP_0,
PROP_PATH,
PROP_CLIENT_NAME,
PROP_STREAM_PROPERTIES,
PROP_ALWAYS_COPY,
};
@ -115,6 +118,10 @@ gst_pinos_src_set_property (GObject * object, guint prop_id,
gst_structure_copy (gst_value_get_structure (value));
break;
case PROP_ALWAYS_COPY:
pinossrc->always_copy = g_value_get_boolean (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -140,6 +147,10 @@ gst_pinos_src_get_property (GObject * object, guint prop_id,
gst_value_set_structure (value, pinossrc->properties);
break;
case PROP_ALWAYS_COPY:
g_value_set_boolean (value, pinossrc->always_copy);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -248,6 +259,15 @@ gst_pinos_src_class_init (GstPinosSrcClass * klass)
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class,
PROP_ALWAYS_COPY,
g_param_spec_boolean ("always-copy",
"Always copy",
"Always copy the buffer and data",
DEFAULT_ALWAYS_COPY,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
gstelement_class->provide_clock = gst_pinos_src_provide_clock;
gstelement_class->change_state = gst_pinos_src_change_state;
@ -282,6 +302,8 @@ gst_pinos_src_init (GstPinosSrc * src)
GST_OBJECT_FLAG_SET (src, GST_ELEMENT_FLAG_PROVIDE_CLOCK);
src->always_copy = DEFAULT_ALWAYS_COPY;
g_queue_init (&src->queue);
src->fd_allocator = gst_fd_allocator_new ();
@ -291,6 +313,7 @@ gst_pinos_src_init (GstPinosSrc * src)
src->loop = pinos_loop_new ();
src->main_loop = pinos_thread_main_loop_new (src->loop, "pinos-main-loop");
GST_DEBUG ("loop %p, mainloop %p", src->loop, src->main_loop);
}
static GstCaps *
@ -498,7 +521,12 @@ on_new_buffer (PinosListener *listener,
mem->offset = d->chunk->offset + data->offset;
mem->size = d->chunk->size;
}
gst_buffer_ref (buf);
if (pinossrc->always_copy)
buf = gst_buffer_copy_deep (buf);
else
gst_buffer_ref (buf);
g_queue_push_tail (&pinossrc->queue, buf);
pinos_thread_main_loop_signal (pinossrc->main_loop, FALSE);

View file

@ -54,6 +54,7 @@ struct _GstPinosSrc {
/*< private >*/
gchar *path;
gchar *client_name;
gboolean always_copy;
gboolean negotiated;
gboolean flushing;