[rygel] engine-gst: Implement JPEG transcoder



commit 4c917960ab2d482b20c61e5a4007cb3a256503a2
Author: Jens Georg <mail jensge org>
Date:   Thu May 7 20:37:55 2015 +0200

    engine-gst: Implement JPEG transcoder
    
    Bump GStreamer requirement to 1.12 which is known to have
    https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/issues/284
    fixed
    
    Fixes #7

 configure.ac                                       |  4 +-
 src/media-engines/gstreamer/Makefile.am            |  1 +
 .../gstreamer/rygel-audio-transcoder.vala          |  3 +-
 .../gstreamer/rygel-gst-media-engine.vala          |  1 +
 .../gstreamer/rygel-gst-transcoder.vala            |  5 +-
 .../gstreamer/rygel-jpeg-transcoder.vala           | 84 ++++++++++++++++++++++
 .../gstreamer/rygel-video-transcoder.vala          |  5 +-
 7 files changed, 96 insertions(+), 7 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index fe712a94..95caac6c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -41,8 +41,8 @@ GSSDP_REQUIRED=0.14.15
 GUPNP_REQUIRED=0.20.14
 GUPNP_AV_REQUIRED=0.12.8
 GUPNP_DLNA_REQUIRED=0.9.4
-GSTREAMER_REQUIRED=1.0
-GSTPBU_REQUIRED=1.0
+GSTREAMER_REQUIRED=1.12
+GSTPBU_REQUIRED=1.12
 GIO_REQUIRED=2.26
 GEE_REQUIRED=0.8.0
 LIBSOUP_REQUIRED=2.44.0
diff --git a/src/media-engines/gstreamer/Makefile.am b/src/media-engines/gstreamer/Makefile.am
index cec57422..466bc22f 100644
--- a/src/media-engines/gstreamer/Makefile.am
+++ b/src/media-engines/gstreamer/Makefile.am
@@ -16,6 +16,7 @@ librygel_media_engine_gst_la_SOURCES = \
        rygel-mp2ts-transcoder.vala \
        rygel-mp3-transcoder.vala \
        rygel-video-transcoder.vala \
+       rygel-jpeg-transcoder.vala \
        rygel-wmv-transcoder.vala
 
 librygel_media_engine_gst_la_VALAFLAGS = \
diff --git a/src/media-engines/gstreamer/rygel-audio-transcoder.vala 
b/src/media-engines/gstreamer/rygel-audio-transcoder.vala
index ddf6b85e..6e2f1cdc 100644
--- a/src/media-engines/gstreamer/rygel-audio-transcoder.vala
+++ b/src/media-engines/gstreamer/rygel-audio-transcoder.vala
@@ -86,7 +86,8 @@ internal abstract class Rygel.AudioTranscoder : Rygel.GstTranscoder {
         return distance;
     }
 
-    protected override EncodingProfile get_encoding_profile () {
+    protected override EncodingProfile get_encoding_profile
+                                        (MediaFileItem item) {
         var enc_audio_profile = new EncodingAudioProfile (audio_codec_format,
                                                           this.preset,
                                                           null,
diff --git a/src/media-engines/gstreamer/rygel-gst-media-engine.vala 
b/src/media-engines/gstreamer/rygel-gst-media-engine.vala
index 38017693..bb50f912 100644
--- a/src/media-engines/gstreamer/rygel-gst-media-engine.vala
+++ b/src/media-engines/gstreamer/rygel-gst-media-engine.vala
@@ -71,6 +71,7 @@ public class Rygel.GstMediaEngine : Rygel.MediaEngine {
         } catch (Error err) {}
 
         if (transcoding) {
+            this.transcoders.prepend (new JPEGTranscoder ());
             foreach (var transcoder in transcoder_list) {
                 switch (transcoder) {
                     case "lpcm":
diff --git a/src/media-engines/gstreamer/rygel-gst-transcoder.vala 
b/src/media-engines/gstreamer/rygel-gst-transcoder.vala
index b15e6e11..aa98cc3f 100644
--- a/src/media-engines/gstreamer/rygel-gst-transcoder.vala
+++ b/src/media-engines/gstreamer/rygel-gst-transcoder.vala
@@ -133,7 +133,7 @@ internal abstract class Rygel.GstTranscoder : GLib.Object {
         this.encoder = GstUtils.create_element (ENCODE_BIN,
                                                 ENCODE_BIN);
 
-        encoder.profile = this.get_encoding_profile ();
+        encoder.profile = this.get_encoding_profile (item);
         if (encoder.profile == null) {
             var message = _("Could not create a transcoder configuration. Your GStreamer installation might 
be missing a plug-in");
 
@@ -168,7 +168,8 @@ internal abstract class Rygel.GstTranscoder : GLib.Object {
      *
      * @return      the Gst.EncodingProfile for this transcoder.
      */
-    protected abstract EncodingProfile get_encoding_profile ();
+    protected abstract EncodingProfile get_encoding_profile
+                                        (MediaFileItem item);
 
     private void on_decoder_pad_added (Element decodebin, Pad new_pad) {
         Gst.Pad sinkpad;
diff --git a/src/media-engines/gstreamer/rygel-jpeg-transcoder.vala 
b/src/media-engines/gstreamer/rygel-jpeg-transcoder.vala
new file mode 100644
index 00000000..80076794
--- /dev/null
+++ b/src/media-engines/gstreamer/rygel-jpeg-transcoder.vala
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation.
+ * Copyright (C) 2018 Jens Georg <mail jensge org>
+ *
+ * Author: Jens Georg <jensg openismus com>
+ *         Jens Georg <mail jensge org>
+ *
+ * This file is part of Rygel.
+ *
+ * Rygel is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Rygel 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+using Gst;
+using Gst.PbUtils;
+
+internal class Rygel.JPEGTranscoder : Rygel.GstTranscoder {
+    private const string PROFILE_TEMPLATE =
+        "image/jpeg,framerate=(fraction)1/1,width=%d,height=%d";
+
+    public JPEGTranscoder () {
+        base ("JPEG_SM",
+              "image/jpeg",
+              "JPEG_SM",
+              "jpg");
+    }
+
+    protected override EncodingProfile get_encoding_profile
+                                        (MediaFileItem file_item) {
+        var item = file_item as VisualItem;
+        var width = 640;
+        var height = 480;
+
+        if (item.width > 0 && item.height > 0) {
+            var dar = (float) item.width / (float) item.height;
+            if (dar > 4.0/3.0) {
+                height = (int) Math.lrint (640.0 / dar);
+            } else {
+                width = (int) Math.lrint (480.0 * dar);
+            }
+        }
+
+        var caps = Caps.from_string (PROFILE_TEMPLATE.printf (width, height));
+        var profile = new EncodingVideoProfile (caps, null, null, 1);
+
+        return profile;
+
+    }
+
+    public override uint get_distance (MediaFileItem item) {
+        message ("Getting distance of JPEG transcoder to %s", item.id);
+
+        if (!(item is ImageItem)) {
+            debug ("%s is not an image, skipping", item.id);
+
+            return uint.MAX;
+        }
+
+        if (item is VideoItem) {
+            debug ("%s is a VideoItem, skipping", item.id);
+
+            return uint.MAX;
+        }
+
+        if (item.dlna_profile == "JPEG_SM") {
+            debug ("%s is already JPEG_SM, skipping", item.id);
+
+            return uint.MAX;
+        }
+
+        return 1;
+    }
+}
diff --git a/src/media-engines/gstreamer/rygel-video-transcoder.vala 
b/src/media-engines/gstreamer/rygel-video-transcoder.vala
index c39ac19c..48ccfe6a 100644
--- a/src/media-engines/gstreamer/rygel-video-transcoder.vala
+++ b/src/media-engines/gstreamer/rygel-video-transcoder.vala
@@ -76,8 +76,9 @@ internal abstract class Rygel.VideoTranscoder : Rygel.AudioTranscoder {
         return distance;
     }
 
-    protected override EncodingProfile get_encoding_profile () {
-        var enc_container_profile = base.get_encoding_profile () as
+    protected override EncodingProfile get_encoding_profile
+                                        (MediaFileItem item) {
+        var enc_container_profile = base.get_encoding_profile (item) as
                                         EncodingContainerProfile;
 
         var enc_video_profile = new EncodingVideoProfile


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]