diff options
author | Jens Georg <mail@jensge.org> | 2015-05-07 20:37:55 +0200 |
---|---|---|
committer | Jens Georg <mail@jensge.org> | 2018-11-07 22:20:38 +0100 |
commit | 4c917960ab2d482b20c61e5a4007cb3a256503a2 (patch) | |
tree | 1fa66c822d610f87ca447b4e5113cf610ee5e915 | |
parent | 5234b48eb0765b7ed3e7836213747fbb3b0ee2b5 (diff) | |
download | rygel-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.ac | 4 | ||||
-rw-r--r-- | src/media-engines/gstreamer/Makefile.am | 1 | ||||
-rw-r--r-- | src/media-engines/gstreamer/rygel-audio-transcoder.vala | 3 | ||||
-rw-r--r-- | src/media-engines/gstreamer/rygel-gst-media-engine.vala | 1 | ||||
-rw-r--r-- | src/media-engines/gstreamer/rygel-gst-transcoder.vala | 5 | ||||
-rw-r--r-- | src/media-engines/gstreamer/rygel-jpeg-transcoder.vala | 84 | ||||
-rw-r--r-- | src/media-engines/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 |