summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Georg <mail@jensge.org>2015-05-07 20:37:55 +0200
committerJens Georg <mail@jensge.org>2018-11-07 22:20:38 +0100
commit4c917960ab2d482b20c61e5a4007cb3a256503a2 (patch)
tree1fa66c822d610f87ca447b4e5113cf610ee5e915
parent5234b48eb0765b7ed3e7836213747fbb3b0ee2b5 (diff)
downloadrygel-4c917960ab2d482b20c61e5a4007cb3a256503a2.tar.gz
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
-rw-r--r--configure.ac4
-rw-r--r--src/media-engines/gstreamer/Makefile.am1
-rw-r--r--src/media-engines/gstreamer/rygel-audio-transcoder.vala3
-rw-r--r--src/media-engines/gstreamer/rygel-gst-media-engine.vala1
-rw-r--r--src/media-engines/gstreamer/rygel-gst-transcoder.vala5
-rw-r--r--src/media-engines/gstreamer/rygel-jpeg-transcoder.vala84
-rw-r--r--src/media-engines/gstreamer/rygel-video-transcoder.vala5
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