Merge lp:~phablet-team/media-hub/media-hub-desktop into lp:media-hub

Proposed by Jim Hodapp
Status: Merged
Approved by: Konrad Zapałowicz
Approved revision: 210
Merged at revision: 204
Proposed branch: lp:~phablet-team/media-hub/media-hub-desktop
Merge into: lp:media-hub
Diff against target: 1013 lines (+504/-61)
27 files modified
CMakeLists.txt (+8/-2)
debian/changelog (+6/-0)
include/core/media/player.h (+16/-0)
src/core/media/CMakeLists.txt (+42/-37)
src/core/media/backend.cpp (+43/-0)
src/core/media/client_death_observer.cpp (+18/-1)
src/core/media/codec.h (+43/-0)
src/core/media/engine.h (+1/-1)
src/core/media/gstreamer/engine.cpp (+3/-3)
src/core/media/gstreamer/engine.h (+2/-2)
src/core/media/mpris/player.h (+6/-1)
src/core/media/player_implementation.cpp (+1/-0)
src/core/media/player_skeleton.cpp (+10/-0)
src/core/media/player_skeleton.h (+2/-0)
src/core/media/player_stub.cpp (+11/-1)
src/core/media/player_stub.h (+1/-0)
src/core/media/recorder_observer.cpp (+18/-1)
src/core/media/server/server.cpp (+15/-2)
src/core/media/stub_client_death_observer.cpp (+66/-0)
src/core/media/stub_client_death_observer.h (+64/-0)
src/core/media/stub_recorder_observer.cpp (+40/-0)
src/core/media/stub_recorder_observer.h (+50/-0)
src/core/media/video/hybris_gl_sink.h (+1/-1)
src/core/media/video/platform_default_sink.cpp (+18/-2)
src/core/media/video/platform_default_sink.h (+2/-1)
tests/acceptance-tests/service.cpp (+8/-0)
tests/unit-tests/test-gstreamer-engine.cpp (+9/-6)
To merge this branch: bzr merge lp:~phablet-team/media-hub/media-hub-desktop
Reviewer Review Type Date Requested Status
Alfonso Sanchez-Beato Approve
Konrad Zapałowicz (community) Approve
Review via email: mp+302712@code.launchpad.net

Commit message

Make media-hub work on the desktop. Everything except for video playback works with this commit.

Description of the change

Make media-hub work on the desktop. Everything except for video playback works with this commit.

To post a comment you must log in.
206. By Jim Hodapp

Add simple unit test that ensures the service comes up.

Revision history for this message
Alfonso Sanchez-Beato (alfonsosanchezbeato) wrote :

We need to decide how to detect the platform, see comment below.

review: Needs Information
Revision history for this message
Konrad Zapałowicz (kzapalowicz) wrote :

LGTM except that I need an explanation if it is possible to cache get_backend_type()

review: Needs Information (code)
Revision history for this message
Jim Hodapp (jhodapp) wrote :

Thanks for the very timely reviews guys. See my replies inline.

Revision history for this message
Konrad Zapałowicz (kzapalowicz) wrote :

LGTM

review: Approve
207. By Jim Hodapp

Dynamically detect hybris backend instead of setting environment variable

208. By Jim Hodapp

Cleanup and make sure to unref the plugin instance

209. By Jim Hodapp

Move debug message for hybris backend detection

210. By Jim Hodapp

Expose the backend selection to the stub side

Revision history for this message
Alfonso Sanchez-Beato (alfonsosanchezbeato) wrote :

