summaryrefslogtreecommitdiff
path: root/ext/gs/gstgscommon.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ext/gs/gstgscommon.cpp')
-rw-r--r--ext/gs/gstgscommon.cpp134
1 files changed, 134 insertions, 0 deletions
diff --git a/ext/gs/gstgscommon.cpp b/ext/gs/gstgscommon.cpp
new file mode 100644
index 000000000..b0f576016
--- /dev/null
+++ b/ext/gs/gstgscommon.cpp
@@ -0,0 +1,134 @@
+/* GStreamer
+ * Copyright (C) 2020 Julien Isorce <jisorce@oblong.com>
+ *
+ * gstgscommon.h:
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * 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., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "gstgscommon.h"
+
+#include "google/cloud/storage/oauth2/compute_engine_credentials.h"
+
+namespace gcs = google::cloud::storage;
+
+namespace {
+
+#if !GLIB_CHECK_VERSION(2, 62, 0)
+ static inline gchar *
+ g_date_time_format_iso8601 (GDateTime * datetime)
+ {
+ GString *
+ outstr = NULL;
+ gchar *
+ main_date = NULL;
+ gint64 offset;
+
+ // Main date and time.
+ main_date = g_date_time_format (datetime, "%Y-%m-%dT%H:%M:%S");
+ outstr = g_string_new (main_date);
+ g_free (main_date);
+
+ // Timezone. Format it as `%:::z` unless the offset is zero, in which case
+ // we can simply use `Z`.
+ offset = g_date_time_get_utc_offset (datetime);
+
+ if (offset == 0) {
+ g_string_append_c (outstr, 'Z');
+ } else {
+ gchar *
+ time_zone = g_date_time_format (datetime, "%:::z");
+ g_string_append (outstr, time_zone);
+ g_free (time_zone);
+ }
+
+ return g_string_free (outstr, FALSE);
+ }
+#endif
+
+} // namespace
+
+std::unique_ptr <
+ google::cloud::storage::Client >
+gst_gs_create_client (const gchar * service_account_email, GError ** error)
+{
+ if (service_account_email) {
+ // Meant to be used from a container running in the Cloud.
+
+ google::cloud::StatusOr < std::shared_ptr <
+ gcs::oauth2::Credentials >> creds (std::make_shared <
+ gcs::oauth2::ComputeEngineCredentials <>> (service_account_email));
+ if (!creds) {
+ g_set_error (error, GST_RESOURCE_ERROR,
+ GST_RESOURCE_ERROR_NOT_AUTHORIZED,
+ "Could not retrieve credentials for the given service account %s (%s)",
+ service_account_email, creds.status ().message ().c_str ());
+ return nullptr;
+ }
+
+ gcs::ClientOptions client_options (std::move (creds.value ()));
+ return std::make_unique < gcs::Client > (client_options,
+ gcs::StrictIdempotencyPolicy ());
+ }
+ // Default account. This is meant to retrieve the credentials automatically
+ // using diffrent methods.
+ google::cloud::StatusOr < gcs::ClientOptions > client_options =
+ gcs::ClientOptions::CreateDefaultClientOptions ();
+
+ if (!client_options) {
+ g_set_error (error, GST_RESOURCE_ERROR,
+ GST_RESOURCE_ERROR_NOT_AUTHORIZED,
+ "Could not create default client options (%s)",
+ client_options.status ().message ().c_str ());
+ return nullptr;
+ }
+ return std::make_unique < gcs::Client > (client_options.value (),
+ gcs::StrictIdempotencyPolicy ());
+}
+
+gboolean
+gst_gs_get_buffer_date (GstBuffer * buffer, GDateTime * start_date,
+ gchar ** buffer_date_str_ptr)
+{
+ gchar *
+ buffer_date_str = NULL;
+ GstClockTime buffer_timestamp = GST_CLOCK_TIME_NONE;
+ GTimeSpan buffer_timespan = 0;
+
+ if (!buffer || !start_date)
+ return FALSE;
+
+ buffer_timestamp = GST_BUFFER_PTS (buffer);
+
+ // GTimeSpan is in micro seconds.
+ buffer_timespan = GST_TIME_AS_USECONDS (buffer_timestamp);
+
+ GDateTime *
+ buffer_date = g_date_time_add (start_date, buffer_timespan);
+ if (!buffer_date)
+ return FALSE;
+
+ buffer_date_str = g_date_time_format_iso8601 (buffer_date);
+ g_date_time_unref (buffer_date);
+
+ if (!buffer_date_str)
+ return FALSE;
+
+ if (buffer_date_str_ptr)
+ *buffer_date_str_ptr = buffer_date_str;
+
+ return TRUE;
+}