Changeset 50726 in webkit
- Timestamp:
- Nov 10, 2009 1:45:52 AM (15 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r50725 r50726 1 2009-11-10 Philippe Normand <pnormand@igalia.com> 2 3 Reviewed by Jan Alonzo. 4 5 https://bugs.webkit.org/show_bug.cgi?id=31047 6 [GTK] Failing test media/video-played-ranges-1.html 7 8 Fix playback rate setter by remembering the rate was changed. Also 9 correctly handle reverse playback by doing a seek from end to 10 beginning of the media. 11 12 * platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp: 13 (WebCore::MediaPlayerPrivate::MediaPlayerPrivate): 14 (WebCore::MediaPlayerPrivate::currentTime): 15 (WebCore::MediaPlayerPrivate::seek): 16 (WebCore::MediaPlayerPrivate::hasAudio): 17 (WebCore::MediaPlayerPrivate::setVolume): 18 (WebCore::MediaPlayerPrivate::setRate): 19 (WebCore::MediaPlayerPrivate::updateStates): 20 * platform/graphics/gtk/MediaPlayerPrivateGStreamer.h: 21 1 22 2009-11-10 Oliver Hunt <oliver@apple.com> 2 23 -
trunk/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp
r50424 r50726 100 100 } 101 101 102 static float playbackPosition(GstElement* playbin) 103 { 104 105 float ret = 0.0; 106 107 GstQuery* query = gst_query_new_position(GST_FORMAT_TIME); 108 if (!gst_element_query(playbin, query)) { 109 LOG_VERBOSE(Media, "Position query failed..."); 110 gst_query_unref(query); 111 return ret; 112 } 113 114 gint64 position; 115 gst_query_parse_position(query, 0, &position); 116 117 // Position is available only if the pipeline is not in NULL or 118 // READY state. 119 if (position != GST_CLOCK_TIME_NONE) 120 ret = (float) (position / 1000000000.0); 121 122 LOG_VERBOSE(Media, "Position %" GST_TIME_FORMAT, GST_TIME_ARGS(position)); 123 124 gst_query_unref(query); 125 126 return ret; 127 } 128 102 129 void mediaPlayerPrivateRepaintCallback(WebKitVideoSink*, GstBuffer *buffer, MediaPlayerPrivate* playerPrivate) 103 130 { … … 138 165 , m_source(0) 139 166 , m_seekTime(0) 167 , m_changingRate(false) 140 168 , m_endTime(numeric_limits<float>::infinity()) 141 169 , m_networkState(MediaPlayer::Empty) … … 230 258 return m_seekTime; 231 259 232 float ret = 0.0; 233 234 GstQuery* query = gst_query_new_position(GST_FORMAT_TIME); 235 if (!gst_element_query(m_playBin, query)) { 236 LOG_VERBOSE(Media, "Position query failed..."); 237 gst_query_unref(query); 238 return ret; 239 } 240 241 gint64 position; 242 gst_query_parse_position(query, 0, &position); 243 ret = (float) (position / 1000000000.0); 244 LOG_VERBOSE(Media, "Position %" GST_TIME_FORMAT, GST_TIME_ARGS(position)); 245 246 gst_query_unref(query); 247 248 return ret; 260 return playbackPosition(m_playBin); 261 249 262 } 250 263 … … 272 285 m_seeking = true; 273 286 m_seekTime = sec; 287 // Wait some time for the seek to complete. 288 gst_element_get_state(m_playBin, 0, 0, 40 * GST_MSECOND); 274 289 } 275 290 } … … 364 379 void MediaPlayerPrivate::setRate(float rate) 365 380 { 366 if (rate == 0.0) { 367 gst_element_set_state(m_playBin, GST_STATE_PAUSED); 368 return; 369 } 381 GstState state; 382 GstState pending; 383 384 gst_element_get_state(m_playBin, 385 &state, &pending, 250 * GST_NSECOND); 386 if (state != GST_STATE_PLAYING && state != GST_STATE_PAUSED) 387 return; 370 388 371 389 if (m_isStreaming) 372 390 return; 373 391 392 m_changingRate = true; 393 float currentPosition = playbackPosition(m_playBin) * GST_SECOND; 394 GstSeekFlags flags = (GstSeekFlags)(GST_SEEK_FLAG_FLUSH); 395 gint64 start, end; 396 bool mute = false; 397 374 398 LOG_VERBOSE(Media, "Set Rate to %f", rate); 375 seek(currentTime()); 399 if (rate >= 0) { 400 // Mute the sound if the playback rate is too extreme. 401 // TODO: in other cases we should perform pitch adjustments. 402 mute = (bool) (rate < 0.8 || rate > 2); 403 start = currentPosition; 404 end = GST_CLOCK_TIME_NONE; 405 } else { 406 start = 0; 407 mute = true; 408 409 // If we are at beginning of media, start from the end to 410 // avoid immediate EOS. 411 if (currentPosition == 0 || currentPosition == -1) 412 end = duration() * GST_SECOND; 413 else 414 end = currentPosition; 415 } 416 417 LOG_VERBOSE(Media, "Need to mute audio: %d", (int) mute); 418 419 if (!gst_element_seek(m_playBin, rate, GST_FORMAT_TIME, flags, 420 GST_SEEK_TYPE_SET, start, 421 GST_SEEK_TYPE_SET, end)) 422 LOG_VERBOSE(Media, "Set rate to %f failed", rate); 423 else { 424 g_object_set(m_playBin, "mute", mute, NULL); 425 // Wait some time for the seek to complete. 426 gst_element_get_state(m_playBin, 0, 0, 40 * GST_MSECOND); 427 } 376 428 } 377 429 … … 507 559 } else 508 560 m_paused = true; 561 562 if (m_changingRate) { 563 m_player->rateChanged(); 564 m_changingRate = false; 565 } 509 566 510 567 if (m_seeking) { … … 567 624 568 625 void MediaPlayerPrivate::loadStateChanged() 569 {570 updateStates();571 }572 573 void MediaPlayerPrivate::rateChanged()574 626 { 575 627 updateStates(); -
trunk/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.h
r50424 r50726 91 91 92 92 void loadStateChanged(); 93 void rateChanged();94 93 void sizeChanged(); 95 94 void timeChanged(); … … 127 126 GstElement* m_source; 128 127 GstClockTime m_seekTime; 128 bool m_changingRate; 129 129 float m_endTime; 130 130 bool m_isEndReached;
Note: See TracChangeset
for help on using the changeset viewer.