diff options
author | Sebastian Dröge <slomo@circular-chaos.org> | 2013-09-26 13:37:09 +0200 |
---|---|---|
committer | Sebastian Dröge <slomo@circular-chaos.org> | 2013-09-28 20:36:21 +0200 |
commit | 4bed01aff9c2090a9360fcd0655c2ddf4179e564 (patch) | |
tree | ba1b1f96f255b2c376535be52a72f660bd5ea0c2 | |
parent | e5d5faa67eb69a457b3addf6113b09a068bbacf5 (diff) | |
download | gstreamer-plugins-bad-4bed01aff9c2090a9360fcd0655c2ddf4179e564.tar.gz |
iosassetsrc: Port to 1.0 and fix some bugs on the way
-rw-r--r-- | sys/applemedia/Makefile.am | 6 | ||||
-rw-r--r-- | sys/applemedia/iosassetsrc.h | 3 | ||||
-rw-r--r-- | sys/applemedia/iosassetsrc.m | 116 |
3 files changed, 63 insertions, 62 deletions
diff --git a/sys/applemedia/Makefile.am b/sys/applemedia/Makefile.am index 27872b450..04b525a63 100644 --- a/sys/applemedia/Makefile.am +++ b/sys/applemedia/Makefile.am @@ -76,9 +76,9 @@ libgstapplemedia_la_SOURCES += \ iosassetsrc.m # avfvideosrc.m -#libgstapplemedia_la_LDFLAGS += \ -# -Wl,-framework -Wl,CoreMedia \ -# -Wl,-framework -Wl,Foundation \ +libgstapplemedia_la_LDFLAGS += \ + -Wl,-framework -Wl,Foundation \ + -Wl,-framework -Wl,AssetsLibrary # -Wl,-framework -Wl,AVFoundation else diff --git a/sys/applemedia/iosassetsrc.h b/sys/applemedia/iosassetsrc.h index d87493853..550b37a05 100644 --- a/sys/applemedia/iosassetsrc.h +++ b/sys/applemedia/iosassetsrc.h @@ -1,6 +1,7 @@ /* GStreamer * Copyright (C) 2013 Fluendo S.L. <support@fluendo.com> * Authors: 2013 Andoni Morales Alastruey <amorales@fluendo.com> + * Copyright (C) 2013 Sebastian Dröge <slomo@circular-chaos.org> * * gstios_assetsrc.h: * @@ -26,7 +27,7 @@ #include <sys/types.h> #include <gst/gst.h> -#include <gst/base/gstbasesrc.h> +#include <gst/base/base.h> #include <AssetsLibrary/ALAssetsLibrary.h> #include <AssetsLibrary/ALAssetRepresentation.h> diff --git a/sys/applemedia/iosassetsrc.m b/sys/applemedia/iosassetsrc.m index 4464316dd..91bce1165 100644 --- a/sys/applemedia/iosassetsrc.m +++ b/sys/applemedia/iosassetsrc.m @@ -1,6 +1,7 @@ /* GStreamer - * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu> - * 2000,2005 Wim Taymans <wim@fluendo.com> + * Copyright (C) 2013 Fluendo S.L. <support@fluendo.com> + * Authors: 2013 Andoni Morales Alastruey <amorales@fluendo.com> + * Copyright (C) 2013 Sebastian Dröge <slomo@circular-chaos.org> * * gstios_assetsrc.c: * @@ -59,8 +60,8 @@ GST_DEBUG_CATEGORY_STATIC (gst_ios_asset_src_debug); enum { - ARG_0, - ARG_URI, + PROP_0, + PROP_URI, }; static void gst_ios_asset_src_finalize (GObject * object); @@ -96,37 +97,24 @@ _do_init (GType ios_assetsrc_type) GST_DEBUG_CATEGORY_INIT (gst_ios_asset_src_debug, "iosassetsrc", 0, "iosassetsrc element"); } -GST_BOILERPLATE_FULL (GstIOSAssetSrc, gst_ios_asset_src, GstBaseSrc, GST_TYPE_BASE_SRC, - _do_init); - -static void -gst_ios_asset_src_base_init (gpointer g_class) -{ - GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_set_details_simple (gstelement_class, - "IOSAsset Source", - "Source/File", - "Read from arbitrary point in a iOS asset", - "Andoni Morales Alastruey <amorales@fluendo.com>"); - - gst_element_class_add_pad_template (gstelement_class, - gst_static_pad_template_get (&srctemplate)); -} +G_DEFINE_TYPE_WITH_CODE (GstIOSAssetSrc, gst_ios_asset_src, GST_TYPE_BASE_SRC, + _do_init (g_define_type_id)); static void gst_ios_asset_src_class_init (GstIOSAssetSrcClass * klass) { GObjectClass *gobject_class; + GstElementClass *gstelement_class; GstBaseSrcClass *gstbasesrc_class; gobject_class = G_OBJECT_CLASS (klass); + gstelement_class = GST_ELEMENT_CLASS (klass); gstbasesrc_class = GST_BASE_SRC_CLASS (klass); gobject_class->set_property = gst_ios_asset_src_set_property; gobject_class->get_property = gst_ios_asset_src_get_property; - g_object_class_install_property (gobject_class, ARG_URI, + g_object_class_install_property (gobject_class, PROP_URI, g_param_spec_string ("uri", "Asset URI", "URI of the asset to read", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | @@ -134,6 +122,15 @@ gst_ios_asset_src_class_init (GstIOSAssetSrcClass * klass) gobject_class->finalize = gst_ios_asset_src_finalize; + gst_element_class_set_static_metadata (gstelement_class, + "IOSAsset Source", + "Source/File", + "Read from arbitrary point in a iOS asset", + "Andoni Morales Alastruey <amorales@fluendo.com>"); + + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&srctemplate)); + gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_ios_asset_src_start); gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_ios_asset_src_stop); gstbasesrc_class->is_seekable = GST_DEBUG_FUNCPTR (gst_ios_asset_src_is_seekable); @@ -143,7 +140,7 @@ gst_ios_asset_src_class_init (GstIOSAssetSrcClass * klass) } static void -gst_ios_asset_src_init (GstIOSAssetSrc * src, GstIOSAssetSrcClass * g_class) +gst_ios_asset_src_init (GstIOSAssetSrc * src) { OBJC_CALLOUT_BEGIN (); src->uri = NULL; @@ -185,11 +182,11 @@ gst_ios_asset_src_finalize (GObject * object) [src->library release]; OBJC_CALLOUT_END (); - G_OBJECT_CLASS (parent_class)->finalize (object); + G_OBJECT_CLASS (gst_ios_asset_src_parent_class)->finalize (object); } static gboolean -gst_ios_asset_src_set_uri (GstIOSAssetSrc * src, const gchar * uri) +gst_ios_asset_src_set_uri (GstIOSAssetSrc * src, const gchar * uri, GError **err) { GstState state; NSString *nsuristr; @@ -209,7 +206,9 @@ gst_ios_asset_src_set_uri (GstIOSAssetSrc * src, const gchar * uri) url = [[NSURL alloc] initWithString:nsuristr]; if (url == NULL) { - GST_ERROR_OBJECT (src, "Invalid URI : %s", src->uri); + GST_ERROR_OBJECT (src, "Invalid URI: %s", src->uri); + g_set_error (err, GST_URI_ERROR, GST_URI_ERROR_BAD_URI, + "Invalid URI: %s", src->uri); return FALSE; } @@ -217,7 +216,6 @@ gst_ios_asset_src_set_uri (GstIOSAssetSrc * src, const gchar * uri) src->url = url; src->uri = g_strdup (uri); g_object_notify (G_OBJECT (src), "uri"); - gst_uri_handler_new_uri (GST_URI_HANDLER (src), src->uri); OBJC_CALLOUT_END (); return TRUE; @@ -227,6 +225,9 @@ wrong_state: { g_warning ("Changing the 'uri' property on iosassetsrc when an asset is " "open is not supported."); + g_set_error (err, GST_URI_ERROR, GST_URI_ERROR_BAD_STATE, + "Changing the 'uri' property on iosassetsrc when an asset is " + "open is not supported."); GST_OBJECT_UNLOCK (src); OBJC_CALLOUT_END (); return FALSE; @@ -244,8 +245,8 @@ gst_ios_asset_src_set_property (GObject * object, guint prop_id, src = GST_IOS_ASSET_SRC (object); switch (prop_id) { - case ARG_URI: - gst_ios_asset_src_set_uri (src, g_value_get_string (value)); + case PROP_URI: + gst_ios_asset_src_set_uri (src, g_value_get_string (value), NULL); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -264,7 +265,7 @@ gst_ios_asset_src_get_property (GObject * object, guint prop_id, GValue * value, src = GST_IOS_ASSET_SRC (object); switch (prop_id) { - case ARG_URI: + case PROP_URI: g_value_set_string (value, src->uri); break; default: @@ -277,25 +278,25 @@ static GstFlowReturn gst_ios_asset_src_create (GstBaseSrc * basesrc, guint64 offset, guint length, GstBuffer ** buffer) { - GstBuffer *buf; + GstBuffer *buf = NULL; + GstMapInfo info; NSError *err = nil; guint bytes_read; GstFlowReturn ret; GstIOSAssetSrc *src = GST_IOS_ASSET_SRC (basesrc); OBJC_CALLOUT_BEGIN (); - buf = gst_buffer_try_new_and_alloc (length); + buf = gst_buffer_new_and_alloc (length); if (G_UNLIKELY (buf == NULL && length > 0)) { GST_ERROR_OBJECT (src, "Failed to allocate %u bytes", length); ret = GST_FLOW_ERROR; goto exit; } + gst_buffer_map (buf, &info, GST_MAP_READWRITE); + /* No need to read anything if length is 0 */ - GST_BUFFER_SIZE (buf) = 0; - GST_BUFFER_OFFSET (buf) = offset; - GST_BUFFER_OFFSET_END (buf) = offset; - bytes_read = [src->asset getBytes: GST_BUFFER_DATA (buf) + bytes_read = [src->asset getBytes: info.data fromOffset:offset length:length error:&err]; @@ -305,32 +306,31 @@ gst_ios_asset_src_create (GstBaseSrc * basesrc, guint64 offset, guint length, /* we should eos if we read less than what was requested */ if (G_UNLIKELY (bytes_read < length)) { - goto eos; + GST_DEBUG ("EOS"); + ret = GST_FLOW_EOS; + } else { + ret = GST_FLOW_OK; } - GST_BUFFER_SIZE (buf) = bytes_read; + gst_buffer_unmap (buf, &info); + gst_buffer_set_size (buf, bytes_read); + + GST_BUFFER_OFFSET (buf) = offset; GST_BUFFER_OFFSET_END (buf) = offset + bytes_read; *buffer = buf; - ret = GST_FLOW_OK; goto exit; /* ERROR */ could_not_read: { GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM); + gst_buffer_unmap (buf, &info); gst_buffer_unref (buf); ret = GST_FLOW_ERROR; goto exit; } -eos: - { - GST_DEBUG ("EOS"); - gst_buffer_unref (buf); - ret = GST_FLOW_UNEXPECTED; - goto exit; - } exit: { OBJC_CALLOUT_END (); @@ -356,7 +356,7 @@ gst_ios_asset_src_query (GstBaseSrc * basesrc, GstQuery * query) } if (!ret) - ret = GST_BASE_SRC_CLASS (parent_class)->query (basesrc, query); + ret = GST_BASE_SRC_CLASS (gst_ios_asset_src_parent_class)->query (basesrc, query); return ret; } @@ -413,40 +413,40 @@ gst_ios_asset_src_stop (GstBaseSrc * basesrc) } static GstURIType -gst_ios_asset_src_uri_get_type (void) +gst_ios_asset_src_uri_get_type (GType type) { return GST_URI_SRC; } -static gchar ** -gst_ios_asset_src_uri_get_protocols (void) +static const gchar * const * +gst_ios_asset_src_uri_get_protocols (GType type) { - static gchar *protocols[] = { (char *) "assets-library", NULL }; + static const gchar * const protocols[] = { "assets-library", NULL }; return protocols; } -static const gchar * +static gchar * gst_ios_asset_src_uri_get_uri (GstURIHandler * handler) { GstIOSAssetSrc *src = GST_IOS_ASSET_SRC (handler); - return src->uri; + return g_strdup (src->uri); } static gboolean -gst_ios_asset_src_uri_set_uri (GstURIHandler * handler, const gchar * uri) +gst_ios_asset_src_uri_set_uri (GstURIHandler * handler, const gchar * uri, GError **err) { GstIOSAssetSrc *src = GST_IOS_ASSET_SRC (handler); - GError *error = NULL; if (! g_str_has_prefix (uri, "assets-library://")) { - GST_WARNING_OBJECT (src, "Invalid URI '%s' for ios_assetsrc: %s", uri, - error->message); + GST_WARNING_OBJECT (src, "Invalid URI '%s' for ios_assetsrc", uri); + g_set_error (err, GST_URI_ERROR, GST_URI_ERROR_BAD_URI, + "Invalid URI '%s' for ios_assetsrc", uri); return FALSE; } - return gst_ios_asset_src_set_uri (src, uri); + return gst_ios_asset_src_set_uri (src, uri, err); } static void |