adaptivedemux: tests: made fakeHTTPsrc element MT safe
https://bugzilla.gnome.org/show_bug.cgi?id=757776
This commit is contained in:
parent
b328fbe31a
commit
7f3d47deb3
@ -37,6 +37,10 @@
|
|||||||
#define GST_IS_FAKE_SOUP_HTTP_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_FAKE_SOUP_HTTP_SRC))
|
#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_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
|
typedef struct _GstFakeSoupHTTPSrc
|
||||||
{
|
{
|
||||||
GstBaseSrc parent;
|
GstBaseSrc parent;
|
||||||
@ -58,6 +62,9 @@ typedef struct _GstFakeSoupHTTPSrc
|
|||||||
|
|
||||||
/* download error code to simulate during create function */
|
/* download error code to simulate during create function */
|
||||||
guint downloadErrorCode;
|
guint downloadErrorCode;
|
||||||
|
|
||||||
|
/* mutex to protect multithread access to this structure */
|
||||||
|
GMutex lock;
|
||||||
} GstFakeSoupHTTPSrc;
|
} GstFakeSoupHTTPSrc;
|
||||||
|
|
||||||
typedef struct _GstFakeSoupHTTPSrcClass
|
typedef struct _GstFakeSoupHTTPSrcClass
|
||||||
@ -144,6 +151,7 @@ gst_fake_soup_http_src_init (GstFakeSoupHTTPSrc * src)
|
|||||||
src->downloadErrorCode = 0;
|
src->downloadErrorCode = 0;
|
||||||
gst_base_src_set_blocksize (GST_BASE_SRC (src),
|
gst_base_src_set_blocksize (GST_BASE_SRC (src),
|
||||||
GST_FAKE_SOUP_HTTP_SRC_MAX_BUF_SIZE);
|
GST_FAKE_SOUP_HTTP_SRC_MAX_BUF_SIZE);
|
||||||
|
g_mutex_init (&src->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -153,6 +161,7 @@ gst_fake_soup_http_src_finalize (GObject * object)
|
|||||||
|
|
||||||
src = GST_FAKE_SOUP_HTTP_SRC (object);
|
src = GST_FAKE_SOUP_HTTP_SRC (object);
|
||||||
|
|
||||||
|
g_mutex_clear (&src->lock);
|
||||||
g_free (src->uri);
|
g_free (src->uri);
|
||||||
|
|
||||||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||||
@ -166,9 +175,12 @@ gst_fake_soup_http_src_start (GstBaseSrc * basesrc)
|
|||||||
|
|
||||||
src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
|
src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
|
||||||
|
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
|
||||||
|
|
||||||
if (!src->uri) {
|
if (!src->uri) {
|
||||||
GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (("No URL set.")),
|
GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (("No URL set.")),
|
||||||
("Missing location property"));
|
("Missing location property"));
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -183,6 +195,7 @@ gst_fake_soup_http_src_start (GstBaseSrc * basesrc)
|
|||||||
src->segment_end = src->size;
|
src->segment_end = src->size;
|
||||||
src->downloadErrorCode = 0;
|
src->downloadErrorCode = 0;
|
||||||
gst_base_src_set_dynamic_size (basesrc, FALSE);
|
gst_base_src_set_dynamic_size (basesrc, FALSE);
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -190,6 +203,7 @@ gst_fake_soup_http_src_start (GstBaseSrc * basesrc)
|
|||||||
GST_WARNING
|
GST_WARNING
|
||||||
("gst_fake_soup_http_src_start cannot find url '%s' in input data",
|
("gst_fake_soup_http_src_start cannot find url '%s' in input data",
|
||||||
src->uri);
|
src->uri);
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -199,9 +213,13 @@ gst_fake_soup_http_src_stop (GstBaseSrc * basesrc)
|
|||||||
GstFakeSoupHTTPSrc *src;
|
GstFakeSoupHTTPSrc *src;
|
||||||
|
|
||||||
src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
|
src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
|
||||||
|
|
||||||
src->payload = NULL;
|
src->payload = NULL;
|
||||||
src->position = 0;
|
src->position = 0;
|
||||||
src->size = 0;
|
src->size = 0;
|
||||||
|
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,11 +227,18 @@ static gboolean
|
|||||||
gst_fake_soup_http_src_is_seekable (GstBaseSrc * basesrc)
|
gst_fake_soup_http_src_is_seekable (GstBaseSrc * basesrc)
|
||||||
{
|
{
|
||||||
GstFakeSoupHTTPSrc *src;
|
GstFakeSoupHTTPSrc *src;
|
||||||
|
gboolean ret;
|
||||||
|
|
||||||
src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
|
src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
|
||||||
|
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
|
||||||
|
|
||||||
/* if size is set, we can seek */
|
/* 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
|
static gboolean
|
||||||
@ -225,6 +250,8 @@ gst_fake_soup_http_src_do_seek (GstBaseSrc * basesrc, GstSegment * segment)
|
|||||||
segment->start);
|
segment->start);
|
||||||
src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
|
src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
|
||||||
|
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
According to RFC7233, the range is inclusive:
|
According to RFC7233, the range is inclusive:
|
||||||
The first-byte-pos value in a byte-range-spec gives the byte-offset
|
The first-byte-pos value in a byte-range-spec gives the byte-offset
|
||||||
@ -234,14 +261,17 @@ gst_fake_soup_http_src_do_seek (GstBaseSrc * basesrc, GstSegment * segment)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if (!src->uri) {
|
if (!src->uri) {
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (segment->start >= src->size) {
|
if (segment->start >= src->size) {
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (segment->stop != -1 && segment->stop > src->size) {
|
if (segment->stop != -1 && segment->stop > src->size) {
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -251,6 +281,7 @@ gst_fake_soup_http_src_do_seek (GstBaseSrc * basesrc, GstSegment * segment)
|
|||||||
src->segment_end = segment->stop;
|
src->segment_end = segment->stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -262,13 +293,17 @@ gst_fake_soup_http_src_get_size (GstBaseSrc * basesrc, guint64 * size)
|
|||||||
|
|
||||||
src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
|
src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
|
||||||
|
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
|
||||||
|
|
||||||
if (!src->uri) {
|
if (!src->uri) {
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if it was started (payload or size configured), size is set */
|
/* if it was started (payload or size configured), size is set */
|
||||||
if (src->payload || src->size > 0) {
|
if (src->payload || src->size > 0) {
|
||||||
*size = src->size;
|
*size = src->size;
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -279,9 +314,11 @@ gst_fake_soup_http_src_get_size (GstBaseSrc * basesrc, guint64 * size)
|
|||||||
*size = strlen (input[i].payload);
|
*size = strlen (input[i].payload);
|
||||||
else
|
else
|
||||||
*size = input[i].size;
|
*size = input[i].size;
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -295,10 +332,13 @@ gst_fake_soup_http_src_create (GstBaseSrc * basesrc, guint64 offset,
|
|||||||
|
|
||||||
src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
|
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,
|
GST_DEBUG ("gst_fake_soup_http_src_create feeding from %" G_GUINT64_FORMAT,
|
||||||
src->position);
|
src->position);
|
||||||
if (src->uri == NULL) {
|
if (src->uri == NULL) {
|
||||||
GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM);
|
GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM);
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
|
||||||
return GST_FLOW_ERROR;
|
return GST_FLOW_ERROR;
|
||||||
}
|
}
|
||||||
if (src->downloadErrorCode) {
|
if (src->downloadErrorCode) {
|
||||||
@ -306,12 +346,14 @@ gst_fake_soup_http_src_create (GstBaseSrc * basesrc, guint64 offset,
|
|||||||
"Generated requested error"), ("%s (%d), URL: %s, Redirect to: %s",
|
"Generated requested error"), ("%s (%d), URL: %s, Redirect to: %s",
|
||||||
"Generated requested error", src->downloadErrorCode, src->uri,
|
"Generated requested error", src->downloadErrorCode, src->uri,
|
||||||
GST_STR_NULL (NULL)));
|
GST_STR_NULL (NULL)));
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
|
||||||
return GST_FLOW_ERROR;
|
return GST_FLOW_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
bytes_read = MIN ((src->segment_end - src->position),
|
bytes_read = MIN ((src->segment_end - src->position),
|
||||||
GST_FAKE_SOUP_HTTP_SRC_MAX_BUF_SIZE);
|
GST_FAKE_SOUP_HTTP_SRC_MAX_BUF_SIZE);
|
||||||
if (bytes_read == 0) {
|
if (bytes_read == 0) {
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
|
||||||
return GST_FLOW_EOS;
|
return GST_FLOW_EOS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -343,9 +385,11 @@ gst_fake_soup_http_src_create (GstBaseSrc * basesrc, guint64 offset,
|
|||||||
|
|
||||||
src->position += bytes_read;
|
src->position += bytes_read;
|
||||||
|
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* must be called with the lock taken */
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_fake_soup_http_src_set_location (GstFakeSoupHTTPSrc * src,
|
gst_fake_soup_http_src_set_location (GstFakeSoupHTTPSrc * src,
|
||||||
const gchar * uri, GError ** error)
|
const gchar * uri, GError ** error)
|
||||||
@ -373,7 +417,12 @@ static gchar *
|
|||||||
gst_fake_soup_http_src_uri_get_uri (GstURIHandler * handler)
|
gst_fake_soup_http_src_uri_get_uri (GstURIHandler * handler)
|
||||||
{
|
{
|
||||||
GstFakeSoupHTTPSrc *src = GST_FAKE_SOUP_HTTP_SRC (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
|
static gboolean
|
||||||
@ -381,8 +430,15 @@ gst_fake_soup_http_src_uri_set_uri (GstURIHandler * handler, const gchar * uri,
|
|||||||
GError ** err)
|
GError ** err)
|
||||||
{
|
{
|
||||||
GstFakeSoupHTTPSrc *src = GST_FAKE_SOUP_HTTP_SRC (handler);
|
GstFakeSoupHTTPSrc *src = GST_FAKE_SOUP_HTTP_SRC (handler);
|
||||||
|
gboolean ret;
|
||||||
|
|
||||||
return gst_fake_soup_http_src_set_location (src, uri, err);
|
GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
|
||||||
|
|
||||||
|
ret = gst_fake_soup_http_src_set_location (src, uri, err);
|
||||||
|
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -449,5 +505,7 @@ void
|
|||||||
gst_fake_soup_http_src_simulate_download_error (GstFakeSoupHTTPSrc *
|
gst_fake_soup_http_src_simulate_download_error (GstFakeSoupHTTPSrc *
|
||||||
fakeSoupHTTPSrc, guint downloadErrorCode)
|
fakeSoupHTTPSrc, guint downloadErrorCode)
|
||||||
{
|
{
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_LOCK (fakeSoupHTTPSrc);
|
||||||
fakeSoupHTTPSrc->downloadErrorCode = downloadErrorCode;
|
fakeSoupHTTPSrc->downloadErrorCode = downloadErrorCode;
|
||||||
|
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (fakeSoupHTTPSrc);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user