summaryrefslogtreecommitdiff
path: root/thumbnailer
diff options
context:
space:
mode:
authorJörg Frings-Fürst <debian@jff.email>2022-10-01 21:55:21 +0200
committerJörg Frings-Fürst <debian@jff.email>2022-10-01 21:55:21 +0200
commit0ac74d65f16aa7eb70669b07c25cb90114eb9435 (patch)
tree31cd86e358bc70e6d83955fdcc0d8e05fc32c325 /thumbnailer
parent0b99aa7b114b6c8eb0d55742c4be2f3a73f44e39 (diff)
parentf542481df58f3222143bc260feb34b5cf537d8e0 (diff)
Merge branch 'feature/upstream' into develop
Diffstat (limited to 'thumbnailer')
-rw-r--r--thumbnailer/meson.build2
-rw-r--r--thumbnailer/shotwell-video-thumbnailer.vala34
2 files changed, 31 insertions, 5 deletions
diff --git a/thumbnailer/meson.build b/thumbnailer/meson.build
index 29acb1f..f1b0ad4 100644
--- a/thumbnailer/meson.build
+++ b/thumbnailer/meson.build
@@ -1,5 +1,5 @@
executable('shotwell-video-thumbnailer',
'shotwell-video-thumbnailer.vala',
- dependencies : [posix, gstreamer, gee, gdk_pixbuf],
+ dependencies : [posix, gstreamer, gee, gdk_pixbuf, gio],
install : true,
install_dir : join_paths(get_option('libexecdir'), 'shotwell'))
diff --git a/thumbnailer/shotwell-video-thumbnailer.vala b/thumbnailer/shotwell-video-thumbnailer.vala
index ac14d7d..db5a096 100644
--- a/thumbnailer/shotwell-video-thumbnailer.vala
+++ b/thumbnailer/shotwell-video-thumbnailer.vala
@@ -13,7 +13,7 @@ class ShotwellThumbnailer {
const string caps_string = """video/x-raw,format=RGB,pixel-aspect-ratio=1/1""";
public static int main(string[] args) {
- Gst.Element pipeline, sink;
+ dynamic Gst.Element pipeline, sink;
string descr;
Gdk.Pixbuf pixbuf;
uint8[]? pngdata;
@@ -41,15 +41,14 @@ class ShotwellThumbnailer {
return 1;
}
- descr = "filesrc location=\"%s\" ! decodebin ! videoconvert ! videoscale ! ".printf(args[1]) +
- "%s ! gdkpixbufsink name=sink".printf(caps_string);
+ descr = "playbin uri=\"%s\" audio-sink=fakesink video-sink=\"gdkpixbufsink name=sink\"".printf(File.new_for_commandline_arg(args[1]).get_uri());
try {
// Create new pipeline.
pipeline = Gst.parse_launch(descr);
// Get sink.
- sink = ((Gst.Bin) pipeline).get_by_name("sink");
+ sink = pipeline.video_sink;
// Set to PAUSED to make the first frame arrive in the sink.
ret = pipeline.set_state(Gst.State.PAUSED);
@@ -92,7 +91,34 @@ class ShotwellThumbnailer {
sink.get ("last-pixbuf", out pixbuf);
+ Gst.TagList tags;
+ Signal.emit_by_name(pipeline, "get-video-tags", 0, out tags);
+ var direction = Gdk.PixbufRotation.NONE;
+ if (tags != null) {
+ string orientation = null;
+ if (tags.get_string_index (Gst.Tags.IMAGE_ORIENTATION, 0, out orientation)) {
+ if (orientation != null) {
+ switch (orientation) {
+ case "rotate-90":
+ direction = Gdk.PixbufRotation.CLOCKWISE;
+ break;
+ case "rotate-180":
+ direction = Gdk.PixbufRotation.UPSIDEDOWN;
+ break;
+ case "rotate-270":
+ direction = Gdk.PixbufRotation.COUNTERCLOCKWISE;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+
// Save the pixbuf.
+ if (direction != Gdk.PixbufRotation.NONE) {
+ pixbuf = pixbuf.rotate_simple(direction);
+ }
pixbuf.save_to_buffer(out pngdata, "png");
stdout.write(pngdata);