#define GST_IS_FAKE_SOUP_HTTP_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_FAKE_SOUP_HTTP_SRC))
#define GST_FAKE_SOUP_HTTP_SRC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_FAKE_SOUP_HTTP_SRC, GstFakeSoupHTTPSrcClass))
+#define GST_FAKE_SOUP_HTTP_SRC_GET_LOCK(d) (&(((GstFakeSoupHTTPSrc*)(d))->lock))
+#define GST_FAKE_SOUP_HTTP_SRC_LOCK(d) g_mutex_lock (GST_FAKE_SOUP_HTTP_SRC_GET_LOCK (d))
+#define GST_FAKE_SOUP_HTTP_SRC_UNLOCK(d) g_mutex_unlock (GST_FAKE_SOUP_HTTP_SRC_GET_LOCK (d))
+
typedef struct _GstFakeSoupHTTPSrc
{
GstBaseSrc parent;
/* download error code to simulate during create function */
guint downloadErrorCode;
+
+ /* mutex to protect multithread access to this structure */
+ GMutex lock;
} GstFakeSoupHTTPSrc;
typedef struct _GstFakeSoupHTTPSrcClass
src->downloadErrorCode = 0;
gst_base_src_set_blocksize (GST_BASE_SRC (src),
GST_FAKE_SOUP_HTTP_SRC_MAX_BUF_SIZE);
+ g_mutex_init (&src->lock);
}
static void
src = GST_FAKE_SOUP_HTTP_SRC (object);
+ g_mutex_clear (&src->lock);
g_free (src->uri);
G_OBJECT_CLASS (parent_class)->finalize (object);
src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
+ GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
+
if (!src->uri) {
GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (("No URL set.")),
("Missing location property"));
+ GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return FALSE;
}
src->segment_end = src->size;
src->downloadErrorCode = 0;
gst_base_src_set_dynamic_size (basesrc, FALSE);
+ GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return TRUE;
}
}
GST_WARNING
("gst_fake_soup_http_src_start cannot find url '%s' in input data",
src->uri);
+ GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return FALSE;
}
GstFakeSoupHTTPSrc *src;
src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
+ GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
+
src->payload = NULL;
src->position = 0;
src->size = 0;
+
+ GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return TRUE;
}
gst_fake_soup_http_src_is_seekable (GstBaseSrc * basesrc)
{
GstFakeSoupHTTPSrc *src;
+ gboolean ret;
src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
+ GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
+
/* if size is set, we can seek */
- return src->size > 0;
+ ret = src->size > 0;
+
+ GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
+
+ return ret;
}
static gboolean
segment->start);
src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
+ GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
+
/*
According to RFC7233, the range is inclusive:
The first-byte-pos value in a byte-range-spec gives the byte-offset
*/
if (!src->uri) {
+ GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return FALSE;
}
if (segment->start >= src->size) {
+ GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return FALSE;
}
if (segment->stop != -1 && segment->stop > src->size) {
+ GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return FALSE;
}
src->segment_end = segment->stop;
}
+ GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return TRUE;
}
src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
+ GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
+
if (!src->uri) {
+ GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return FALSE;
}
/* if it was started (payload or size configured), size is set */
if (src->payload || src->size > 0) {
*size = src->size;
+ GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return TRUE;
}
*size = strlen (input[i].payload);
else
*size = input[i].size;
+ GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return TRUE;
}
}
+ GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return FALSE;
}
src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
+ GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
+
GST_DEBUG ("gst_fake_soup_http_src_create feeding from %" G_GUINT64_FORMAT,
src->position);
if (src->uri == NULL) {
GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM);
+ GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return GST_FLOW_ERROR;
}
if (src->downloadErrorCode) {
"Generated requested error"), ("%s (%d), URL: %s, Redirect to: %s",
"Generated requested error", src->downloadErrorCode, src->uri,
GST_STR_NULL (NULL)));
+ GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return GST_FLOW_ERROR;
}
bytes_read = MIN ((src->segment_end - src->position),
GST_FAKE_SOUP_HTTP_SRC_MAX_BUF_SIZE);
if (bytes_read == 0) {
+ GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return GST_FLOW_EOS;
}
src->position += bytes_read;
+ GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return GST_FLOW_OK;
}
+/* must be called with the lock taken */
static gboolean
gst_fake_soup_http_src_set_location (GstFakeSoupHTTPSrc * src,
const gchar * uri, GError ** error)
gst_fake_soup_http_src_uri_get_uri (GstURIHandler * handler)
{
GstFakeSoupHTTPSrc *src = GST_FAKE_SOUP_HTTP_SRC (handler);
- return g_strdup (src->uri);
+ gchar *uri;
+
+ GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
+ uri = g_strdup (src->uri);
+ GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
+ return uri;
}
static gboolean
GError ** err)
{
GstFakeSoupHTTPSrc *src = GST_FAKE_SOUP_HTTP_SRC (handler);
+ gboolean ret;
+
+ GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
+
+ ret = gst_fake_soup_http_src_set_location (src, uri, err);
- return gst_fake_soup_http_src_set_location (src, uri, err);
+ GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
+
+ return ret;
}
static void
gst_fake_soup_http_src_simulate_download_error (GstFakeSoupHTTPSrc *
fakeSoupHTTPSrc, guint downloadErrorCode)
{
+ GST_FAKE_SOUP_HTTP_SRC_LOCK (fakeSoupHTTPSrc);
fakeSoupHTTPSrc->downloadErrorCode = downloadErrorCode;
+ GST_FAKE_SOUP_HTTP_SRC_UNLOCK (fakeSoupHTTPSrc);
}