Merge lp:~jhodapp/media-hub/orientation into lp:media-hub

Proposed by Jim Hodapp
Status: Approved
Approved by: Ricardo Salveti
Approved revision: 71
Proposed branch: lp:~jhodapp/media-hub/orientation
Merge into: lp:media-hub
Diff against target: 882 lines (+290/-22)
14 files modified
include/core/media/player.h (+14/-0)
src/core/media/codec.h (+40/-0)
src/core/media/engine.h (+3/-0)
src/core/media/gstreamer/bus.h (+1/-1)
src/core/media/gstreamer/engine.cpp (+41/-1)
src/core/media/gstreamer/engine.h (+3/-0)
src/core/media/gstreamer/meta_data_extractor.h (+1/-1)
src/core/media/gstreamer/playbin.h (+79/-5)
src/core/media/mpris/player.h (+17/-2)
src/core/media/player_implementation.cpp (+17/-1)
src/core/media/player_skeleton.cpp (+35/-7)
src/core/media/player_skeleton.h (+6/-0)
src/core/media/player_stub.cpp (+30/-4)
src/core/media/player_stub.h (+3/-0)
To merge this branch: bzr merge lp:~jhodapp/media-hub/orientation
Reviewer Review Type Date Requested Status
Ricardo Salveti (community) Approve
PS Jenkins bot continuous-integration Approve
Review via email: mp+238355@code.launchpad.net

Commit message

* Add an Orientation property which will indicate how the video should be rotated for playback vs how it was recorded.
* Get the video frame height/width from mirsink and pass it to the media-hub client via a Signal.

Description of the change

* Add an Orientation property which will indicate how the video should be rotated for playback vs how it was recorded.
* Get the video frame height/width from mirsink and pass it to the media-hub client via a Signal.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
lp:~jhodapp/media-hub/orientation updated
71. By Jim Hodapp

Merged with trunk

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Ricardo Salveti (rsalveti) wrote :

LGTM

review: Approve
lp:~jhodapp/media-hub/orientation updated
72. By Jim Hodapp

Only get the video dimensions and signal the client of the dimensions changing when playing a video.

Unmerged revisions

72. By Jim Hodapp

Only get the video dimensions and signal the client of the dimensions changing when playing a video.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'include/core/media/player.h'
--- include/core/media/player.h 2014-09-08 10:16:38 +0000
+++ include/core/media/player.h 2014-10-22 16:15:30 +0000
@@ -86,6 +86,14 @@
86 phone86 phone
87 };87 };
8888
89 enum Orientation
90 {
91 rotate0,
92 rotate90,
93 rotate180,
94 rotate270
95 };
96
89 Player(const Player&) = delete;97 Player(const Player&) = delete;
90 virtual ~Player();98 virtual ~Player();
9199
@@ -127,6 +135,7 @@
127 virtual const core::Property<int64_t>& position() const = 0;135 virtual const core::Property<int64_t>& position() const = 0;
128 virtual const core::Property<int64_t>& duration() const = 0;136 virtual const core::Property<int64_t>& duration() const = 0;
129 virtual const core::Property<AudioStreamRole>& audio_stream_role() const = 0;137 virtual const core::Property<AudioStreamRole>& audio_stream_role() const = 0;
138 virtual const core::Property<Orientation>& orientation() const = 0;
130139
131 virtual core::Property<LoopStatus>& loop_status() = 0;140 virtual core::Property<LoopStatus>& loop_status() = 0;
132 virtual core::Property<PlaybackRate>& playback_rate() = 0;141 virtual core::Property<PlaybackRate>& playback_rate() = 0;
@@ -137,6 +146,11 @@
137 virtual const core::Signal<int64_t>& seeked_to() const = 0;146 virtual const core::Signal<int64_t>& seeked_to() const = 0;
138 virtual const core::Signal<void>& end_of_stream() const = 0;147 virtual const core::Signal<void>& end_of_stream() const = 0;
139 virtual core::Signal<PlaybackStatus>& playback_status_changed() = 0;148 virtual core::Signal<PlaybackStatus>& playback_status_changed() = 0;
149 /**
150 * Called when the video height/width change. Passes height and width as a bitmask with
151 * height in the upper 32 bits and width in the lower 32 bits (both unsigned values)
152 */
153 virtual const core::Signal<uint64_t>& video_dimension_changed() const = 0;
140 protected:154 protected:
141 Player();155 Player();
142156
143157
=== modified file 'src/core/media/codec.h'
--- src/core/media/codec.h 2014-08-29 14:03:42 +0000
+++ src/core/media/codec.h 2014-10-22 16:15:30 +0000
@@ -190,6 +190,46 @@
190 }190 }
191};191};
192192
193namespace helper
194{
195template<>
196struct TypeMapper<core::ubuntu::media::Player::Orientation>
197{
198 constexpr static ArgumentType type_value()
199 {
200 return core::dbus::ArgumentType::int16;
201 }
202 constexpr static bool is_basic_type()
203 {
204 return false;
205 }
206 constexpr static bool requires_signature()
207 {
208 return false;
209 }
210
211 static std::string signature()
212 {
213 static const std::string s = TypeMapper<std::int16_t>::signature();
214 return s;
215 }
216};
217}
218
219template<>
220struct Codec<core::ubuntu::media::Player::Orientation>
221{
222 static void encode_argument(core::dbus::Message::Writer& out, const core::ubuntu::media::Player::Orientation& in)
223 {
224 out.push_int16(static_cast<std::int16_t>(in));
225 }
226
227 static void decode_argument(core::dbus::Message::Reader& out, core::ubuntu::media::Player::Orientation& in)
228 {
229 in = static_cast<core::ubuntu::media::Player::Orientation>(out.pop_int16());
230 }
231};
232
193}233}
194}234}
195235
196236
=== modified file 'src/core/media/engine.h'
--- src/core/media/engine.h 2014-09-08 10:16:38 +0000
+++ src/core/media/engine.h 2014-10-22 16:15:30 +0000
@@ -95,6 +95,8 @@
95 virtual const core::Property<core::ubuntu::media::Player::AudioStreamRole>& audio_stream_role() const = 0;95 virtual const core::Property<core::ubuntu::media::Player::AudioStreamRole>& audio_stream_role() const = 0;
96 virtual core::Property<core::ubuntu::media::Player::AudioStreamRole>& audio_stream_role() = 0;96 virtual core::Property<core::ubuntu::media::Player::AudioStreamRole>& audio_stream_role() = 0;
9797
98 virtual const core::Property<core::ubuntu::media::Player::Orientation>& orientation() const = 0;
99
98 virtual const core::Property<std::tuple<Track::UriType, Track::MetaData>>& track_meta_data() const = 0;100 virtual const core::Property<std::tuple<Track::UriType, Track::MetaData>>& track_meta_data() const = 0;
99101
100 virtual const core::Signal<void>& about_to_finish_signal() const = 0;102 virtual const core::Signal<void>& about_to_finish_signal() const = 0;
@@ -102,6 +104,7 @@
102 virtual const core::Signal<void>& client_disconnected_signal() const = 0;104 virtual const core::Signal<void>& client_disconnected_signal() const = 0;
103 virtual const core::Signal<void>& end_of_stream_signal() const = 0;105 virtual const core::Signal<void>& end_of_stream_signal() const = 0;
104 virtual const core::Signal<core::ubuntu::media::Player::PlaybackStatus>& playback_status_changed_signal() const = 0;106 virtual const core::Signal<core::ubuntu::media::Player::PlaybackStatus>& playback_status_changed_signal() const = 0;
107 virtual const core::Signal<uint32_t, uint32_t>& video_dimension_changed_signal() const = 0;
105};108};
106}109}
107}110}
108111
=== modified file 'src/core/media/gstreamer/bus.h'
--- src/core/media/gstreamer/bus.h 2014-07-21 23:14:55 +0000
+++ src/core/media/gstreamer/bus.h 2014-10-22 16:15:30 +0000
@@ -93,7 +93,7 @@
93 &detail.tag.tag_list);93 &detail.tag.tag_list);
94 cleanup = [this]()94 cleanup = [this]()
95 {95 {
96 gst_tag_list_free(detail.tag.tag_list);96 gst_tag_list_unref(detail.tag.tag_list);
97 };97 };
98 break;98 break;
99 case GST_MESSAGE_BUFFERING:99 case GST_MESSAGE_BUFFERING:
100100
=== modified file 'src/core/media/gstreamer/engine.cpp'
--- src/core/media/gstreamer/engine.cpp 2014-10-08 00:09:21 +0000
+++ src/core/media/gstreamer/engine.cpp 2014-10-22 16:15:30 +0000
@@ -72,6 +72,13 @@
72 playbin.set_audio_stream_role(new_audio_role);72 playbin.set_audio_stream_role(new_audio_role);
73 }73 }
7474
75 void on_orientation_changed(const media::Player::Orientation& o)
76 {
77 // Update the local orientation Property, which should then update the Player
78 // orientation Property
79 orientation.set(o);
80 }
81
75 void on_about_to_finish()82 void on_about_to_finish()
76 {83 {
77 state = Engine::State::ready;84 state = Engine::State::ready;
@@ -93,9 +100,15 @@
93 end_of_stream();100 end_of_stream();
94 }101 }
95102
103 void on_video_dimension_changed(uint32_t height, uint32_t width)
104 {
105 video_dimension_changed(height, width);
106 }
107
96 Private()108 Private()
97 : meta_data_extractor(new gstreamer::MetaDataExtractor()),109 : meta_data_extractor(new gstreamer::MetaDataExtractor()),
98 volume(media::Engine::Volume(1.)),110 volume(media::Engine::Volume(1.)),
111 orientation(media::Player::Orientation::rotate0),
99 is_video_source(false),112 is_video_source(false),
100 is_audio_source(false),113 is_audio_source(false),
101 about_to_finish_connection(114 about_to_finish_connection(
@@ -127,6 +140,12 @@
127 &Private::on_audio_stream_role_changed,140 &Private::on_audio_stream_role_changed,
128 this,141 this,
129 std::placeholders::_1))),142 std::placeholders::_1))),
143 on_orientation_changed_connection(
144 playbin.signals.on_orientation_changed.connect(
145 std::bind(
146 &Private::on_orientation_changed,
147 this,
148 std::placeholders::_1))),
130 on_seeked_to_connection(149 on_seeked_to_connection(
131 playbin.signals.on_seeked_to.connect(150 playbin.signals.on_seeked_to.connect(
132 std::bind(151 std::bind(
@@ -142,7 +161,14 @@
142 playbin.signals.on_end_of_stream.connect(161 playbin.signals.on_end_of_stream.connect(
143 std::bind(162 std::bind(
144 &Private::on_end_of_stream,163 &Private::on_end_of_stream,
145 this)))164 this))),
165 on_video_dimension_changed_connection(
166 playbin.signals.on_add_frame_dimension.connect(
167 std::bind(
168 &Private::on_video_dimension_changed,
169 this,
170 std::placeholders::_1,
171 std::placeholders::_2)))
146 {172 {
147 }173 }
148174
@@ -157,6 +183,7 @@
157 core::Property<uint64_t> duration;183 core::Property<uint64_t> duration;
158 core::Property<media::Engine::Volume> volume;184 core::Property<media::Engine::Volume> volume;
159 core::Property<media::Player::AudioStreamRole> audio_role;185 core::Property<media::Player::AudioStreamRole> audio_role;
186 core::Property<media::Player::Orientation> orientation;
160 core::Property<bool> is_video_source;187 core::Property<bool> is_video_source;
161 core::Property<bool> is_audio_source;188 core::Property<bool> is_audio_source;
162189
@@ -165,15 +192,18 @@
165 core::ScopedConnection on_tag_available_connection;192 core::ScopedConnection on_tag_available_connection;
166 core::ScopedConnection on_volume_changed_connection;193 core::ScopedConnection on_volume_changed_connection;
167 core::ScopedConnection on_audio_stream_role_changed_connection;194 core::ScopedConnection on_audio_stream_role_changed_connection;
195 core::ScopedConnection on_orientation_changed_connection;
168 core::ScopedConnection on_seeked_to_connection;196 core::ScopedConnection on_seeked_to_connection;
169 core::ScopedConnection client_disconnected_connection;197 core::ScopedConnection client_disconnected_connection;
170 core::ScopedConnection on_end_of_stream_connection;198 core::ScopedConnection on_end_of_stream_connection;
199 core::ScopedConnection on_video_dimension_changed_connection;
171200
172 core::Signal<void> about_to_finish;201 core::Signal<void> about_to_finish;
173 core::Signal<uint64_t> seeked_to;202 core::Signal<uint64_t> seeked_to;
174 core::Signal<void> client_disconnected;203 core::Signal<void> client_disconnected;
175 core::Signal<void> end_of_stream;204 core::Signal<void> end_of_stream;
176 core::Signal<media::Player::PlaybackStatus> playback_status_changed;205 core::Signal<media::Player::PlaybackStatus> playback_status_changed;
206 core::Signal<uint32_t, uint32_t> video_dimension_changed;
177};207};
178208
179gstreamer::Engine::Engine() : d(new Private{})209gstreamer::Engine::Engine() : d(new Private{})
@@ -313,6 +343,11 @@
313 return d->audio_role;343 return d->audio_role;
314}344}
315345
346const core::Property<core::ubuntu::media::Player::Orientation>& gstreamer::Engine::orientation() const
347{
348 return d->orientation;
349}
350
316const core::Property<std::tuple<media::Track::UriType, media::Track::MetaData>>&351const core::Property<std::tuple<media::Track::UriType, media::Track::MetaData>>&
317gstreamer::Engine::track_meta_data() const352gstreamer::Engine::track_meta_data() const
318{353{
@@ -343,3 +378,8 @@
343{378{
344 return d->playback_status_changed;379 return d->playback_status_changed;
345}380}
381
382const core::Signal<uint32_t, uint32_t>& gstreamer::Engine::video_dimension_changed_signal() const
383{
384 return d->video_dimension_changed;
385}
346386
=== modified file 'src/core/media/gstreamer/engine.h'
--- src/core/media/gstreamer/engine.h 2014-08-29 14:03:42 +0000
+++ src/core/media/gstreamer/engine.h 2014-10-22 16:15:30 +0000
@@ -53,6 +53,8 @@
53 const core::Property<core::ubuntu::media::Player::AudioStreamRole>& audio_stream_role() const;53 const core::Property<core::ubuntu::media::Player::AudioStreamRole>& audio_stream_role() const;
54 core::Property<core::ubuntu::media::Player::AudioStreamRole>& audio_stream_role();54 core::Property<core::ubuntu::media::Player::AudioStreamRole>& audio_stream_role();
5555
56 const core::Property<core::ubuntu::media::Player::Orientation>& orientation() const;
57
56 const core::Property<std::tuple<core::ubuntu::media::Track::UriType, core::ubuntu::media::Track::MetaData>>& track_meta_data() const;58 const core::Property<std::tuple<core::ubuntu::media::Track::UriType, core::ubuntu::media::Track::MetaData>>& track_meta_data() const;
5759
58 const core::Signal<void>& about_to_finish_signal() const;60 const core::Signal<void>& about_to_finish_signal() const;
@@ -60,6 +62,7 @@
60 const core::Signal<void>& client_disconnected_signal() const;62 const core::Signal<void>& client_disconnected_signal() const;
61 const core::Signal<void>& end_of_stream_signal() const;63 const core::Signal<void>& end_of_stream_signal() const;
62 const core::Signal<core::ubuntu::media::Player::PlaybackStatus>& playback_status_changed_signal() const;64 const core::Signal<core::ubuntu::media::Player::PlaybackStatus>& playback_status_changed_signal() const;
65 const core::Signal<uint32_t, uint32_t>& video_dimension_changed_signal() const;
6366
64private:67private:
65 struct Private;68 struct Private;
6669
=== modified file 'src/core/media/gstreamer/meta_data_extractor.h'
--- src/core/media/gstreamer/meta_data_extractor.h 2014-08-26 20:34:30 +0000
+++ src/core/media/gstreamer/meta_data_extractor.h 2014-10-22 16:15:30 +0000
@@ -216,7 +216,7 @@
216 }216 }
217217
218 gst_object_unref (sinkpad);218 gst_object_unref (sinkpad);
219 } 219 }
220220
221 GstElement* pipe;221 GstElement* pipe;
222 GstElement* decoder;222 GstElement* decoder;
223223
=== modified file 'src/core/media/gstreamer/playbin.h'
--- src/core/media/gstreamer/playbin.h 2014-10-10 16:03:24 +0000
+++ src/core/media/gstreamer/playbin.h 2014-10-22 16:15:30 +0000
@@ -31,6 +31,12 @@
31#include <chrono>31#include <chrono>
32#include <string>32#include <string>
3333
34// Uncomment to generate a dot file at the time that the pipeline
35// goes to the PLAYING state. Make sure to export GST_DEBUG_DUMP_DOT_DIR
36// before starting media-hub-server. To convert the dot file to something
37// other image format, use: dot pipeline.dot -Tpng -o pipeline.png
38//#define DEBUG_GST_PIPELINE
39
34namespace media = core::ubuntu::media;40namespace media = core::ubuntu::media;
3541
36namespace gstreamer42namespace gstreamer
@@ -68,6 +74,9 @@
68 : pipeline(gst_element_factory_make("playbin", pipeline_name().c_str())),74 : pipeline(gst_element_factory_make("playbin", pipeline_name().c_str())),
69 bus{gst_element_get_bus(pipeline)},75 bus{gst_element_get_bus(pipeline)},
70 file_type(MEDIA_FILE_TYPE_NONE),76 file_type(MEDIA_FILE_TYPE_NONE),
77 video_sink(nullptr),
78 video_height(0),
79 video_width(0),
71 on_new_message_connection(80 on_new_message_connection(
72 bus.on_new_message.connect(81 bus.on_new_message.connect(
73 std::bind(82 std::bind(
@@ -153,7 +162,17 @@
153 signals.on_info(message.detail.error_warning_info);162 signals.on_info(message.detail.error_warning_info);
154 break;163 break;
155 case GST_MESSAGE_TAG:164 case GST_MESSAGE_TAG:
156 signals.on_tag_available(message.detail.tag);165 {
166 gchar *orientation;
167 if (gst_tag_list_get_string(message.detail.tag.tag_list, "image-orientation", &orientation))
168 {
169 // If the image-orientation tag is in the GstTagList, signal the Engine
170 signals.on_orientation_changed(orientation_lut(orientation));
171 g_free (orientation);
172 }
173
174 signals.on_tag_available(message.detail.tag);
175 }
157 break;176 break;
158 case GST_MESSAGE_STATE_CHANGED:177 case GST_MESSAGE_STATE_CHANGED:
159 signals.on_state_changed(message.detail.state_changed);178 signals.on_state_changed(message.detail.state_changed);
@@ -204,9 +223,9 @@
204223
205 if (::getenv("CORE_UBUNTU_MEDIA_SERVICE_VIDEO_SINK_NAME") != nullptr)224 if (::getenv("CORE_UBUNTU_MEDIA_SERVICE_VIDEO_SINK_NAME") != nullptr)
206 {225 {
207 auto video_sink = gst_element_factory_make (226 video_sink = gst_element_factory_make (
208 ::getenv("CORE_UBUNTU_MEDIA_SERVICE_VIDEO_SINK_NAME"),227 ::getenv("CORE_UBUNTU_MEDIA_SERVICE_VIDEO_SINK_NAME"),
209 "video-sink");228 "video-sink");
210229
211 std::cout << "video_sink: " << ::getenv("CORE_UBUNTU_MEDIA_SERVICE_VIDEO_SINK_NAME") << std::endl;230 std::cout << "video_sink: " << ::getenv("CORE_UBUNTU_MEDIA_SERVICE_VIDEO_SINK_NAME") << std::endl;
212231
@@ -224,7 +243,6 @@
224243
225 if (::getenv("CORE_UBUNTU_MEDIA_SERVICE_VIDEO_SINK_NAME") != nullptr)244 if (::getenv("CORE_UBUNTU_MEDIA_SERVICE_VIDEO_SINK_NAME") != nullptr)
226 {245 {
227 GstElement *video_sink = NULL;
228 g_object_get (pipeline, "video_sink", &video_sink, NULL);246 g_object_get (pipeline, "video_sink", &video_sink, NULL);
229247
230 // Get the service-side BufferQueue (IGraphicBufferProducer) and associate it with248 // Get the service-side BufferQueue (IGraphicBufferProducer) and associate it with
@@ -265,6 +283,20 @@
265 }283 }
266 }284 }
267285
286 media::Player::Orientation orientation_lut(const gchar *orientation)
287 {
288 if (g_strcmp0(orientation, "rotate-0") == 0)
289 return media::Player::Orientation::rotate0;
290 else if (g_strcmp0(orientation, "rotate-90") == 0)
291 return media::Player::Orientation::rotate90;
292 else if (g_strcmp0(orientation, "rotate-180") == 0)
293 return media::Player::Orientation::rotate180;
294 else if (g_strcmp0(orientation, "rotate-270") == 0)
295 return media::Player::Orientation::rotate270;
296 else
297 return media::Player::Orientation::rotate0;
298 }
299
268 /** Sets the new audio stream role on the pulsesink in playbin */300 /** Sets the new audio stream role on the pulsesink in playbin */
269 void set_audio_stream_role(media::Player::AudioStreamRole new_audio_role)301 void set_audio_stream_role(media::Player::AudioStreamRole new_audio_role)
270 {302 {
@@ -350,6 +382,20 @@
350 &current,382 &current,
351 &pending,383 &pending,
352 state_change_timeout.count());384 state_change_timeout.count());
385
386 if (new_state == GST_STATE_PLAYING)
387 {
388 // Only do this for video playback
389 if (media_file_type() == MEDIA_FILE_TYPE_VIDEO)
390 {
391 // Get the video height/width from the video sink
392 get_video_dimensions();
393 }
394#ifdef DEBUG_GST_PIPELINE
395 std::cout << "Dumping pipeline dot file" << std::endl;
396 GST_DEBUG_BIN_TO_DOT_FILE((GstBin*)pipeline, GST_DEBUG_GRAPH_SHOW_ALL, "pipeline");
397#endif
398 }
353 break;399 break;
354 }400 }
355401
@@ -366,6 +412,29 @@
366 ms.count() * 1000);412 ms.count() * 1000);
367 }413 }
368414
415 void get_video_dimensions()
416 {
417 if (video_sink != nullptr && g_strcmp0(::getenv("CORE_UBUNTU_MEDIA_SERVICE_VIDEO_SINK_NAME"), "mirsink") == 0)
418 {
419 g_object_get (video_sink, "height", &video_height, nullptr);
420 g_object_get (video_sink, "width", &video_width, nullptr);
421 std::cout << "video_height: " << video_height << ", video_width: " << video_width << std::endl;
422 signals.on_add_frame_dimension(video_height, video_width);
423 }
424 else
425 std::cerr << "Could not get the height/width of each video frame" << std::endl;
426 }
427
428 int get_video_height() const
429 {
430 return video_height;
431 }
432
433 int get_video_width() const
434 {
435 return video_width;
436 }
437
369 std::string get_file_content_type(const std::string& uri) const438 std::string get_file_content_type(const std::string& uri) const
370 {439 {
371 if (uri.empty())440 if (uri.empty())
@@ -445,6 +514,9 @@
445 gstreamer::Bus bus;514 gstreamer::Bus bus;
446 MediaFileType file_type;515 MediaFileType file_type;
447 SurfaceTextureClientHybris stc_hybris;516 SurfaceTextureClientHybris stc_hybris;
517 GstElement* video_sink;
518 uint32_t video_height;
519 uint32_t video_width;
448 core::Connection on_new_message_connection;520 core::Connection on_new_message_connection;
449 bool is_seeking;521 bool is_seeking;
450 struct522 struct
@@ -458,6 +530,8 @@
458 core::Signal<uint64_t> on_seeked_to;530 core::Signal<uint64_t> on_seeked_to;
459 core::Signal<void> on_end_of_stream;531 core::Signal<void> on_end_of_stream;
460 core::Signal<media::Player::PlaybackStatus> on_playback_status_changed;532 core::Signal<media::Player::PlaybackStatus> on_playback_status_changed;
533 core::Signal<media::Player::Orientation> on_orientation_changed;
534 core::Signal<uint32_t, uint32_t> on_add_frame_dimension;
461 core::Signal<void> client_disconnected;535 core::Signal<void> client_disconnected;
462 } signals;536 } signals;
463};537};
464538
=== modified file 'src/core/media/mpris/player.h'
--- src/core/media/mpris/player.h 2014-09-10 21:05:34 +0000
+++ src/core/media/mpris/player.h 2014-10-22 16:15:30 +0000
@@ -122,6 +122,7 @@
122 DBUS_CPP_SIGNAL_DEF(Seeked, Player, std::int64_t)122 DBUS_CPP_SIGNAL_DEF(Seeked, Player, std::int64_t)
123 DBUS_CPP_SIGNAL_DEF(EndOfStream, Player, void)123 DBUS_CPP_SIGNAL_DEF(EndOfStream, Player, void)
124 DBUS_CPP_SIGNAL_DEF(PlaybackStatusChanged, Player, core::ubuntu::media::Player::PlaybackStatus)124 DBUS_CPP_SIGNAL_DEF(PlaybackStatusChanged, Player, core::ubuntu::media::Player::PlaybackStatus)
125 DBUS_CPP_SIGNAL_DEF(VideoDimensionChanged, Player, std::uint64_t)
125 };126 };
126127
127 struct Properties128 struct Properties
@@ -132,6 +133,7 @@
132 DBUS_CPP_WRITABLE_PROPERTY_DEF(LoopStatus, Player, std::string)133 DBUS_CPP_WRITABLE_PROPERTY_DEF(LoopStatus, Player, std::string)
133 DBUS_CPP_WRITABLE_PROPERTY_DEF(TypedLoopStatus, Player, core::ubuntu::media::Player::LoopStatus)134 DBUS_CPP_WRITABLE_PROPERTY_DEF(TypedLoopStatus, Player, core::ubuntu::media::Player::LoopStatus)
134 DBUS_CPP_WRITABLE_PROPERTY_DEF(AudioStreamRole, Player, core::ubuntu::media::Player::AudioStreamRole)135 DBUS_CPP_WRITABLE_PROPERTY_DEF(AudioStreamRole, Player, core::ubuntu::media::Player::AudioStreamRole)
136 DBUS_CPP_READABLE_PROPERTY_DEF(Orientation, Player, core::ubuntu::media::Player::Orientation)
135 DBUS_CPP_WRITABLE_PROPERTY_DEF(PlaybackRate, Player, double)137 DBUS_CPP_WRITABLE_PROPERTY_DEF(PlaybackRate, Player, double)
136 DBUS_CPP_WRITABLE_PROPERTY_DEF(Rate, Player, double)138 DBUS_CPP_WRITABLE_PROPERTY_DEF(Rate, Player, double)
137 DBUS_CPP_WRITABLE_PROPERTY_DEF(Shuffle, Player, bool)139 DBUS_CPP_WRITABLE_PROPERTY_DEF(Shuffle, Player, bool)
@@ -191,6 +193,7 @@
191 Properties::Duration::ValueType duration{0};193 Properties::Duration::ValueType duration{0};
192 Properties::MinimumRate::ValueType minimum_rate{1.f};194 Properties::MinimumRate::ValueType minimum_rate{1.f};
193 Properties::MaximumRate::ValueType maximum_rate{1.f};195 Properties::MaximumRate::ValueType maximum_rate{1.f};
196 Properties::Orientation::ValueType orientation{core::ubuntu::media::Player::Orientation::rotate0};
194 } defaults;197 } defaults;
195 };198 };
196199
@@ -211,6 +214,7 @@
211 configuration.object->template get_property<Properties::LoopStatus>(),214 configuration.object->template get_property<Properties::LoopStatus>(),
212 configuration.object->template get_property<Properties::TypedLoopStatus>(),215 configuration.object->template get_property<Properties::TypedLoopStatus>(),
213 configuration.object->template get_property<Properties::AudioStreamRole>(),216 configuration.object->template get_property<Properties::AudioStreamRole>(),
217 configuration.object->template get_property<Properties::Orientation>(),
214 configuration.object->template get_property<Properties::PlaybackRate>(),218 configuration.object->template get_property<Properties::PlaybackRate>(),
215 configuration.object->template get_property<Properties::Shuffle>(),219 configuration.object->template get_property<Properties::Shuffle>(),
216 configuration.object->template get_property<Properties::TypedMetaData>(),220 configuration.object->template get_property<Properties::TypedMetaData>(),
@@ -225,6 +229,7 @@
225 configuration.object->template get_signal<Signals::Seeked>(),229 configuration.object->template get_signal<Signals::Seeked>(),
226 configuration.object->template get_signal<Signals::EndOfStream>(),230 configuration.object->template get_signal<Signals::EndOfStream>(),
227 configuration.object->template get_signal<Signals::PlaybackStatusChanged>(),231 configuration.object->template get_signal<Signals::PlaybackStatusChanged>(),
232 configuration.object->template get_signal<Signals::VideoDimensionChanged>(),
228 configuration.object->template get_signal<core::dbus::interfaces::Properties::Signals::PropertiesChanged>()233 configuration.object->template get_signal<core::dbus::interfaces::Properties::Signals::PropertiesChanged>()
229 }234 }
230 {235 {
@@ -241,12 +246,19 @@
241 properties.loop_status->set(configuration.defaults.loop_status);246 properties.loop_status->set(configuration.defaults.loop_status);
242 properties.typed_loop_status->set(configuration.defaults.typed_loop_status);247 properties.typed_loop_status->set(configuration.defaults.typed_loop_status);
243 properties.audio_stream_role->set(core::ubuntu::media::Player::AudioStreamRole::multimedia);248 properties.audio_stream_role->set(core::ubuntu::media::Player::AudioStreamRole::multimedia);
249 properties.orientation->set(core::ubuntu::media::Player::Orientation::rotate0);
244 properties.playback_rate->set(configuration.defaults.playback_rate);250 properties.playback_rate->set(configuration.defaults.playback_rate);
245 properties.is_shuffle->set(configuration.defaults.shuffle);251 properties.is_shuffle->set(configuration.defaults.shuffle);
246 properties.position->set(configuration.defaults.position);252 properties.position->set(configuration.defaults.position);
247 properties.duration->set(configuration.defaults.duration);253 properties.duration->set(configuration.defaults.duration);
248 properties.minimum_playback_rate->set(configuration.defaults.minimum_rate);254 properties.minimum_playback_rate->set(configuration.defaults.minimum_rate);
249 properties.maximum_playback_rate->set(configuration.defaults.maximum_rate); 255 properties.maximum_playback_rate->set(configuration.defaults.maximum_rate);
256
257 // Make sure the Orientation Property gets sent over DBus to the client
258 properties.orientation->changed().connect([this](const core::ubuntu::media::Player::Orientation& o)
259 {
260 on_property_value_changed<Properties::Orientation>(o);
261 });
250262
251 properties.position->changed().connect([this](std::int64_t position)263 properties.position->changed().connect([this](std::int64_t position)
252 {264 {
@@ -266,7 +278,7 @@
266 properties.loop_status->changed().connect([this](const std::string& status)278 properties.loop_status->changed().connect([this](const std::string& status)
267 {279 {
268 on_property_value_changed<Properties::LoopStatus>(status);280 on_property_value_changed<Properties::LoopStatus>(status);
269 }); 281 });
270 }282 }
271283
272 template<typename Property>284 template<typename Property>
@@ -294,6 +306,7 @@
294 dict[Properties::LoopStatus::name()] = dbus::types::Variant::encode(properties.loop_status->get());306 dict[Properties::LoopStatus::name()] = dbus::types::Variant::encode(properties.loop_status->get());
295 dict[Properties::TypedLoopStatus::name()] = dbus::types::Variant::encode(properties.typed_loop_status->get());307 dict[Properties::TypedLoopStatus::name()] = dbus::types::Variant::encode(properties.typed_loop_status->get());
296 dict[Properties::AudioStreamRole::name()] = dbus::types::Variant::encode(properties.audio_stream_role->get());308 dict[Properties::AudioStreamRole::name()] = dbus::types::Variant::encode(properties.audio_stream_role->get());
309 dict[Properties::Orientation::name()] = dbus::types::Variant::encode(properties.orientation->get());
297 dict[Properties::PlaybackRate::name()] = dbus::types::Variant::encode(properties.playback_rate->get());310 dict[Properties::PlaybackRate::name()] = dbus::types::Variant::encode(properties.playback_rate->get());
298 dict[Properties::Shuffle::name()] = dbus::types::Variant::encode(properties.is_shuffle->get());311 dict[Properties::Shuffle::name()] = dbus::types::Variant::encode(properties.is_shuffle->get());
299 dict[Properties::Duration::name()] = dbus::types::Variant::encode(properties.duration->get());312 dict[Properties::Duration::name()] = dbus::types::Variant::encode(properties.duration->get());
@@ -323,6 +336,7 @@
323 std::shared_ptr<core::dbus::Property<Properties::LoopStatus>> loop_status;336 std::shared_ptr<core::dbus::Property<Properties::LoopStatus>> loop_status;
324 std::shared_ptr<core::dbus::Property<Properties::TypedLoopStatus>> typed_loop_status;337 std::shared_ptr<core::dbus::Property<Properties::TypedLoopStatus>> typed_loop_status;
325 std::shared_ptr<core::dbus::Property<Properties::AudioStreamRole>> audio_stream_role;338 std::shared_ptr<core::dbus::Property<Properties::AudioStreamRole>> audio_stream_role;
339 std::shared_ptr<core::dbus::Property<Properties::Orientation>> orientation;
326 std::shared_ptr<core::dbus::Property<Properties::PlaybackRate>> playback_rate;340 std::shared_ptr<core::dbus::Property<Properties::PlaybackRate>> playback_rate;
327 std::shared_ptr<core::dbus::Property<Properties::Shuffle>> is_shuffle;341 std::shared_ptr<core::dbus::Property<Properties::Shuffle>> is_shuffle;
328 std::shared_ptr<core::dbus::Property<Properties::TypedMetaData>> typed_meta_data_for_current_track;342 std::shared_ptr<core::dbus::Property<Properties::TypedMetaData>> typed_meta_data_for_current_track;
@@ -338,6 +352,7 @@
338 typename core::dbus::Signal<Signals::Seeked, Signals::Seeked::ArgumentType>::Ptr seeked_to;352 typename core::dbus::Signal<Signals::Seeked, Signals::Seeked::ArgumentType>::Ptr seeked_to;
339 typename core::dbus::Signal<Signals::EndOfStream, Signals::EndOfStream::ArgumentType>::Ptr end_of_stream;353 typename core::dbus::Signal<Signals::EndOfStream, Signals::EndOfStream::ArgumentType>::Ptr end_of_stream;
340 typename core::dbus::Signal<Signals::PlaybackStatusChanged, Signals::PlaybackStatusChanged::ArgumentType>::Ptr playback_status_changed;354 typename core::dbus::Signal<Signals::PlaybackStatusChanged, Signals::PlaybackStatusChanged::ArgumentType>::Ptr playback_status_changed;
355 typename core::dbus::Signal<Signals::VideoDimensionChanged, Signals::VideoDimensionChanged::ArgumentType>::Ptr video_dimension_changed;
341356
342 dbus::Signal357 dbus::Signal
343 <358 <
344359
=== modified file 'src/core/media/player_implementation.cpp'
--- src/core/media/player_implementation.cpp 2014-10-08 03:06:14 +0000
+++ src/core/media/player_implementation.cpp 2014-10-22 16:15:30 +0000
@@ -297,7 +297,7 @@
297 service,297 service,
298 key))298 key))
299{299{
300 // Initializing default values for properties300 // Initialize default values for Player interface properties
301 can_play().set(true);301 can_play().set(true);
302 can_pause().set(true);302 can_pause().set(true);
303 can_seek().set(true);303 can_seek().set(true);
@@ -313,6 +313,7 @@
313 duration().set(0);313 duration().set(0);
314 audio_stream_role().set(Player::AudioStreamRole::multimedia);314 audio_stream_role().set(Player::AudioStreamRole::multimedia);
315 d->engine->audio_stream_role().set(Player::AudioStreamRole::multimedia);315 d->engine->audio_stream_role().set(Player::AudioStreamRole::multimedia);
316 orientation().set(Player::Orientation::rotate0);
316317
317 // Make sure that the Position property gets updated from the Engine318 // Make sure that the Position property gets updated from the Engine
318 // every time the client requests position319 // every time the client requests position
@@ -349,6 +350,13 @@
349 d->engine->audio_stream_role().set(new_role);350 d->engine->audio_stream_role().set(new_role);
350 });351 });
351352
353 // When the value of the orientation Property is changed in the Engine by playbin,
354 // update the Player's cached value
355 d->engine->orientation().changed().connect([this](const Player::Orientation& o)
356 {
357 orientation().set(o);
358 });
359
352 d->engine->about_to_finish_signal().connect([this]()360 d->engine->about_to_finish_signal().connect([this]()
353 {361 {
354 if (d->track_list->has_next())362 if (d->track_list->has_next())
@@ -382,6 +390,14 @@
382 {390 {
383 playback_status_changed()(status);391 playback_status_changed()(status);
384 });392 });
393
394 d->engine->video_dimension_changed_signal().connect([this](uint32_t height, uint32_t width)
395 {
396 uint64_t mask = 0;
397 // Left most 32 bits are for height, right most 32 bits are for width
398 mask = (static_cast<uint64_t>(height) << 32) | static_cast<uint64_t>(width);
399 video_dimension_changed()(mask);
400 });
385}401}
386402
387media::PlayerImplementation::~PlayerImplementation()403media::PlayerImplementation::~PlayerImplementation()
388404
=== modified file 'src/core/media/player_skeleton.cpp'
--- src/core/media/player_skeleton.cpp 2014-10-08 00:31:41 +0000
+++ src/core/media/player_skeleton.cpp 2014-10-22 16:15:30 +0000
@@ -57,10 +57,11 @@
57 {57 {
58 skeleton.signals.seeked_to,58 skeleton.signals.seeked_to,
59 skeleton.signals.end_of_stream,59 skeleton.signals.end_of_stream,
60 skeleton.signals.playback_status_changed60 skeleton.signals.playback_status_changed,
61 skeleton.signals.video_dimension_changed
61 }62 }
62 {63 {
63 } 64 }
6465
65 void handle_next(const core::dbus::Message::Ptr& msg)66 void handle_next(const core::dbus::Message::Ptr& msg)
66 {67 {
@@ -138,7 +139,7 @@
138139
139 auto reply = dbus::Message::make_method_return(in);140 auto reply = dbus::Message::make_method_return(in);
140 bus->send(reply);141 bus->send(reply);
141 } 142 }
142143
143 bool does_client_have_access(const std::string& context, const std::string& uri)144 bool does_client_have_access(const std::string& context, const std::string& uri)
144 {145 {
@@ -224,7 +225,7 @@
224 }225 }
225226
226 void handle_open_uri(const core::dbus::Message::Ptr& in)227 void handle_open_uri(const core::dbus::Message::Ptr& in)
227 { 228 {
228 dbus_stub.get_connection_app_armor_security_async(in->sender(), [this, in](const std::string& profile)229 dbus_stub.get_connection_app_armor_security_async(in->sender(), [this, in](const std::string& profile)
229 {230 {
230 Track::UriType uri;231 Track::UriType uri;
@@ -268,17 +269,19 @@
268269
269 org::freedesktop::dbus::DBus::Stub dbus_stub;270 org::freedesktop::dbus::DBus::Stub dbus_stub;
270271
271 mpris::Player::Skeleton skeleton; 272 mpris::Player::Skeleton skeleton;
272273
273 struct Signals274 struct Signals
274 {275 {
275 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType> DBusSeekedToSignal;276 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType> DBusSeekedToSignal;
276 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType> DBusEndOfStreamSignal;277 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType> DBusEndOfStreamSignal;
277 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType> DBusPlaybackStatusChangedSignal;278 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType> DBusPlaybackStatusChangedSignal;
279 typedef core::dbus::Signal<mpris::Player::Signals::VideoDimensionChanged, mpris::Player::Signals::VideoDimensionChanged::ArgumentType> DBusVideoDimensionChangedSignal;
278280
279 Signals(const std::shared_ptr<DBusSeekedToSignal>& remote_seeked,281 Signals(const std::shared_ptr<DBusSeekedToSignal>& remote_seeked,
280 const std::shared_ptr<DBusEndOfStreamSignal>& remote_eos,282 const std::shared_ptr<DBusEndOfStreamSignal>& remote_eos,
281 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& remote_playback_status_changed)283 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& remote_playback_status_changed,
284 const std::shared_ptr<DBusVideoDimensionChangedSignal>& remote_video_dimension_changed)
282 {285 {
283 seeked_to.connect([remote_seeked](std::uint64_t value)286 seeked_to.connect([remote_seeked](std::uint64_t value)
284 {287 {
@@ -294,11 +297,17 @@
294 {297 {
295 remote_playback_status_changed->emit(status);298 remote_playback_status_changed->emit(status);
296 });299 });
300
301 video_dimension_changed.connect([remote_video_dimension_changed](uint64_t mask)
302 {
303 remote_video_dimension_changed->emit(mask);
304 });
297 }305 }
298306
299 core::Signal<int64_t> seeked_to;307 core::Signal<int64_t> seeked_to;
300 core::Signal<void> end_of_stream;308 core::Signal<void> end_of_stream;
301 core::Signal<media::Player::PlaybackStatus> playback_status_changed;309 core::Signal<media::Player::PlaybackStatus> playback_status_changed;
310 core::Signal<uint64_t> video_dimension_changed;
302 } signals;311 } signals;
303312
304};313};
@@ -443,6 +452,11 @@
443 return *d->skeleton.properties.audio_stream_role;452 return *d->skeleton.properties.audio_stream_role;
444}453}
445454
455const core::Property<media::Player::Orientation>& media::PlayerSkeleton::orientation() const
456{
457 return *d->skeleton.properties.orientation;
458}
459
446const core::Property<media::Player::PlaybackRate>& media::PlayerSkeleton::minimum_playback_rate() const460const core::Property<media::Player::PlaybackRate>& media::PlayerSkeleton::minimum_playback_rate() const
447{461{
448 return *d->skeleton.properties.minimum_playback_rate;462 return *d->skeleton.properties.minimum_playback_rate;
@@ -488,6 +502,11 @@
488 return *d->skeleton.properties.audio_stream_role;502 return *d->skeleton.properties.audio_stream_role;
489}503}
490504
505core::Property<media::Player::Orientation>& media::PlayerSkeleton::orientation()
506{
507 return *d->skeleton.properties.orientation;
508}
509
491core::Property<media::Player::PlaybackStatus>& media::PlayerSkeleton::playback_status()510core::Property<media::Player::PlaybackStatus>& media::PlayerSkeleton::playback_status()
492{511{
493 return *d->skeleton.properties.typed_playback_status;512 return *d->skeleton.properties.typed_playback_status;
@@ -528,7 +547,6 @@
528 return *d->skeleton.properties.is_audio_source;547 return *d->skeleton.properties.is_audio_source;
529}548}
530549
531
532core::Property<media::Track::MetaData>& media::PlayerSkeleton::meta_data_for_current_track()550core::Property<media::Track::MetaData>& media::PlayerSkeleton::meta_data_for_current_track()
533{551{
534 return *d->skeleton.properties.typed_meta_data_for_current_track;552 return *d->skeleton.properties.typed_meta_data_for_current_track;
@@ -568,3 +586,13 @@
568{586{
569 return d->signals.playback_status_changed;587 return d->signals.playback_status_changed;
570}588}
589
590const core::Signal<uint64_t>& media::PlayerSkeleton::video_dimension_changed() const
591{
592 return d->signals.video_dimension_changed;
593}
594
595core::Signal<uint64_t>& media::PlayerSkeleton::video_dimension_changed()
596{
597 return d->signals.video_dimension_changed;
598}
571599
=== modified file 'src/core/media/player_skeleton.h'
--- src/core/media/player_skeleton.h 2014-09-09 14:02:52 +0000
+++ src/core/media/player_skeleton.h 2014-10-22 16:15:30 +0000
@@ -62,6 +62,7 @@
62 virtual const core::Property<int64_t>& position() const;62 virtual const core::Property<int64_t>& position() const;
63 virtual const core::Property<int64_t>& duration() const;63 virtual const core::Property<int64_t>& duration() const;
64 virtual const core::Property<AudioStreamRole>& audio_stream_role() const;64 virtual const core::Property<AudioStreamRole>& audio_stream_role() const;
65 virtual const core::Property<Orientation>& orientation() const;
6566
66 virtual core::Property<LoopStatus>& loop_status();67 virtual core::Property<LoopStatus>& loop_status();
67 virtual core::Property<PlaybackRate>& playback_rate();68 virtual core::Property<PlaybackRate>& playback_rate();
@@ -72,6 +73,7 @@
72 virtual const core::Signal<int64_t>& seeked_to() const;73 virtual const core::Signal<int64_t>& seeked_to() const;
73 virtual const core::Signal<void>& end_of_stream() const;74 virtual const core::Signal<void>& end_of_stream() const;
74 virtual core::Signal<PlaybackStatus>& playback_status_changed();75 virtual core::Signal<PlaybackStatus>& playback_status_changed();
76 virtual const core::Signal<uint64_t>& video_dimension_changed() const;
7577
76protected:78protected:
77 // All creation time arguments go here.79 // All creation time arguments go here.
@@ -88,6 +90,8 @@
8890
89 PlayerSkeleton(const Configuration& configuration);91 PlayerSkeleton(const Configuration& configuration);
9092
93 // These properties are not exposed to the client, but still need to be
94 // able to be settable from within the Player:
91 virtual core::Property<PlaybackStatus>& playback_status();95 virtual core::Property<PlaybackStatus>& playback_status();
92 virtual core::Property<bool>& can_play();96 virtual core::Property<bool>& can_play();
93 virtual core::Property<bool>& can_pause();97 virtual core::Property<bool>& can_pause();
@@ -101,9 +105,11 @@
101 virtual core::Property<PlaybackRate>& maximum_playback_rate();105 virtual core::Property<PlaybackRate>& maximum_playback_rate();
102 virtual core::Property<int64_t>& position();106 virtual core::Property<int64_t>& position();
103 virtual core::Property<int64_t>& duration();107 virtual core::Property<int64_t>& duration();
108 virtual core::Property<Orientation>& orientation();
104109
105 virtual core::Signal<int64_t>& seeked_to();110 virtual core::Signal<int64_t>& seeked_to();
106 virtual core::Signal<void>& end_of_stream();111 virtual core::Signal<void>& end_of_stream();
112 virtual core::Signal<uint64_t>& video_dimension_changed();
107113
108 private:114 private:
109 struct Private;115 struct Private;
110116
=== modified file 'src/core/media/player_stub.cpp'
--- src/core/media/player_stub.cpp 2014-10-16 15:30:44 +0000
+++ src/core/media/player_stub.cpp 2014-10-22 16:15:30 +0000
@@ -57,6 +57,7 @@
57 object(object),57 object(object),
58 properties58 properties
59 {59 {
60 // Link the properties from the server side to the client side over the bus
60 object->get_property<mpris::Player::Properties::CanPlay>(),61 object->get_property<mpris::Player::Properties::CanPlay>(),
61 object->get_property<mpris::Player::Properties::CanPause>(),62 object->get_property<mpris::Player::Properties::CanPause>(),
62 object->get_property<mpris::Player::Properties::CanSeek>(),63 object->get_property<mpris::Player::Properties::CanSeek>(),
@@ -74,6 +75,7 @@
74 object->get_property<mpris::Player::Properties::Position>(),75 object->get_property<mpris::Player::Properties::Position>(),
75 object->get_property<mpris::Player::Properties::Duration>(),76 object->get_property<mpris::Player::Properties::Duration>(),
76 object->get_property<mpris::Player::Properties::AudioStreamRole>(),77 object->get_property<mpris::Player::Properties::AudioStreamRole>(),
78 object->get_property<mpris::Player::Properties::Orientation>(),
77 object->get_property<mpris::Player::Properties::MinimumRate>(),79 object->get_property<mpris::Player::Properties::MinimumRate>(),
78 object->get_property<mpris::Player::Properties::MaximumRate>()80 object->get_property<mpris::Player::Properties::MaximumRate>()
79 },81 },
@@ -81,7 +83,8 @@
81 {83 {
82 object->get_signal<mpris::Player::Signals::Seeked>(),84 object->get_signal<mpris::Player::Signals::Seeked>(),
83 object->get_signal<mpris::Player::Signals::EndOfStream>(),85 object->get_signal<mpris::Player::Signals::EndOfStream>(),
84 object->get_signal<mpris::Player::Signals::PlaybackStatusChanged>()86 object->get_signal<mpris::Player::Signals::PlaybackStatusChanged>(),
87 object->get_signal<mpris::Player::Signals::VideoDimensionChanged>()
85 }88 }
86 {89 {
87 }90 }
@@ -160,6 +163,7 @@
160 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Position>> position;163 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Position>> position;
161 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Duration>> duration;164 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Duration>> duration;
162 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::AudioStreamRole>> audio_role;165 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::AudioStreamRole>> audio_role;
166 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Orientation>> orientation;
163 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::MinimumRate>> minimum_playback_rate;167 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::MinimumRate>> minimum_playback_rate;
164 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::MaximumRate>> maximum_playback_rate;168 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::MaximumRate>> maximum_playback_rate;
165 } properties;169 } properties;
@@ -169,21 +173,25 @@
169 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType> DBusSeekedToSignal;173 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType> DBusSeekedToSignal;
170 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType> DBusEndOfStreamSignal;174 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType> DBusEndOfStreamSignal;
171 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType> DBusPlaybackStatusChangedSignal;175 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType> DBusPlaybackStatusChangedSignal;
176 typedef core::dbus::Signal<mpris::Player::Signals::VideoDimensionChanged, mpris::Player::Signals::VideoDimensionChanged::ArgumentType> DBusVideoDimensionChangedSignal;
172177
173 Signals(const std::shared_ptr<DBusSeekedToSignal>& seeked,178 Signals(const std::shared_ptr<DBusSeekedToSignal>& seeked,
174 const std::shared_ptr<DBusEndOfStreamSignal>& eos,179 const std::shared_ptr<DBusEndOfStreamSignal>& eos,
175 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& status)180 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& status,
181 const std::shared_ptr<DBusVideoDimensionChangedSignal>& d)
176 : dbus182 : dbus
177 {183 {
178 seeked,184 seeked,
179 eos,185 eos,
180 status186 status,
187 d
181 },188 },
182 playback_complete_cb(nullptr),189 playback_complete_cb(nullptr),
183 playback_complete_context(nullptr),190 playback_complete_context(nullptr),
184 seeked_to(),191 seeked_to(),
185 end_of_stream(),192 end_of_stream(),
186 playback_status_changed()193 playback_status_changed(),
194 video_dimension_changed()
187 {195 {
188 dbus.seeked_to->connect([this](std::uint64_t value)196 dbus.seeked_to->connect([this](std::uint64_t value)
189 {197 {
@@ -204,6 +212,12 @@
204 std::cout << "PlaybackStatusChanged signal arrived via the bus." << std::endl;212 std::cout << "PlaybackStatusChanged signal arrived via the bus." << std::endl;
205 playback_status_changed(status);213 playback_status_changed(status);
206 });214 });
215
216 dbus.video_dimension_changed->connect([this](uint64_t mask)
217 {
218 std::cout << "VideoDimensionChanged signal arrived via the bus." << std::endl;
219 video_dimension_changed(mask);
220 });
207 }221 }
208222
209 struct DBus223 struct DBus
@@ -211,6 +225,7 @@
211 std::shared_ptr<DBusSeekedToSignal> seeked_to;225 std::shared_ptr<DBusSeekedToSignal> seeked_to;
212 std::shared_ptr<DBusEndOfStreamSignal> end_of_stream;226 std::shared_ptr<DBusEndOfStreamSignal> end_of_stream;
213 std::shared_ptr<DBusPlaybackStatusChangedSignal> playback_status_changed;227 std::shared_ptr<DBusPlaybackStatusChangedSignal> playback_status_changed;
228 std::shared_ptr<DBusVideoDimensionChangedSignal> video_dimension_changed;
214 } dbus;229 } dbus;
215230
216 void set_playback_complete_cb(PlaybackCompleteCb cb, void *context)231 void set_playback_complete_cb(PlaybackCompleteCb cb, void *context)
@@ -224,6 +239,7 @@
224 core::Signal<int64_t> seeked_to;239 core::Signal<int64_t> seeked_to;
225 core::Signal<void> end_of_stream;240 core::Signal<void> end_of_stream;
226 core::Signal<media::Player::PlaybackStatus> playback_status_changed;241 core::Signal<media::Player::PlaybackStatus> playback_status_changed;
242 core::Signal<uint64_t> video_dimension_changed;
227 } signals;243 } signals;
228};244};
229245
@@ -416,6 +432,11 @@
416 return *d->properties.audio_role;432 return *d->properties.audio_role;
417}433}
418434
435const core::Property<media::Player::Orientation>& media::PlayerStub::orientation() const
436{
437 return *d->properties.orientation;
438}
439
419const core::Property<media::Player::PlaybackRate>& media::PlayerStub::minimum_playback_rate() const440const core::Property<media::Player::PlaybackRate>& media::PlayerStub::minimum_playback_rate() const
420{441{
421 return *d->properties.minimum_playback_rate;442 return *d->properties.minimum_playback_rate;
@@ -465,3 +486,8 @@
465{486{
466 return d->signals.playback_status_changed;487 return d->signals.playback_status_changed;
467}488}
489
490const core::Signal<uint64_t>& media::PlayerStub::video_dimension_changed() const
491{
492 return d->signals.video_dimension_changed;
493}
468494
=== modified file 'src/core/media/player_stub.h'
--- src/core/media/player_stub.h 2014-10-16 15:30:44 +0000
+++ src/core/media/player_stub.h 2014-10-22 16:15:30 +0000
@@ -14,6 +14,7 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *15 *
16 * Authored by: Thomas Voß <thomas.voss@canonical.com>16 * Authored by: Thomas Voß <thomas.voss@canonical.com>
17 * Jim Hodapp <jim.hodapp@canonical.com>
17 */18 */
1819
19#ifndef CORE_UBUNTU_MEDIA_PLAYER_STUB_H_20#ifndef CORE_UBUNTU_MEDIA_PLAYER_STUB_H_
@@ -76,6 +77,7 @@
76 virtual const core::Property<int64_t>& position() const;77 virtual const core::Property<int64_t>& position() const;
77 virtual const core::Property<int64_t>& duration() const;78 virtual const core::Property<int64_t>& duration() const;
78 virtual const core::Property<AudioStreamRole>& audio_stream_role() const;79 virtual const core::Property<AudioStreamRole>& audio_stream_role() const;
80 virtual const core::Property<Orientation>& orientation() const;
7981
80 virtual core::Property<LoopStatus>& loop_status();82 virtual core::Property<LoopStatus>& loop_status();
81 virtual core::Property<PlaybackRate>& playback_rate();83 virtual core::Property<PlaybackRate>& playback_rate();
@@ -86,6 +88,7 @@
86 virtual const core::Signal<int64_t>& seeked_to() const;88 virtual const core::Signal<int64_t>& seeked_to() const;
87 virtual const core::Signal<void>& end_of_stream() const;89 virtual const core::Signal<void>& end_of_stream() const;
88 virtual core::Signal<PlaybackStatus>& playback_status_changed();90 virtual core::Signal<PlaybackStatus>& playback_status_changed();
91 virtual const core::Signal<uint64_t>& video_dimension_changed() const;
8992
90 private:93 private:
91 struct Private;94 struct Private;

Subscribers

People subscribed via source and target branches