diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp')
-rw-r--r-- | Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp | 123 |
1 files changed, 58 insertions, 65 deletions
diff --git a/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp b/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp index 16bd494a9..af068cb08 100644 --- a/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp +++ b/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp @@ -34,46 +34,25 @@ #include "TrackPrivateBase.h" #include <glib-object.h> #include <gst/gst.h> -#include <wtf/gobject/GUniquePtr.h> +#include <gst/tag/tag.h> +#include <wtf/glib/GUniquePtr.h> +#include <wtf/text/CString.h> GST_DEBUG_CATEGORY_EXTERN(webkit_media_player_debug); #define GST_CAT_DEFAULT webkit_media_player_debug namespace WebCore { -static void trackPrivateActiveChangedCallback(GObject*, GParamSpec*, TrackPrivateBaseGStreamer* track) -{ - track->activeChanged(); -} - -static void trackPrivateTagsChangedCallback(GObject*, GParamSpec*, TrackPrivateBaseGStreamer* track) -{ - track->tagsChanged(); -} - -static gboolean trackPrivateActiveChangeTimeoutCallback(TrackPrivateBaseGStreamer* track) -{ - track->notifyTrackOfActiveChanged(); - return FALSE; -} - -static gboolean trackPrivateTagsChangeTimeoutCallback(TrackPrivateBaseGStreamer* track) -{ - track->notifyTrackOfTagsChanged(); - return FALSE; -} - TrackPrivateBaseGStreamer::TrackPrivateBaseGStreamer(TrackPrivateBase* owner, gint index, GRefPtr<GstPad> pad) - : m_index(index) + : m_notifier(MainThreadNotifier<MainThreadNotification>::create()) + , m_index(index) , m_pad(pad) , m_owner(owner) - , m_activeTimerHandler(0) - , m_tagTimerHandler(0) { ASSERT(m_pad); - g_signal_connect(m_pad.get(), "notify::active", G_CALLBACK(trackPrivateActiveChangedCallback), this); - g_signal_connect(m_pad.get(), "notify::tags", G_CALLBACK(trackPrivateTagsChangedCallback), this); + g_signal_connect_swapped(m_pad.get(), "notify::active", G_CALLBACK(activeChangedCallback), this); + g_signal_connect_swapped(m_pad.get(), "notify::tags", G_CALLBACK(tagsChangedCallback), this); // We can't call notifyTrackOfTagsChanged() directly, because we need tagsChanged() // to setup m_tags. @@ -83,6 +62,7 @@ TrackPrivateBaseGStreamer::TrackPrivateBaseGStreamer(TrackPrivateBase* owner, gi TrackPrivateBaseGStreamer::~TrackPrivateBaseGStreamer() { disconnect(); + m_notifier->invalidate(); } void TrackPrivateBaseGStreamer::disconnect() @@ -90,67 +70,71 @@ void TrackPrivateBaseGStreamer::disconnect() if (!m_pad) return; - g_signal_handlers_disconnect_by_func(m_pad.get(), - reinterpret_cast<gpointer>(trackPrivateActiveChangedCallback), this); - g_signal_handlers_disconnect_by_func(m_pad.get(), - reinterpret_cast<gpointer>(trackPrivateTagsChangedCallback), this); - - if (m_activeTimerHandler) - g_source_remove(m_activeTimerHandler); - m_activeTimerHandler = 0; - - if (m_tagTimerHandler) - g_source_remove(m_tagTimerHandler); - m_tagTimerHandler = 0; + m_notifier->cancelPendingNotifications(); + g_signal_handlers_disconnect_matched(m_pad.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this); m_pad.clear(); m_tags.clear(); } -void TrackPrivateBaseGStreamer::activeChanged() +void TrackPrivateBaseGStreamer::activeChangedCallback(TrackPrivateBaseGStreamer* track) { - if (m_activeTimerHandler) - g_source_remove(m_activeTimerHandler); - m_activeTimerHandler = g_timeout_add(0, - reinterpret_cast<GSourceFunc>(trackPrivateActiveChangeTimeoutCallback), this); - g_source_set_name_by_id(m_activeTimerHandler, "[WebKit] trackPrivateActiveChangeTimeoutCallback"); + track->m_notifier->notify(MainThreadNotification::ActiveChanged, [track] { track->notifyTrackOfActiveChanged(); }); } -void TrackPrivateBaseGStreamer::tagsChanged() +void TrackPrivateBaseGStreamer::tagsChangedCallback(TrackPrivateBaseGStreamer* track) { - if (m_tagTimerHandler) - g_source_remove(m_tagTimerHandler); + track->tagsChanged(); +} +void TrackPrivateBaseGStreamer::tagsChanged() +{ GRefPtr<GstTagList> tags; - g_object_get(m_pad.get(), "tags", &tags.outPtr(), NULL); + if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_pad.get()), "tags")) + g_object_get(m_pad.get(), "tags", &tags.outPtr(), nullptr); + else + tags = adoptGRef(gst_tag_list_new_empty()); + { - MutexLocker lock(m_tagMutex); + LockHolder lock(m_tagMutex); m_tags.swap(tags); } - m_tagTimerHandler = g_timeout_add(0, - reinterpret_cast<GSourceFunc>(trackPrivateTagsChangeTimeoutCallback), this); - g_source_set_name_by_id(m_tagTimerHandler, "[WebKit] trackPrivateTagsChangeTimeoutCallback"); + m_notifier->notify(MainThreadNotification::TagsChanged, [this] { notifyTrackOfTagsChanged(); }); } void TrackPrivateBaseGStreamer::notifyTrackOfActiveChanged() { - m_activeTimerHandler = 0; if (!m_pad) return; gboolean active = false; - if (m_pad) - g_object_get(m_pad.get(), "active", &active, NULL); + if (m_pad && g_object_class_find_property(G_OBJECT_GET_CLASS(m_pad.get()), "active")) + g_object_get(m_pad.get(), "active", &active, nullptr); setActive(active); } -bool TrackPrivateBaseGStreamer::getTag(GstTagList* tags, const gchar* tagName, String& value) +bool TrackPrivateBaseGStreamer::getLanguageCode(GstTagList* tags, AtomicString& value) +{ + String language; + if (getTag(tags, GST_TAG_LANGUAGE_CODE, language)) { + language = gst_tag_get_language_code_iso_639_1(language.utf8().data()); + GST_INFO("Converted track %d's language code to %s.", m_index, language.utf8().data()); + if (language != value) { + value = language; + return true; + } + } + return false; +} + +template<class StringType> +bool TrackPrivateBaseGStreamer::getTag(GstTagList* tags, const gchar* tagName, StringType& value) { GUniqueOutPtr<gchar> tagValue; if (gst_tag_list_get_string(tags, tagName, &tagValue.outPtr())) { - INFO_MEDIA_MESSAGE("Track %d got %s %s.", m_index, tagName, tagValue.get()); + GST_INFO("Track %d got %s %s.", m_index, tagName, tagValue.get()); value = tagValue.get(); return true; } @@ -159,24 +143,33 @@ bool TrackPrivateBaseGStreamer::getTag(GstTagList* tags, const gchar* tagName, S void TrackPrivateBaseGStreamer::notifyTrackOfTagsChanged() { - m_tagTimerHandler = 0; if (!m_pad) return; TrackPrivateBaseClient* client = m_owner->client(); + if (!client) + return; + GRefPtr<GstTagList> tags; { - MutexLocker lock(m_tagMutex); + LockHolder lock(m_tagMutex); tags.swap(m_tags); } if (!tags) return; - if (getTag(tags.get(), GST_TAG_TITLE, m_label) && client) - client->labelChanged(m_owner, m_label); + if (getTag(tags.get(), GST_TAG_TITLE, m_label)) + client->labelChanged(m_label); + + AtomicString language; + if (!getLanguageCode(tags.get(), language)) + return; + + if (language == m_language) + return; - if (getTag(tags.get(), GST_TAG_LANGUAGE_CODE, m_language) && client) - client->languageChanged(m_owner, m_language); + m_language = language; + client->languageChanged(m_language); } } // namespace WebCore |