LGTM

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'CMakeLists.txt'
--- CMakeLists.txt 2016-07-19 21:16:56 +0000
+++ CMakeLists.txt 2016-08-15 19:28:06 +0000
@@ -20,7 +20,7 @@
20 # we define the version to be 5.0.020 # we define the version to be 5.0.0
21 if (${DISTRO_CODENAME} STREQUAL "vivid")21 if (${DISTRO_CODENAME} STREQUAL "vivid")
22 set(UBUNTU_MEDIA_HUB_VERSION_MAJOR 4)22 set(UBUNTU_MEDIA_HUB_VERSION_MAJOR 4)
23 set(UBUNTU_MEDIA_HUB_VERSION_MINOR 5)23 set(UBUNTU_MEDIA_HUB_VERSION_MINOR 6)
24 set(UBUNTU_MEDIA_HUB_VERSION_PATCH 0)24 set(UBUNTU_MEDIA_HUB_VERSION_PATCH 0)
25 else ()25 else ()
26 set(UBUNTU_MEDIA_HUB_VERSION_MAJOR 5)26 set(UBUNTU_MEDIA_HUB_VERSION_MAJOR 5)
@@ -53,7 +53,13 @@
53pkg_check_modules(GIO gio-2.0 REQUIRED)53pkg_check_modules(GIO gio-2.0 REQUIRED)
54pkg_check_modules(HYBRIS_MEDIA libmedia REQUIRED)54pkg_check_modules(HYBRIS_MEDIA libmedia REQUIRED)
5555
56add_definitions(-DMEDIA_HUB_HAVE_HYBRIS_MEDIA_COMPAT_LAYER)56include(CheckIncludeFiles)
57check_include_files("hybris/media/media_codec_layer.h" MEDIA_HUB_HAVE_HYBRIS_MEDIA_COMPAT_LAYER)
58if (DEFINED MEDIA_HUB_HAVE_HYBRIS_MEDIA_COMPAT_LAYER)
59 add_definitions(-DMEDIA_HUB_HAVE_HYBRIS_MEDIA_COMPAT_LAYER)
60else()
61 MESSAGE(STATUS "*libhybris not found*")
62endif()
5763
58#####################################################################64#####################################################################
59# Enable code coverage calculation with gcov/gcovr/lcov65# Enable code coverage calculation with gcov/gcovr/lcov
6066
=== modified file 'debian/changelog'
--- debian/changelog 2016-07-20 21:28:28 +0000
+++ debian/changelog 2016-08-15 19:28:06 +0000
@@ -1,3 +1,9 @@
1media-hub (4.6.0+16.10.20160815-0ubuntu1) yakkety; urgency=medium
2
3 * Make media-hub work on the desktop with Unity7/Unity8 sessions.
4
5 -- Jim Hodapp <jim.hodapp@canonical.com> Fri, 12 Aug 2016 15:17:28 +0000
6
1media-hub (4.5.0+16.10.20160720-0ubuntu1) yakkety; urgency=medium7media-hub (4.5.0+16.10.20160720-0ubuntu1) yakkety; urgency=medium
28
3 * Emit client side signal when the dbus connection between9 * Emit client side signal when the dbus connection between
410
=== modified file 'include/core/media/player.h'
--- include/core/media/player.h 2016-06-01 00:43:04 +0000
+++ include/core/media/player.h 2016-08-15 19:28:06 +0000
@@ -39,6 +39,21 @@
39class Service;39class Service;
40class TrackList;40class TrackList;
4141
42struct AVBackend
43{
44 enum Backend
45 {
46 none,
47 hybris
48 };
49
50 /**
51 * @brief Returns the type of audio/video decoding/encoding backend being used.
52 * @return Returns the current backend type.
53 */
54 static Backend get_backend_type();
55};
56
42class Player : public std::enable_shared_from_this<Player>57class Player : public std::enable_shared_from_this<Player>
43{58{
44 public:59 public:
@@ -162,6 +177,7 @@
162 virtual const core::Property<bool>& is_video_source() const = 0;177 virtual const core::Property<bool>& is_video_source() const = 0;
163 virtual const core::Property<bool>& is_audio_source() const = 0;178 virtual const core::Property<bool>& is_audio_source() const = 0;
164 virtual const core::Property<PlaybackStatus>& playback_status() const = 0;179 virtual const core::Property<PlaybackStatus>& playback_status() const = 0;
180 virtual const core::Property<AVBackend::Backend>& backend() const = 0;
165 virtual const core::Property<LoopStatus>& loop_status() const = 0;181 virtual const core::Property<LoopStatus>& loop_status() const = 0;
166 virtual const core::Property<PlaybackRate>& playback_rate() const = 0;182 virtual const core::Property<PlaybackRate>& playback_rate() const = 0;
167 virtual const core::Property<bool>& shuffle() const = 0;183 virtual const core::Property<bool>& shuffle() const = 0;
168184
=== modified file 'src/core/media/CMakeLists.txt'
--- src/core/media/CMakeLists.txt 2016-06-15 17:49:49 +0000
+++ src/core/media/CMakeLists.txt 2016-08-15 19:28:06 +0000
@@ -17,6 +17,7 @@
17add_library(17add_library(
18 media-hub-common SHARED18 media-hub-common SHARED
1919
20 backend.cpp
20 the_session_bus.cpp21 the_session_bus.cpp
21 util/utils.cpp22 util/utils.cpp
22)23)
@@ -27,6 +28,7 @@
27 ${Boost_LIBRARIES}28 ${Boost_LIBRARIES}
28 ${DBUS_LIBRARIES}29 ${DBUS_LIBRARIES}
29 ${DBUS_CPP_LDFLAGS}30 ${DBUS_CPP_LDFLAGS}
31 ${PC_GSTREAMER_1_0_LIBRARIES}
30)32)
31set_target_properties(33set_target_properties(
32 media-hub-common34 media-hub-common
@@ -89,42 +91,44 @@
89)91)
9092
91add_library(93add_library(
92 media-hub-service94 media-hub-service
9395
94 ${MEDIA_HUB_HEADERS}96 ${MEDIA_HUB_HEADERS}
95 ${MPRIS_HEADERS}97 ${MPRIS_HEADERS}
9698
97 logger/logger.cpp99 logger/logger.cpp
98100
99 client_death_observer.cpp101 client_death_observer.cpp
100 hashed_keyed_player_store.cpp102 hashed_keyed_player_store.cpp
101 hybris_client_death_observer.cpp103 hybris_client_death_observer.cpp
102 cover_art_resolver.cpp104 stub_client_death_observer.cpp
103 engine.cpp105 cover_art_resolver.cpp
104 metadata.cpp106 engine.cpp
105107 metadata.cpp
106 apparmor/context.cpp108
107 apparmor/ubuntu.cpp109 apparmor/context.cpp
108110 apparmor/ubuntu.cpp
109 audio/pulse_audio_output_observer.cpp111
110 audio/ostream_reporter.cpp112 audio/pulse_audio_output_observer.cpp
111 audio/output_observer.cpp113 audio/ostream_reporter.cpp
112114 audio/output_observer.cpp
113 power/battery_observer.cpp115
114 power/state_controller.cpp116 power/battery_observer.cpp
115117 power/state_controller.cpp
116 recorder_observer.cpp118
117 hybris_recorder_observer.cpp119 recorder_observer.cpp
118120 hybris_recorder_observer.cpp
119 gstreamer/engine.cpp121 stub_recorder_observer.cpp
120 gstreamer/playbin.cpp122
121123 gstreamer/engine.cpp
122 player_skeleton.cpp124 gstreamer/playbin.cpp
123 player_implementation.cpp125
124 service_skeleton.cpp126 player_skeleton.cpp
125 service_implementation.cpp127 player_implementation.cpp
126 track_list_skeleton.cpp128 service_skeleton.cpp
127 track_list_implementation.cpp129 service_implementation.cpp
130 track_list_skeleton.cpp
131 track_list_implementation.cpp
128)132)
129133
130target_link_libraries(134target_link_libraries(
@@ -146,11 +150,12 @@
146 ${PC_PULSE_AUDIO_LIBRARIES}150 ${PC_PULSE_AUDIO_LIBRARIES}
147)151)
148152
149include_directories(${PROJECT_SOURCE_DIR}/src/ ${HYBRIS_MEDIA_CFLAGS})153include_directories(${PROJECT_SOURCE_DIR}/src/ ${HYBRIS_MEDIA_CFLAGS} ${PC_GSTREAMER_1_0_INCLUDE_DIRS})
150154
151add_executable(155add_executable(
152 media-hub-server156 media-hub-server
153157
158 backend.cpp
154 server/server.cpp159 server/server.cpp
155)160)
156161
157162
=== added file 'src/core/media/backend.cpp'
--- src/core/media/backend.cpp 1970-01-01 00:00:00 +0000
+++ src/core/media/backend.cpp 2016-08-15 19:28:06 +0000
@@ -0,0 +1,43 @@
1/*
2 * Copyright (C) 2016 Canonical Ltd
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 * Authored by: Jim Hodapp <jim.hodapp@canonical.com>
17 */
18
19#include <core/media/player.h>
20#include "core/media/logger/logger.h"
21
22#include <gst/gst.h>
23
24namespace media = core::ubuntu::media;
25
26media::AVBackend::Backend media::AVBackend::get_backend_type()
27{
28 GstRegistry *registry;
29 GstPlugin *plugin;
30
31 registry = gst_registry_get();
32 if (not registry)
33 return media::AVBackend::Backend::none;
34
35 plugin = gst_registry_lookup(registry, "libgstandroidmedia.so");
36 if (plugin)
37 {
38 gst_object_unref(plugin);
39 return media::AVBackend::Backend::hybris;
40 }
41
42 return media::AVBackend::Backend::none;
43}
044
=== modified file 'src/core/media/client_death_observer.cpp'
--- src/core/media/client_death_observer.cpp 2014-11-26 09:18:33 +0000
+++ src/core/media/client_death_observer.cpp 2016-08-15 19:28:06 +0000
@@ -16,7 +16,11 @@
16 * Authored by: Thomas Voß <thomas.voss@canonical.com>16 * Authored by: Thomas Voß <thomas.voss@canonical.com>
17 */17 */
1818
19#include "core/media/logger/logger.h"
20
19#include <core/media/client_death_observer.h>21#include <core/media/client_death_observer.h>
22#include <core/media/hybris_client_death_observer.h>
23#include <core/media/stub_client_death_observer.h>
2024
21namespace media = core::ubuntu::media;25namespace media = core::ubuntu::media;
2226
@@ -26,7 +30,20 @@
26// Accesses the default client death observer implementation for the platform.30// Accesses the default client death observer implementation for the platform.
27media::ClientDeathObserver::Ptr media::platform_default_client_death_observer()31media::ClientDeathObserver::Ptr media::platform_default_client_death_observer()
28{32{
29 return media::HybrisClientDeathObserver::create();33 const media::AVBackend::Backend b {media::AVBackend::get_backend_type()};
34 switch (b)
35 {
36 case media::AVBackend::Backend::hybris:
37 return media::HybrisClientDeathObserver::create();
38 case media::AVBackend::Backend::none:
39 MH_WARNING(
40 "No video backend selected. Client disconnect functionality won't work."
41 );
42 return media::StubClientDeathObserver::create();
43 default:
44 MH_INFO("Invalid or no A/V backend specified, using \"hybris\" as a default.");
45 return media::HybrisClientDeathObserver::create();
46 }
30}47}
31#else // MEDIA_HUB_HAVE_HYBRIS_MEDIA_COMPAT_LAYER48#else // MEDIA_HUB_HAVE_HYBRIS_MEDIA_COMPAT_LAYER
32// Just throws a std::logic_error as we have not yet defined a default way to49// Just throws a std::logic_error as we have not yet defined a default way to
3350
=== modified file 'src/core/media/codec.h'
--- src/core/media/codec.h 2016-06-14 19:41:18 +0000
+++ src/core/media/codec.h 2016-08-15 19:28:06 +0000
@@ -192,6 +192,49 @@
192 in = static_cast<core::ubuntu::media::Player::PlaybackStatus>(out.pop_int16());192 in = static_cast<core::ubuntu::media::Player::PlaybackStatus>(out.pop_int16());
193 }193 }
194};194};
195
196namespace helper
197{
198template<>
199struct TypeMapper<core::ubuntu::media::AVBackend::Backend>
200{
201 constexpr static ArgumentType type_value()
202 {
203 return core::dbus::ArgumentType::int16;
204 }
205 constexpr static bool is_basic_type()
206 {
207 return false;
208 }
209 constexpr static bool requires_signature()
210 {
211 return false;
212 }
213
214 static std::string signature()
215 {
216 static const std::string s = TypeMapper<std::int16_t>::signature();
217 return s;
218 }
219};
220}
221
222template<>
223struct Codec<core::ubuntu::media::AVBackend::Backend>
224{
225 static void encode_argument(core::dbus::Message::Writer& out,
226 const core::ubuntu::media::AVBackend::Backend& in)
227 {
228 out.push_int16(static_cast<std::int16_t>(in));
229 }
230
231 static void decode_argument(core::dbus::Message::Reader& out,
232 core::ubuntu::media::AVBackend::Backend& in)
233 {
234 in = static_cast<core::ubuntu::media::AVBackend::Backend>(out.pop_int16());
235 }
236};
237
195namespace helper238namespace helper
196{239{
197template<>240template<>
198241
=== modified file 'src/core/media/engine.h'
--- src/core/media/engine.h 2016-07-11 01:21:38 +0000
+++ src/core/media/engine.h 2016-08-15 19:28:06 +0000
@@ -82,7 +82,7 @@
82 // support this feature.82 // support this feature.
83 virtual void create_video_sink(uint32_t texture_id) = 0;83 virtual void create_video_sink(uint32_t texture_id) = 0;
8484
85 virtual bool play() = 0;85 virtual bool play(bool use_main_context = false) = 0;
86 virtual bool stop(bool use_main_context = false) = 0;86 virtual bool stop(bool use_main_context = false) = 0;
87 virtual bool pause() = 0;87 virtual bool pause() = 0;
88 virtual bool seek_to(const std::chrono::microseconds& ts) = 0;88 virtual bool seek_to(const std::chrono::microseconds& ts) = 0;
8989
=== modified file 'src/core/media/gstreamer/engine.cpp'
--- src/core/media/gstreamer/engine.cpp 2016-07-11 01:21:38 +0000
+++ src/core/media/gstreamer/engine.cpp 2016-08-15 19:28:06 +0000
@@ -445,9 +445,9 @@
445 d->playbin.create_video_sink(texture_id);445 d->playbin.create_video_sink(texture_id);
446}446}
447447
448bool gstreamer::Engine::play()448bool gstreamer::Engine::play(bool use_main_thread /* = false */)
449{449{
450 const auto result = d->playbin.set_state_and_wait(GST_STATE_PLAYING);450 const auto result = d->playbin.set_state_and_wait(GST_STATE_PLAYING, use_main_thread);
451451
452 if (result)452 if (result)
453 {453 {
@@ -459,7 +459,7 @@
459 return result;459 return result;
460}460}
461461
462bool gstreamer::Engine::stop(bool use_main_thread)462bool gstreamer::Engine::stop(bool use_main_thread /* = false */)
463{463{
464 // No need to wait, and we can immediately return.464 // No need to wait, and we can immediately return.
465 if (d->state == media::Engine::State::stopped)465 if (d->state == media::Engine::State::stopped)
466466
=== modified file 'src/core/media/gstreamer/engine.h'
--- src/core/media/gstreamer/engine.h 2016-07-11 01:21:38 +0000
+++ src/core/media/gstreamer/engine.h 2016-08-15 19:28:06 +0000
@@ -37,8 +37,8 @@
37 bool open_resource_for_uri(const core::ubuntu::media::Track::UriType& uri, const core::ubuntu::media::Player::HeadersType& headers);37 bool open_resource_for_uri(const core::ubuntu::media::Track::UriType& uri, const core::ubuntu::media::Player::HeadersType& headers);
38 void create_video_sink(uint32_t texture_id);38 void create_video_sink(uint32_t texture_id);
3939
40 bool play();40 // use_main_thread will set the pipeline's new state in the main thread context
41 // use_main_thread will set the pipeline's new_state in the main thread context41 bool play(bool use_main_thread = false);
42 bool stop(bool use_main_thread = false);42 bool stop(bool use_main_thread = false);
43 bool pause();43 bool pause();
44 bool seek_to(const std::chrono::microseconds& ts);44 bool seek_to(const std::chrono::microseconds& ts);
4545
=== modified file 'src/core/media/mpris/player.h'
--- src/core/media/mpris/player.h 2016-06-16 02:34:40 +0000
+++ src/core/media/mpris/player.h 2016-08-15 19:28:06 +0000
@@ -166,7 +166,7 @@
166 {166 {
167 DBUS_CPP_READABLE_PROPERTY_DEF(PlaybackStatus, Player, std::string)167 DBUS_CPP_READABLE_PROPERTY_DEF(PlaybackStatus, Player, std::string)
168 DBUS_CPP_READABLE_PROPERTY_DEF(TypedPlaybackStatus, Player, core::ubuntu::media::Player::PlaybackStatus)168 DBUS_CPP_READABLE_PROPERTY_DEF(TypedPlaybackStatus, Player, core::ubuntu::media::Player::PlaybackStatus)
169169 DBUS_CPP_WRITABLE_PROPERTY_DEF(TypedBackend, Player, core::ubuntu::media::AVBackend::Backend)
170 DBUS_CPP_WRITABLE_PROPERTY_DEF(LoopStatus, Player, std::string)170 DBUS_CPP_WRITABLE_PROPERTY_DEF(LoopStatus, Player, std::string)
171 DBUS_CPP_WRITABLE_PROPERTY_DEF(TypedLoopStatus, Player, core::ubuntu::media::Player::LoopStatus)171 DBUS_CPP_WRITABLE_PROPERTY_DEF(TypedLoopStatus, Player, core::ubuntu::media::Player::LoopStatus)
172 DBUS_CPP_WRITABLE_PROPERTY_DEF(AudioStreamRole, Player, core::ubuntu::media::Player::AudioStreamRole)172 DBUS_CPP_WRITABLE_PROPERTY_DEF(AudioStreamRole, Player, core::ubuntu::media::Player::AudioStreamRole)
@@ -220,6 +220,7 @@
220 Properties::IsAudioSource::ValueType is_audio_source{true};220 Properties::IsAudioSource::ValueType is_audio_source{true};
221 Properties::PlaybackStatus::ValueType playback_status{PlaybackStatus::stopped};221 Properties::PlaybackStatus::ValueType playback_status{PlaybackStatus::stopped};
222 Properties::TypedPlaybackStatus::ValueType typed_playback_status{core::ubuntu::media::Player::PlaybackStatus::null};222 Properties::TypedPlaybackStatus::ValueType typed_playback_status{core::ubuntu::media::Player::PlaybackStatus::null};
223 Properties::TypedBackend::ValueType typed_backend{core::ubuntu::media::AVBackend::Backend::none};
223 Properties::LoopStatus::ValueType loop_status{LoopStatus::none};224 Properties::LoopStatus::ValueType loop_status{LoopStatus::none};
224 Properties::TypedLoopStatus::ValueType typed_loop_status{core::ubuntu::media::Player::LoopStatus::none};225 Properties::TypedLoopStatus::ValueType typed_loop_status{core::ubuntu::media::Player::LoopStatus::none};
225 Properties::PlaybackRate::ValueType playback_rate{1.f};226 Properties::PlaybackRate::ValueType playback_rate{1.f};
@@ -248,6 +249,7 @@
248 configuration.object->template get_property<Properties::IsAudioSource>(),249 configuration.object->template get_property<Properties::IsAudioSource>(),
249 configuration.object->template get_property<Properties::PlaybackStatus>(),250 configuration.object->template get_property<Properties::PlaybackStatus>(),
250 configuration.object->template get_property<Properties::TypedPlaybackStatus>(),251 configuration.object->template get_property<Properties::TypedPlaybackStatus>(),
252 configuration.object->template get_property<Properties::TypedBackend>(),
251 configuration.object->template get_property<Properties::LoopStatus>(),253 configuration.object->template get_property<Properties::LoopStatus>(),
252 configuration.object->template get_property<Properties::TypedLoopStatus>(),254 configuration.object->template get_property<Properties::TypedLoopStatus>(),
253 configuration.object->template get_property<Properties::AudioStreamRole>(),255 configuration.object->template get_property<Properties::AudioStreamRole>(),
@@ -284,6 +286,7 @@
284 properties.is_audio_source->set(configuration.defaults.is_audio_source);286 properties.is_audio_source->set(configuration.defaults.is_audio_source);
285 properties.playback_status->set(configuration.defaults.playback_status);287 properties.playback_status->set(configuration.defaults.playback_status);
286 properties.typed_playback_status->set(configuration.defaults.typed_playback_status);288 properties.typed_playback_status->set(configuration.defaults.typed_playback_status);
289 properties.typed_backend->set(configuration.defaults.typed_backend);
287 properties.loop_status->set(configuration.defaults.loop_status);290 properties.loop_status->set(configuration.defaults.loop_status);
288 properties.typed_loop_status->set(configuration.defaults.typed_loop_status);291 properties.typed_loop_status->set(configuration.defaults.typed_loop_status);
289 properties.audio_stream_role->set(core::ubuntu::media::Player::AudioStreamRole::multimedia);292 properties.audio_stream_role->set(core::ubuntu::media::Player::AudioStreamRole::multimedia);
@@ -371,6 +374,7 @@
371 dict[Properties::CanGoPrevious::name()] = dbus::types::Variant::encode(properties.can_go_previous->get());374 dict[Properties::CanGoPrevious::name()] = dbus::types::Variant::encode(properties.can_go_previous->get());
372 dict[Properties::PlaybackStatus::name()] = dbus::types::Variant::encode(properties.playback_status->get());375 dict[Properties::PlaybackStatus::name()] = dbus::types::Variant::encode(properties.playback_status->get());
373 dict[Properties::TypedPlaybackStatus::name()] = dbus::types::Variant::encode(properties.typed_playback_status->get());376 dict[Properties::TypedPlaybackStatus::name()] = dbus::types::Variant::encode(properties.typed_playback_status->get());
377 dict[Properties::TypedBackend::name()] = dbus::types::Variant::encode(properties.typed_backend->get());
374 dict[Properties::LoopStatus::name()] = dbus::types::Variant::encode(properties.loop_status->get());378 dict[Properties::LoopStatus::name()] = dbus::types::Variant::encode(properties.loop_status->get());
375 dict[Properties::TypedLoopStatus::name()] = dbus::types::Variant::encode(properties.typed_loop_status->get());379 dict[Properties::TypedLoopStatus::name()] = dbus::types::Variant::encode(properties.typed_loop_status->get());
376 dict[Properties::AudioStreamRole::name()] = dbus::types::Variant::encode(properties.audio_stream_role->get());380 dict[Properties::AudioStreamRole::name()] = dbus::types::Variant::encode(properties.audio_stream_role->get());
@@ -403,6 +407,7 @@
403407
404 std::shared_ptr<core::dbus::Property<Properties::PlaybackStatus>> playback_status;408 std::shared_ptr<core::dbus::Property<Properties::PlaybackStatus>> playback_status;
405 std::shared_ptr<core::dbus::Property<Properties::TypedPlaybackStatus>> typed_playback_status;409 std::shared_ptr<core::dbus::Property<Properties::TypedPlaybackStatus>> typed_playback_status;
410 std::shared_ptr<core::dbus::Property<Properties::TypedBackend>> typed_backend;
406 std::shared_ptr<core::dbus::Property<Properties::LoopStatus>> loop_status;411 std::shared_ptr<core::dbus::Property<Properties::LoopStatus>> loop_status;
407 std::shared_ptr<core::dbus::Property<Properties::TypedLoopStatus>> typed_loop_status;412 std::shared_ptr<core::dbus::Property<Properties::TypedLoopStatus>> typed_loop_status;
408 std::shared_ptr<core::dbus::Property<Properties::AudioStreamRole>> audio_stream_role;413 std::shared_ptr<core::dbus::Property<Properties::AudioStreamRole>> audio_stream_role;
409414
=== modified file 'src/core/media/player_implementation.cpp'
--- src/core/media/player_implementation.cpp 2016-07-11 01:21:38 +0000
+++ src/core/media/player_implementation.cpp 2016-08-15 19:28:06 +0000
@@ -505,6 +505,7 @@
505 Parent::shuffle().set(false);505 Parent::shuffle().set(false);
506 Parent::playback_rate().set(1.f);506 Parent::playback_rate().set(1.f);
507 Parent::playback_status().set(Player::PlaybackStatus::null);507 Parent::playback_status().set(Player::PlaybackStatus::null);
508 Parent::backend().set(media::AVBackend::get_backend_type());
508 Parent::loop_status().set(Player::LoopStatus::none);509 Parent::loop_status().set(Player::LoopStatus::none);
509 Parent::position().set(0);510 Parent::position().set(0);
510 Parent::duration().set(0);511 Parent::duration().set(0);
511512
=== modified file 'src/core/media/player_skeleton.cpp'
--- src/core/media/player_skeleton.cpp 2016-06-16 02:34:40 +0000
+++ src/core/media/player_skeleton.cpp 2016-08-15 19:28:06 +0000
@@ -471,6 +471,11 @@
471 return *d->skeleton.properties.typed_playback_status;471 return *d->skeleton.properties.typed_playback_status;
472}472}
473473
474const core::Property<media::AVBackend::Backend>& media::PlayerSkeleton::backend() const
475{
476 return *d->skeleton.properties.typed_backend;
477}
478
474const core::Property<media::Player::LoopStatus>& media::PlayerSkeleton::loop_status() const479const core::Property<media::Player::LoopStatus>& media::PlayerSkeleton::loop_status() const
475{480{
476 return *d->skeleton.properties.typed_loop_status;481 return *d->skeleton.properties.typed_loop_status;
@@ -581,6 +586,11 @@
581 return *d->skeleton.properties.typed_playback_status;586 return *d->skeleton.properties.typed_playback_status;
582}587}
583588
589core::Property<media::AVBackend::Backend>& media::PlayerSkeleton::backend()
590{
591 return *d->skeleton.properties.typed_backend;
592}
593
584core::Property<bool>& media::PlayerSkeleton::can_play()594core::Property<bool>& media::PlayerSkeleton::can_play()
585{595{
586 return *d->skeleton.properties.can_play;596 return *d->skeleton.properties.can_play;
587597
=== modified file 'src/core/media/player_skeleton.h'
--- src/core/media/player_skeleton.h 2016-06-01 00:43:04 +0000
+++ src/core/media/player_skeleton.h 2016-08-15 19:28:06 +0000
@@ -75,6 +75,7 @@
75 virtual const core::Property<bool>& is_video_source() const;75 virtual const core::Property<bool>& is_video_source() const;
76 virtual const core::Property<bool>& is_audio_source() const;76 virtual const core::Property<bool>& is_audio_source() const;
77 virtual const core::Property<PlaybackStatus>& playback_status() const;77 virtual const core::Property<PlaybackStatus>& playback_status() const;
78 virtual const core::Property<AVBackend::Backend>& backend() const;
78 virtual const core::Property<LoopStatus>& loop_status() const;79 virtual const core::Property<LoopStatus>& loop_status() const;
79 virtual const core::Property<PlaybackRate>& playback_rate() const;80 virtual const core::Property<PlaybackRate>& playback_rate() const;
80 virtual const core::Property<bool>& shuffle() const;81 virtual const core::Property<bool>& shuffle() const;
@@ -105,6 +106,7 @@
105 // These properties are not exposed to the client, but still need to be106 // These properties are not exposed to the client, but still need to be
106 // able to be settable from within the Player:107 // able to be settable from within the Player:
107 virtual core::Property<PlaybackStatus>& playback_status();108 virtual core::Property<PlaybackStatus>& playback_status();
109 virtual core::Property<AVBackend::Backend>& backend();
108 virtual core::Property<bool>& can_play();110 virtual core::Property<bool>& can_play();
109 virtual core::Property<bool>& can_pause();111 virtual core::Property<bool>& can_pause();
110 virtual core::Property<bool>& can_seek();112 virtual core::Property<bool>& can_seek();
111113
=== modified file 'src/core/media/player_stub.cpp'
--- src/core/media/player_stub.cpp 2016-07-19 21:22:18 +0000
+++ src/core/media/player_stub.cpp 2016-08-15 19:28:06 +0000
@@ -54,7 +54,6 @@
54 object(object),54 object(object),
55 key(object->invoke_method_synchronously<mpris::Player::Key, media::Player::PlayerKey>().value()),55 key(object->invoke_method_synchronously<mpris::Player::Key, media::Player::PlayerKey>().value()),
56 uuid(uuid),56 uuid(uuid),
57 sink_factory(media::video::make_platform_default_sink_factory(key)),
58 properties57 properties
59 {58 {
60 // Link the properties from the server side to the client side over the bus59 // Link the properties from the server side to the client side over the bus
@@ -67,6 +66,7 @@
67 object->get_property<mpris::Player::Properties::IsVideoSource>(),66 object->get_property<mpris::Player::Properties::IsVideoSource>(),
68 object->get_property<mpris::Player::Properties::IsAudioSource>(),67 object->get_property<mpris::Player::Properties::IsAudioSource>(),
69 object->get_property<mpris::Player::Properties::TypedPlaybackStatus>(),68 object->get_property<mpris::Player::Properties::TypedPlaybackStatus>(),
69 object->get_property<mpris::Player::Properties::TypedBackend>(),
70 object->get_property<mpris::Player::Properties::TypedLoopStatus>(),70 object->get_property<mpris::Player::Properties::TypedLoopStatus>(),
71 object->get_property<mpris::Player::Properties::PlaybackRate>(),71 object->get_property<mpris::Player::Properties::PlaybackRate>(),
72 object->get_property<mpris::Player::Properties::Shuffle>(),72 object->get_property<mpris::Player::Properties::Shuffle>(),
@@ -91,6 +91,8 @@
91 object->get_signal<mpris::Player::Signals::Error>()91 object->get_signal<mpris::Player::Signals::Error>()
92 }92 }
93 {93 {
94 sink_factory = media::video::make_platform_default_sink_factory(key,
95 properties.backend->get());
94 }96 }
9597
96 ~Private()98 ~Private()
@@ -116,6 +118,7 @@
116 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsAudioSource>> is_audio_source;118 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsAudioSource>> is_audio_source;
117119
118 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::TypedPlaybackStatus>> playback_status;120 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::TypedPlaybackStatus>> playback_status;
121 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::TypedBackend>> backend;
119 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::TypedLoopStatus>> loop_status;122 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::TypedLoopStatus>> loop_status;
120 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::PlaybackRate>> playback_rate;123 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::PlaybackRate>> playback_rate;
121 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Shuffle>> shuffle;124 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Shuffle>> shuffle;
@@ -237,10 +240,12 @@
237 const std::string& uuid)240 const std::string& uuid)
238 : d(new Private{parent, service, object, uuid})241 : d(new Private{parent, service, object, uuid})
239{242{
243 MH_TRACE("");
240}244}
241245
242media::PlayerStub::~PlayerStub()246media::PlayerStub::~PlayerStub()
243{247{
248 MH_TRACE("");
244}249}
245250
246std::string media::PlayerStub::uuid() const251std::string media::PlayerStub::uuid() const
@@ -412,6 +417,11 @@
412 return *d->properties.playback_status;417 return *d->properties.playback_status;
413}418}
414419
420const core::Property<media::AVBackend::Backend>& media::PlayerStub::backend() const
421{
422 return *d->properties.backend;
423}
424
415const core::Property<media::Player::LoopStatus>& media::PlayerStub::loop_status() const425const core::Property<media::Player::LoopStatus>& media::PlayerStub::loop_status() const
416{426{
417 return *d->properties.loop_status;427 return *d->properties.loop_status;
418428
=== modified file 'src/core/media/player_stub.h'
--- src/core/media/player_stub.h 2016-06-01 00:43:04 +0000
+++ src/core/media/player_stub.h 2016-08-15 19:28:06 +0000
@@ -71,6 +71,7 @@
71 virtual const core::Property<bool>& is_video_source() const;71 virtual const core::Property<bool>& is_video_source() const;
72 virtual const core::Property<bool>& is_audio_source() const;72 virtual const core::Property<bool>& is_audio_source() const;
73 virtual const core::Property<PlaybackStatus>& playback_status() const;73 virtual const core::Property<PlaybackStatus>& playback_status() const;
74 virtual const core::Property<AVBackend::Backend>& backend() const;
74 virtual const core::Property<LoopStatus>& loop_status() const;75 virtual const core::Property<LoopStatus>& loop_status() const;
75 virtual const core::Property<PlaybackRate>& playback_rate() const;76 virtual const core::Property<PlaybackRate>& playback_rate() const;
76 virtual const core::Property<bool>& shuffle() const;77 virtual const core::Property<bool>& shuffle() const;
7778
=== modified file 'src/core/media/recorder_observer.cpp'
--- src/core/media/recorder_observer.cpp 2014-11-26 09:36:44 +0000
+++ src/core/media/recorder_observer.cpp 2016-08-15 19:28:06 +0000
@@ -16,13 +16,30 @@
16 * Authored by: Thomas Voß <thomas.voss@canonical.com>16 * Authored by: Thomas Voß <thomas.voss@canonical.com>
17 */17 */
1818
19#include "core/media/logger/logger.h"
20
21#include <core/media/player.h>
19#include <core/media/recorder_observer.h>22#include <core/media/recorder_observer.h>
2023
21#include <core/media/hybris_recorder_observer.h>24#include <core/media/hybris_recorder_observer.h>
25#include <core/media/stub_recorder_observer.h>
2226
23namespace media = core::ubuntu::media;27namespace media = core::ubuntu::media;
2428
25media::RecorderObserver::Ptr media::make_platform_default_recorder_observer()29media::RecorderObserver::Ptr media::make_platform_default_recorder_observer()
26{30{
27 return media::HybrisRecorderObserver::create();31 const media::AVBackend::Backend b {media::AVBackend::get_backend_type()};
32 switch (b)
33 {
34 case media::AVBackend::Backend::hybris:
35 return media::HybrisRecorderObserver::create();
36 case media::AVBackend::Backend::none:
37 MH_WARNING(
38 "No video backend selected. Video recording functionality won't work."
39 );
40 return media::StubRecorderObserver::create();
41 default:
42 MH_INFO("Invalid or no A/V backend specified, using \"hybris\" as a default.");
43 return media::HybrisRecorderObserver::create();
44 }
28}45}
2946
=== modified file 'src/core/media/server/server.cpp'
--- src/core/media/server/server.cpp 2016-04-05 19:34:22 +0000
+++ src/core/media/server/server.cpp 2016-08-15 19:28:06 +0000
@@ -58,7 +58,7 @@
58 severity = media::Logger::Severity::kFatal;58 severity = media::Logger::Severity::kFatal;
59 else59 else
60 std::cerr << "Invalid log level \"" << level60 std::cerr << "Invalid log level \"" << level
61 << "\", setting to info. Valid options: [trace, debug, info, warning, error, fatal]. "61 << "\", setting to info. Valid options: [trace, debug, info, warning, error, fatal]."
62 << std::endl;62 << std::endl;
63 }63 }
64 else64 else
@@ -71,7 +71,20 @@
71// All platform-specific initialization routines go here.71// All platform-specific initialization routines go here.
72void platform_init()72void platform_init()
73{73{
74 decoding_service_init();74 const media::AVBackend::Backend b {media::AVBackend::get_backend_type()};
75 switch (b)
76 {
77 case media::AVBackend::Backend::hybris:
78 MH_DEBUG("Found hybris backend");
79 decoding_service_init();
80 break;
81 case media::AVBackend::Backend::none:
82 MH_WARNING("No video backend selected. Video functionality won't work.");
83 break;
84 default:
85 MH_INFO("Invalid or no A/V backend specified, using \"hybris\" as a default.");
86 decoding_service_init();
87 }
75}88}
76}89}
77#else // MEDIA_HUB_HAVE_HYBRIS_MEDIA_COMPAT_LAYER90#else // MEDIA_HUB_HAVE_HYBRIS_MEDIA_COMPAT_LAYER
7891
=== added file 'src/core/media/stub_client_death_observer.cpp'
--- src/core/media/stub_client_death_observer.cpp 1970-01-01 00:00:00 +0000
+++ src/core/media/stub_client_death_observer.cpp 2016-08-15 19:28:06 +0000
@@ -0,0 +1,66 @@
1/*
2 * Copyright © 2016 Canonical Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU Lesser General Public License version 3,
6 * as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authored by: Jim Hodapp <jim.hodapp@canonical.com>
17 */
18
19#include <core/media/stub_client_death_observer.h>
20
21namespace media = core::ubuntu::media;
22
23namespace
24{
25typedef std::pair<media::Player::PlayerKey, std::weak_ptr<media::StubClientDeathObserver>> Holder;
26}
27
28void media::StubClientDeathObserver::on_client_died_cb(void* context)
29{
30 auto holder = static_cast<Holder*>(context);
31
32 if (not holder)
33 return;
34
35 // We check if we are still alive or if we already got killed.
36 if (auto sp = holder->second.lock())
37 {
38 sp->client_with_key_died(holder->first);
39 }
40
41 // And with that, we have reached end of life for our holder object.
42 delete holder;
43}
44
45// Creates an instance of the StubClientDeathObserver.
46media::ClientDeathObserver::Ptr media::StubClientDeathObserver::create()
47{
48 return media::ClientDeathObserver::Ptr{new media::StubClientDeathObserver{}};
49}
50
51media::StubClientDeathObserver::StubClientDeathObserver()
52{
53}
54
55media::StubClientDeathObserver::~StubClientDeathObserver()
56{
57}
58
59void media::StubClientDeathObserver::register_for_death_notifications_with_key(const media::Player::PlayerKey&)
60{
61}
62
63const core::Signal<media::Player::PlayerKey>& media::StubClientDeathObserver::on_client_with_key_died() const
64{
65 return client_with_key_died;
66}
067
=== added file 'src/core/media/stub_client_death_observer.h'
--- src/core/media/stub_client_death_observer.h 1970-01-01 00:00:00 +0000
+++ src/core/media/stub_client_death_observer.h 2016-08-15 19:28:06 +0000
@@ -0,0 +1,64 @@
1/*
2 * Copyright © 2016 Canonical Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU Lesser General Public License version 3,
6 * as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authored by: Jim Hodapp <jim.hodapp@canonical.com>
17 */
18
19#ifndef CORE_UBUNTU_MEDIA_STUB_CLIENT_DEATH_OBSERVER_H_
20#define CORE_UBUNTU_MEDIA_STUB_CLIENT_DEATH_OBSERVER_H_
21
22#include <core/media/client_death_observer.h>
23
24namespace core
25{
26namespace ubuntu
27{
28namespace media
29{
30// Models functionality to be notified whenever a client
31// of the service goes away, and thus allows us to clean
32// up in that case.
33// Generic empty implementation.
34class StubClientDeathObserver : public ClientDeathObserver,
35 public std::enable_shared_from_this<StubClientDeathObserver>
36{
37public:
38 // Our static callback that we inject to the hybris world.
39 static void on_client_died_cb(void* context);
40
41 // Creates an instance of the StubClientDeathObserver or throws
42 // if the underlying platform does not support it.
43 static ClientDeathObserver::Ptr create();
44
45 // Make std::unique_ptr happy for forward declared Private internals.
46 ~StubClientDeathObserver();
47
48 // Registers the client with the given key for death notifications.
49 void register_for_death_notifications_with_key(const Player::PlayerKey&) override;
50
51 // Emitted whenever a client dies, reporting the key under which the
52 // respective client was known.
53 const core::Signal<Player::PlayerKey>& on_client_with_key_died() const override;
54
55private:
56 StubClientDeathObserver();
57
58 core::Signal<media::Player::PlayerKey> client_with_key_died;
59};
60}
61}
62}
63
64#endif // CORE_UBUNTU_MEDIA_STUB_CLIENT_DEATH_OBSERVER_H_
065
=== added file 'src/core/media/stub_recorder_observer.cpp'
--- src/core/media/stub_recorder_observer.cpp 1970-01-01 00:00:00 +0000
+++ src/core/media/stub_recorder_observer.cpp 2016-08-15 19:28:06 +0000
@@ -0,0 +1,40 @@
1/*
2 * Copyright © 2016 Canonical Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU Lesser General Public License version 3,
6 * as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authored by: Jim Hodapp <jim.hodapp@canonical.com>
17 */
18
19#include <core/media/stub_recorder_observer.h>
20
21namespace media = core::ubuntu::media;
22
23media::StubRecorderObserver::StubRecorderObserver()
24 : current_recording_state(media::RecordingState::stopped)
25{
26}
27
28media::StubRecorderObserver::~StubRecorderObserver()
29{
30}
31
32const core::Property<media::RecordingState>& media::StubRecorderObserver::recording_state() const
33{
34 return current_recording_state;
35}
36
37media::RecorderObserver::Ptr media::StubRecorderObserver::create()
38{
39 return media::RecorderObserver::Ptr{new media::StubRecorderObserver{}};
40}
041
=== added file 'src/core/media/stub_recorder_observer.h'
--- src/core/media/stub_recorder_observer.h 1970-01-01 00:00:00 +0000
+++ src/core/media/stub_recorder_observer.h 2016-08-15 19:28:06 +0000
@@ -0,0 +1,50 @@
1/*
2 * Copyright © 2016 Canonical Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU Lesser General Public License version 3,
6 * as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authored by: Jim Hodapp <jim.hodapp@canonical.com>
17 */
18
19#ifndef CORE_UBUNTU_MEDIA_STUB_RECORDER_OBSERVER_H_
20#define CORE_UBUNTU_MEDIA_STUB_RECORDER_OBSERVER_H_
21
22#include <core/media/recorder_observer.h>
23
24namespace core
25{
26namespace ubuntu
27{
28namespace media
29{
30class StubRecorderObserver : public RecorderObserver
31{
32public:
33 // Creates a new instance of the StubRecorderObserver
34 static RecorderObserver::Ptr create();
35
36 ~StubRecorderObserver();
37
38 // Getable/observable property describing the recording state of the system.
39 const core::Property<RecordingState>& recording_state() const override;
40
41private:
42 StubRecorderObserver();
43
44 core::Property<media::RecordingState> current_recording_state;
45};
46}
47}
48}
49
50#endif // CORE_UBUNTU_MEDIA_STUB_RECORDER_OBSERVER_H_
051
=== modified file 'src/core/media/video/hybris_gl_sink.h'
--- src/core/media/video/hybris_gl_sink.h 2015-01-29 12:12:43 +0000
+++ src/core/media/video/hybris_gl_sink.h 2016-08-15 19:28:06 +0000
@@ -34,7 +34,7 @@
34{34{
35class HybrisGlSink : public video::Sink35class HybrisGlSink : public video::Sink
36{36{
37public: 37public:
38 // Returns a factory functor that allows for creating actual sink instances.38 // Returns a factory functor that allows for creating actual sink instances.
39 static std::function<video::Sink::Ptr(std::uint32_t)> factory_for_key(const media::Player::PlayerKey&);39 static std::function<video::Sink::Ptr(std::uint32_t)> factory_for_key(const media::Player::PlayerKey&);
4040
4141
=== modified file 'src/core/media/video/platform_default_sink.cpp'
--- src/core/media/video/platform_default_sink.cpp 2016-04-05 14:40:47 +0000
+++ src/core/media/video/platform_default_sink.cpp 2016-08-15 19:28:06 +0000
@@ -16,6 +16,8 @@
16 * Authored by: Thomas Voß <thomas.voss@canonical.com>16 * Authored by: Thomas Voß <thomas.voss@canonical.com>
17 */17 */
1818
19#include "core/media/logger/logger.h"
20
19#include <core/media/video/platform_default_sink.h>21#include <core/media/video/platform_default_sink.h>
2022
21namespace media = core::ubuntu::media;23namespace media = core::ubuntu::media;
@@ -56,9 +58,23 @@
56#if defined(MEDIA_HUB_HAVE_HYBRIS_MEDIA_COMPAT_LAYER)58#if defined(MEDIA_HUB_HAVE_HYBRIS_MEDIA_COMPAT_LAYER)
57#include <core/media/video/hybris_gl_sink.h>59#include <core/media/video/hybris_gl_sink.h>
5860
59video::SinkFactory video::make_platform_default_sink_factory(const media::Player::PlayerKey& key)61video::SinkFactory video::make_platform_default_sink_factory(const media::Player::PlayerKey& key,
62 const media::AVBackend::Backend b)
60{63{
61 return video::HybrisGlSink::factory_for_key(key);64 switch (b)
65 {
66 case media::AVBackend::Backend::hybris:
67 MH_DEBUG("Using hybris video sink");
68 return video::HybrisGlSink::factory_for_key(key);
69 case media::AVBackend::Backend::none:
70 MH_WARNING(
71 "No video backend selected. Video rendering functionality won't work."
72 );
73 return [](std::uint32_t) { return video::Sink::Ptr{}; };
74 default:
75 MH_INFO("Invalid or no A/V backend specified, using \"hybris\" as a default.");
76 return video::HybrisGlSink::factory_for_key(key);
77 }
62}78}
63#else // MEDIA_HUB_HAVE_HYBRIS_MEDIA_COMPAT_LAYER79#else // MEDIA_HUB_HAVE_HYBRIS_MEDIA_COMPAT_LAYER
64video::SinkFactory video::make_platform_default_sink_factory(const media::Player::PlayerKey&)80video::SinkFactory video::make_platform_default_sink_factory(const media::Player::PlayerKey&)
6581
=== modified file 'src/core/media/video/platform_default_sink.h'
--- src/core/media/video/platform_default_sink.h 2015-01-29 12:12:43 +0000
+++ src/core/media/video/platform_default_sink.h 2016-08-15 19:28:06 +0000
@@ -35,7 +35,8 @@
35// A functor that allows for creating actual sinks given a texture id.35// A functor that allows for creating actual sinks given a texture id.
36typedef std::function<Sink::Ptr(std::uint32_t)> SinkFactory;36typedef std::function<Sink::Ptr(std::uint32_t)> SinkFactory;
37// Returns the platform default sink factory for the player instance identified by the given key.37// Returns the platform default sink factory for the player instance identified by the given key.
38SinkFactory make_platform_default_sink_factory(const Player::PlayerKey& key);38SinkFactory make_platform_default_sink_factory(const Player::PlayerKey& key,
39 const AVBackend::Backend b);
39}40}
40}41}
41}42}
4243
=== modified file 'tests/acceptance-tests/service.cpp'
--- tests/acceptance-tests/service.cpp 2015-11-02 21:14:29 +0000
+++ tests/acceptance-tests/service.cpp 2016-08-15 19:28:06 +0000
@@ -68,6 +68,14 @@
68}68}
69}69}
7070
71TEST(MediaService, service_is_running)
72{
73 auto service = media::Service::Client::instance();
74 auto session = service->create_session(media::Player::Client::default_configuration());
75 EXPECT_TRUE(service != nullptr);
76 EXPECT_TRUE(session != nullptr);
77}
78
71TEST(MediaService, move_track_in_tracklist_works)79TEST(MediaService, move_track_in_tracklist_works)
72{80{
73 auto service = media::Service::Client::instance();81 auto service = media::Service::Client::instance();
7482
=== modified file 'tests/unit-tests/test-gstreamer-engine.cpp'
--- tests/unit-tests/test-gstreamer-engine.cpp 2016-06-30 23:23:50 +0000
+++ tests/unit-tests/test-gstreamer-engine.cpp 2016-08-15 19:28:06 +0000
@@ -103,9 +103,10 @@
103 std::ref(wst),103 std::ref(wst),
104 std::placeholders::_1));104 std::placeholders::_1));
105105
106 static const bool do_pipeline_reset = true;106 static const bool do_pipeline_reset = false;
107 EXPECT_TRUE(engine.open_resource_for_uri(test_file_uri, do_pipeline_reset));107 EXPECT_TRUE(engine.open_resource_for_uri(test_file_uri, do_pipeline_reset));
108 EXPECT_TRUE(engine.play());108 static const bool use_main_context = true;
109 EXPECT_TRUE(engine.play(use_main_context));
109 EXPECT_TRUE(wst.wait_for_state_for(110 EXPECT_TRUE(wst.wait_for_state_for(
110 core::ubuntu::media::Engine::State::playing,111 core::ubuntu::media::Engine::State::playing,
111 std::chrono::seconds{4}));112 std::chrono::seconds{4}));
@@ -145,15 +146,16 @@
145 std::ref(wst),146 std::ref(wst),
146 std::placeholders::_1));147 std::placeholders::_1));
147148
148 static const bool do_pipeline_reset = true;149 static const bool do_pipeline_reset = false;
149 EXPECT_TRUE(engine.open_resource_for_uri(test_file_uri, do_pipeline_reset));150 EXPECT_TRUE(engine.open_resource_for_uri(test_file_uri, do_pipeline_reset));
150 EXPECT_TRUE(engine.play());151 static const bool use_main_context = true;
152 EXPECT_TRUE(engine.play(use_main_context));
151 EXPECT_TRUE(wst.wait_for_state_for(153 EXPECT_TRUE(wst.wait_for_state_for(
152 core::ubuntu::media::Engine::State::playing,154 core::ubuntu::media::Engine::State::playing,
153 std::chrono::milliseconds{4000}));155 std::chrono::milliseconds{4000}));
154156
155 EXPECT_TRUE(wst.wait_for_state_for(157 EXPECT_TRUE(wst.wait_for_state_for(
156 core::ubuntu::media::Engine::State::ready,158 core::ubuntu::media::Engine::State::stopped,
157 std::chrono::seconds{10}));159 std::chrono::seconds{10}));
158}160}
159161
@@ -207,7 +209,8 @@
207 std::placeholders::_1));209 std::placeholders::_1));
208210
209 EXPECT_TRUE(engine.open_resource_for_uri(test_audio_uri, headers));211 EXPECT_TRUE(engine.open_resource_for_uri(test_audio_uri, headers));
210 EXPECT_TRUE(engine.play());212 static const bool use_main_context = true;
213 EXPECT_TRUE(engine.play(use_main_context));
211 EXPECT_TRUE(wst.wait_for_state_for(214 EXPECT_TRUE(wst.wait_for_state_for(
212 core::ubuntu::media::Engine::State::playing,215 core::ubuntu::media::Engine::State::playing,
213 std::chrono::seconds{10}));216 std::chrono::seconds{10}));

Subscribers

People subscribed via source and target branches

to all changes: