static GstBuffer * gst_fake_src_create_buffer (GstFakeSrc * src, gsize * bufsize) { GstBuffer *buf; gsize size = gst_fake_src_get_size (src); gboolean dump = src->dump; GstMapInfo info; *bufsize = size; switch (src->data) { case FAKE_SRC_DATA_ALLOCATE: buf = gst_fake_src_alloc_buffer (src, size); break; case FAKE_SRC_DATA_SUBBUFFER: /* see if we have a parent to subbuffer */ if (!src->parent) { gst_fake_src_alloc_parent (src); g_assert (src->parent); } /* see if it's large enough */ if ((src->parentsize - src->parentoffset) >= size) { buf = gst_buffer_copy_region (src->parent, GST_BUFFER_COPY_ALL, src->parentoffset, size); src->parentoffset += size; } else { /* the parent is useless now */ gst_buffer_unref (src->parent); src->parent = NULL; /* try again (this will allocate a new parent) */ return gst_fake_src_create_buffer (src, bufsize); } gst_buffer_map (buf, &info, GST_MAP_WRITE); gst_fake_src_prepare_buffer (src, info.data, info.size); gst_buffer_unmap (buf, &info); break; default: g_warning ("fakesrc: dunno how to allocate buffers !"); buf = gst_buffer_new (); break; } if (dump) { gst_buffer_map (buf, &info, GST_MAP_READ); gst_util_dump_mem (info.data, info.size); gst_buffer_unmap (buf, &info); } return buf; }
static GstBuffer * gst_fake_src_create_buffer (GstFakeSrc * src) { GstBuffer *buf; guint size; gboolean dump = src->dump; size = gst_fake_src_get_size (src); if (size == 0) return gst_buffer_new (); switch (src->data) { case FAKE_SRC_DATA_ALLOCATE: buf = gst_fake_src_alloc_buffer (src, size); break; case FAKE_SRC_DATA_SUBBUFFER: /* see if we have a parent to subbuffer */ if (!src->parent) { gst_fake_src_alloc_parent (src); g_assert (src->parent); } /* see if it's large enough */ if ((GST_BUFFER_SIZE (src->parent) - src->parentoffset) >= size) { buf = gst_buffer_create_sub (src->parent, src->parentoffset, size); src->parentoffset += size; } else { /* the parent is useless now */ gst_buffer_unref (src->parent); src->parent = NULL; /* try again (this will allocate a new parent) */ return gst_fake_src_create_buffer (src); } gst_fake_src_prepare_buffer (src, buf); break; default: g_warning ("fakesrc: dunno how to allocate buffers !"); buf = gst_buffer_new (); break; } if (dump) { gst_util_dump_mem (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); } return buf; }
static void gst_fake_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstFakeSrc *src; GstBaseSrc *basesrc; src = GST_FAKE_SRC (object); basesrc = GST_BASE_SRC (object); switch (prop_id) { case PROP_OUTPUT: g_warning ("not yet implemented"); break; case PROP_DATA: src->data = (GstFakeSrcDataType) g_value_get_enum (value); if (src->data == FAKE_SRC_DATA_SUBBUFFER) { if (!src->parent) gst_fake_src_alloc_parent (src); } else { if (src->parent) { gst_buffer_unref (src->parent); src->parent = NULL; } } break; case PROP_SIZETYPE: src->sizetype = (GstFakeSrcSizeType) g_value_get_enum (value); break; case PROP_SIZEMIN: src->sizemin = g_value_get_int (value); break; case PROP_SIZEMAX: src->sizemax = g_value_get_int (value); break; case PROP_PARENTSIZE: src->parentsize = g_value_get_int (value); break; case PROP_FILLTYPE: src->filltype = (GstFakeSrcFillType) g_value_get_enum (value); break; case PROP_DATARATE: src->datarate = g_value_get_int (value); break; case PROP_SYNC: src->sync = g_value_get_boolean (value); break; case PROP_PATTERN: break; case PROP_SILENT: src->silent = g_value_get_boolean (value); break; case PROP_SIGNAL_HANDOFFS: src->signal_handoffs = g_value_get_boolean (value); break; case PROP_DUMP: src->dump = g_value_get_boolean (value); break; case PROP_CAN_ACTIVATE_PUSH: g_return_if_fail (!GST_OBJECT_FLAG_IS_SET (object, GST_BASE_SRC_FLAG_STARTED)); GST_BASE_SRC (src)->can_activate_push = g_value_get_boolean (value); break; case PROP_CAN_ACTIVATE_PULL: g_return_if_fail (!GST_OBJECT_FLAG_IS_SET (object, GST_BASE_SRC_FLAG_STARTED)); src->can_activate_pull = g_value_get_boolean (value); break; case PROP_IS_LIVE: gst_base_src_set_live (basesrc, g_value_get_boolean (value)); break; case PROP_FORMAT: src->format = (GstFormat) g_value_get_enum (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }