*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
*/
/**
#endif
#include <gst/video/video.h>
+#include <gst/audio/audio.h>
#include "pbutils.h"
#include "pbutils-private.h"
-#include "gst/glib-compat-private.h"
-
GST_DEBUG_CATEGORY_STATIC (discoverer_debug);
#define GST_CAT_DEFAULT discoverer_debug
/* list of pending URI to process (current excluded) */
GList *pending_uris;
- GMutex *lock;
+ GMutex lock;
/* TRUE if processing a URI */
gboolean processing;
gulong bus_cb_id;
};
-#define DISCO_LOCK(dc) g_mutex_lock (dc->priv->lock);
-#define DISCO_UNLOCK(dc) g_mutex_unlock (dc->priv->lock);
+#define DISCO_LOCK(dc) g_mutex_lock (&dc->priv->lock);
+#define DISCO_UNLOCK(dc) g_mutex_unlock (&dc->priv->lock);
static void
_do_init (void)
GParamSpec * pspec, GstDiscoverer * dc);
static void gst_discoverer_dispose (GObject * dc);
+static void gst_discoverer_finalize (GObject * dc);
static void gst_discoverer_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_discoverer_get_property (GObject * object, guint prop_id,
GObjectClass *gobject_class = (GObjectClass *) klass;
gobject_class->dispose = gst_discoverer_dispose;
+ gobject_class->finalize = gst_discoverer_finalize;
gobject_class->set_property = gst_discoverer_set_property;
gobject_class->get_property = gst_discoverer_get_property;
dc->priv->async = FALSE;
dc->priv->async_done = FALSE;
- dc->priv->lock = g_mutex_new ();
+ g_mutex_init (&dc->priv->lock);
dc->priv->pending_subtitle_pads = 0;
gst_discoverer_stop (dc);
- if (dc->priv->lock) {
- g_mutex_free (dc->priv->lock);
- dc->priv->lock = NULL;
- }
-
if (dc->priv->seeking_query) {
gst_query_unref (dc->priv->seeking_query);
dc->priv->seeking_query = NULL;
}
static void
+gst_discoverer_finalize (GObject * obj)
+{
+ GstDiscoverer *dc = (GstDiscoverer *) obj;
+
+ g_mutex_clear (&dc->priv->lock);
+
+ G_OBJECT_CLASS (gst_discoverer_parent_class)->finalize (obj);
+}
+
+static void
gst_discoverer_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
{
ps->tags);
tmp = gst_tag_list_merge (ps->tags, tl, GST_TAG_MERGE_APPEND);
if (ps->tags)
- gst_tag_list_free (ps->tags);
+ gst_tag_list_unref (ps->tags);
ps->tags = tmp;
GST_DEBUG_OBJECT (pad, "private stream %p new tags %" GST_PTR_FORMAT, ps,
tmp);
return GST_PAD_PROBE_OK;
}
-static GstStaticCaps subtitle_caps = GST_STATIC_CAPS ("text/plain; "
- "text/x-pango-markup; subpicture/x-pgs; subpicture/x-dvb; "
+static GstStaticCaps subtitle_caps = GST_STATIC_CAPS ("text/x-raw; "
+ "subpicture/x-pgs; subpicture/x-dvb; subpicture/x-dvd; "
"application/x-subtitle-unknown; application/x-ssa; application/x-ass; "
- "subtitle/x-kate; application/x-kate; video/x-dvd-subpicture");
+ "subtitle/x-kate; application/x-kate");
static gboolean
is_subtitle_caps (const GstCaps * caps)
gst_bin_remove_many (dc->priv->pipeline, ps->sink, ps->queue, NULL);
if (ps->tags) {
- gst_tag_list_free (ps->tags);
+ gst_tag_list_unref (ps->tags);
}
if (ps->toc) {
gst_toc_unref (ps->toc);
}
gst_tag_list_insert (*taglist, new_tags, GST_TAG_MERGE_REPLACE);
- gst_tag_list_free (new_tags);
+ gst_tag_list_unref (new_tags);
}
/* Parses a set of caps and tags in st and populates a GstDiscovererStreamInfo
if (g_str_has_prefix (name, "audio/")) {
GstDiscovererAudioInfo *info;
+ const gchar *format_str;
if (parent)
info = (GstDiscovererAudioInfo *) gst_discoverer_stream_info_ref (parent);
if (gst_structure_get_int (caps_st, "channels", &tmp))
info->channels = (guint) tmp;
- if (gst_structure_get_int (caps_st, "depth", &tmp))
- info->depth = (guint) tmp;
+ /* FIXME: we only want to extract depth if raw audio is what's in the
+ * container (i.e. not if there is a decoder involved) */
+ format_str = gst_structure_get_string (caps_st, "format");
+ if (format_str != NULL) {
+ const GstAudioFormatInfo *finfo;
+ GstAudioFormat format;
+
+ format = gst_audio_format_from_string (format_str);
+ finfo = gst_audio_format_get_info (format);
+ info->depth = GST_AUDIO_FORMAT_INFO_DEPTH (finfo);
+ }
if (gst_structure_id_has_field (st, _TAGS_QUARK)) {
gst_structure_id_get (st, _TAGS_QUARK, GST_TYPE_TAG_LIST, &tags_st, NULL);
info->parent.caps = gst_caps_ref (caps);
}
- /* FIXME : gst_video_info_from_caps only works with raw caps,
- * wouldn't we want to get all the info below for non-raw caps ?
- */
- if (g_str_has_prefix (name, "video/x-raw") &&
- gst_video_info_from_caps (&vinfo, caps)) {
+ if (gst_video_info_from_caps (&vinfo, caps)) {
info->width = (guint) vinfo.width;
info->height = (guint) vinfo.height;
GList *tmp;
if (!gst_structure_id_has_field (topology, _TOPOLOGY_PAD_QUARK)) {
- GST_DEBUG ("Could not find pad for node %" GST_PTR_FORMAT "\n", topology);
+ GST_DEBUG ("Could not find pad for node %" GST_PTR_FORMAT, topology);
return NULL;
}
tmp =
gst_tag_list_merge (cont->parent.tags, (GstTagList *) tags,
GST_TAG_MERGE_APPEND);
- gst_tag_list_free (tags);
+ gst_tag_list_unref (tags);
if (cont->parent.tags)
- gst_tag_list_free (cont->parent.tags);
+ gst_tag_list_unref (cont->parent.tags);
cont->parent.tags = tmp;
GST_DEBUG ("Container info tags %" GST_PTR_FORMAT, tmp);
}
if (dc->priv->current_info->duration == 0 &&
dc->priv->current_info->stream_info != NULL &&
dc->priv->current_info->stream_info->next == NULL) {
- GstStructure *st =
- gst_caps_get_structure (dc->priv->current_info->stream_info->caps, 0);
+ GstDiscovererStreamInfo *stream_info;
+ GstStructure *st;
+
+ stream_info = dc->priv->current_info->stream_info;
+ st = gst_caps_get_structure (stream_info->caps, 0);
if (g_str_has_prefix (gst_structure_get_name (st), "image/"))
- ((GstDiscovererVideoInfo *) dc->priv->current_info->
- stream_info)->is_image = TRUE;
+ ((GstDiscovererVideoInfo *) stream_info)->is_image = TRUE;
}
}
tmp =
gst_tag_list_merge (dc->priv->current_info->tags, tl,
GST_TAG_MERGE_APPEND);
- gst_tag_list_free (tl);
+ gst_tag_list_unref (tl);
if (dc->priv->current_info->tags)
- gst_tag_list_free (dc->priv->current_info->tags);
+ gst_tag_list_unref (dc->priv->current_info->tags);
dc->priv->current_info->tags = tmp;
GST_DEBUG_OBJECT (GST_MESSAGE_SRC (msg), "Current info %p, tags %"
GST_PTR_FORMAT, dc->priv->current_info, tmp);