[shotwell/wip/phako/external-gstreamer: 40/43] WIP
- From: Jens Georg <jensgeorg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [shotwell/wip/phako/external-gstreamer: 40/43] WIP
- Date: Wed, 31 Jul 2019 12:43:04 +0000 (UTC)
commit 8bdef17912e9313d0c8c88be4dd1c04f75964539
Author: Jens Georg <mail jensge org>
Date: Sat May 18 12:03:49 2019 +0200
WIP
src/video-support/AVIMetadataLoader.vala | 4 +-
src/video-support/QuicktimeMetdataLoader.vala | 4 +-
src/video-support/VideoMetadata.vala | 34 +++++++--------
src/video-support/VideoMetadataInterface.vala | 1 +
src/video-support/VideoMetadataReaderProcess.vala | 51 ++++++++++++++++++++---
src/video-support/VideoReader.vala | 34 +++++++++------
src/video-support/meson.build | 7 +++-
7 files changed, 95 insertions(+), 40 deletions(-)
---
diff --git a/src/video-support/AVIMetadataLoader.vala b/src/video-support/AVIMetadataLoader.vala
index 7ba6fe88..037afde0 100644
--- a/src/video-support/AVIMetadataLoader.vala
+++ b/src/video-support/AVIMetadataLoader.vala
@@ -15,8 +15,8 @@ public class AVIMetadataLoader {
this.file = file;
}
- public MetadataDateTime? get_creation_date_time() {
- return new MetadataDateTime((time_t) get_creation_date_time_for_avi());
+ public string get_creation_date_time() {
+ return get_creation_date_time_for_avi().to_string();
}
public string? get_title() {
diff --git a/src/video-support/QuicktimeMetdataLoader.vala b/src/video-support/QuicktimeMetdataLoader.vala
index 4a9eec33..4da84efc 100644
--- a/src/video-support/QuicktimeMetdataLoader.vala
+++ b/src/video-support/QuicktimeMetdataLoader.vala
@@ -10,8 +10,8 @@ public class QuickTimeMetadataLoader {
this.file = file;
}
- public MetadataDateTime? get_creation_date_time() {
- return new MetadataDateTime((time_t) get_creation_date_time_for_quicktime());
+ public string get_creation_date_time() {
+ return get_creation_date_time_for_quicktime().to_string();
}
public string? get_title() {
diff --git a/src/video-support/VideoMetadata.vala b/src/video-support/VideoMetadata.vala
index 02580f80..f6d20b88 100644
--- a/src/video-support/VideoMetadata.vala
+++ b/src/video-support/VideoMetadata.vala
@@ -17,23 +17,23 @@ public class VideoMetadata : MediaMetadata {
}
public override void read_from_file(File file) throws Error {
- QuickTimeMetadataLoader quicktime = new QuickTimeMetadataLoader(file);
- if (quicktime.is_supported()) {
- timestamp = quicktime.get_creation_date_time();
- title = quicktime.get_title();
- // TODO: is there an quicktime.get_comment ??
- comment = null;
- return;
- }
- AVIMetadataLoader avi = new AVIMetadataLoader(file);
- if (avi.is_supported()) {
- timestamp = avi.get_creation_date_time();
- title = avi.get_title();
- comment = null;
- return;
- }
-
- throw new IOError.NOT_SUPPORTED("File %s is not a supported video format", file.get_path());
+ var reader = VideoMetadataReader.get_instance();
+
+ var context = new MainContext();
+ context.push_thread_default();
+ var loop = new MainLoop(context, false);
+ AsyncResult result = null;
+
+ reader.read_metadata.begin(file.get_uri(), (obj, res) => {
+ result = res;
+ loop.quit();
+ });
+ loop.run();
+ var values = reader.read_metadata.end(result);
+ context.pop_thread_default();
+ timestamp = new MetadataDateTime((time_t) ulong.parse(values[0]));
+ title = values[1];
+ comment = values[2];
}
public override MetadataDateTime? get_creation_date_time() {
diff --git a/src/video-support/VideoMetadataInterface.vala b/src/video-support/VideoMetadataInterface.vala
index 7d25a2a8..1d8ba628 100644
--- a/src/video-support/VideoMetadataInterface.vala
+++ b/src/video-support/VideoMetadataInterface.vala
@@ -1,4 +1,5 @@
[DBus (name = "org.gnome.Shotwell.VideoMetadata1")]
public interface VideoMetadataReaderInterface : Object {
public abstract async uint64 get_duration(string uri) throws Error;
+ public abstract async string[] read_metadata(string uri) throws Error;
}
diff --git a/src/video-support/VideoMetadataReaderProcess.vala
b/src/video-support/VideoMetadataReaderProcess.vala
index 59ec2223..1373c759 100644
--- a/src/video-support/VideoMetadataReaderProcess.vala
+++ b/src/video-support/VideoMetadataReaderProcess.vala
@@ -2,10 +2,11 @@ using Gst;
using Gst.PbUtils;
static string address;
+static string uri;
static MainLoop loop;
const OptionEntry[] options = {
- { "address", 'a', 0, OptionArg.STRING, ref address, "Address of private bus", "ADDRESS" },
+ { "address", 'a', 0, OptionArg.STRING, ref address, "ADDRESS of private bus", "ADDRESS" },
{ null }
};
@@ -62,6 +63,38 @@ internal class MetadataReader : GLib.Object {
return info.get_duration();
}
+ public async string[] read_metadata(string uri) throws Error {
+ string[] return_values = { null, null, null, null };
+ var file = File.new_for_uri(uri);
+ var path = file.get_path();
+
+ if (path != null) {
+ uri = Filename.to_uri(path);
+ }
+
+ var quicktime = new QuickTimeMetadataLoader(File.new_for_uri(uri));
+ if (quicktime.is_supported()) {
+ return_values[0] = quicktime.get_creation_date_time().to_string();
+ return_values[1] = quicktime.get_title();
+ Idle.add(() => { read_metadata.callback(); return false; });
+ yield;
+ return return_values;
+ }
+
+ var avi = new AVIMetadataLoader(File.new_for_uri(uri));
+ if (avi.is_supported()) {
+ return_values[0] = avi.get_creation_date_time().to_string();
+ return_values[1] = avi.get_title();
+ Idle.add(() => { read_metadata.callback(); return false; });
+ yield;
+ return return_values;
+ }
+
+ Idle.add(() => { read_metadata.callback(); return false; });
+ yield;
+ throw new IOError.NOT_SUPPORTED("File %s is not a supported video format", file.get_path());
+ }
+
private void setup_reader() throws Error {
discoverer = new Gst.PbUtils.Discoverer (Gst.SECOND * 5);
discoverer.start();
@@ -99,11 +132,17 @@ int main(string[] args) {
try {
option_context.parse (ref args);
- var observer = new DBusAuthObserver();
- observer.authorize_authenticated_peer.connect(on_authorize_peer);
- var connection = new DBusConnection.for_address_sync(address,
DBusConnectionFlags.AUTHENTICATION_CLIENT,
- observer, null);
- connection.register_object ("/org/gnome/Shotwell/VideoMetadata1", new MetadataReader());
+ if (address == null && uri == null) {
+ error("Must either provide --uri or --address");
+ }
+
+ if (address != null) {
+ var observer = new DBusAuthObserver();
+ observer.authorize_authenticated_peer.connect(on_authorize_peer);
+ var connection = new DBusConnection.for_address_sync(address,
DBusConnectionFlags.AUTHENTICATION_CLIENT,
+ observer, null);
+ connection.register_object ("/org/gnome/Shotwell/VideoMetadata1", new MetadataReader());
+ }
loop = new MainLoop(null, false);
loop.run();
diff --git a/src/video-support/VideoReader.vala b/src/video-support/VideoReader.vala
index 75cb90a0..677ede21 100644
--- a/src/video-support/VideoReader.vala
+++ b/src/video-support/VideoReader.vala
@@ -13,17 +13,36 @@ public errordomain VideoError {
}
internal class VideoMetadataReader : ExternalProxy<VideoMetadataReaderInterface>,
VideoMetadataReaderInterface {
- public VideoMetadataReader() throws Error {
+ private static VideoMetadataReader instance;
+
+ public static VideoMetadataReader get_instance() {
+ if (instance == null) {
+ try {
+ instance = new VideoMetadataReader();
+ } catch (Error error) {
+ critical ("Failed to create VideoMetadataReader: %s", error.message);
+ }
+ }
+
+ return instance;
+ }
+
+ protected VideoMetadataReader() throws Error {
Object(dbus_path : "/org/gnome/Shotwell/VideoMetadata1", remote_helper_path :
AppDirs.get_metadata_helper().get_path());
init();
}
public async uint64 get_duration(string uri) throws Error {
- print("Getting the duration of %s: \n", uri);
var r = yield get_remote();
return yield r.get_duration(uri);
}
+
+ public async string[] read_metadata(string uri) throws Error {
+ var r = yield get_remote();
+
+ return yield r.read_metadata(uri);
+ }
}
public class VideoReader {
@@ -43,8 +62,6 @@ public class VideoReader {
this.file = file;
}
- private static VideoMetadataReader reader;
-
public static bool is_supported_video_file(File file) {
var mime_type = ContentType.guess(file.get_basename(), new uchar[0], null);
// special case: deep-check content-type of files ending with .ogg
@@ -196,14 +213,7 @@ public class VideoReader {
throw new VideoError.FILE("video file '%s' does not exist or is inaccessible".printf(
file.get_path()));
- if (VideoReader.reader == null) {
- try {
- VideoReader.reader = new VideoMetadataReader();
- } catch (Error error) {
- critical("Failed to create Videometadataeader: %s", error.message);
- }
- }
-
+ var reader = VideoMetadataReader.get_instance();
try {
var context = new MainContext();
context.push_thread_default();
diff --git a/src/video-support/meson.build b/src/video-support/meson.build
index da3f9d73..93079e47 100644
--- a/src/video-support/meson.build
+++ b/src/video-support/meson.build
@@ -1,7 +1,12 @@
executable(
'shotwell-video-metadata-handler',
[
- 'VideoMetadataReaderProcess.vala'
+ 'VideoMetadataReaderProcess.vala',
+ 'QuicktimeMetdataLoader.vala',
+ 'AVIMetadataLoader.vala',
+ 'AVIChunk.vala',
+ 'QuickTimeAtom.vala',
+ 'util.vala'
],
dependencies : [
gio,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]