Changeset 151903 in webkit
- Timestamp:
- Jun 24, 2013 2:32:54 AM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r151896 r151903 1 2013-06-24 Commit Queue <commit-queue@webkit.org> 2 3 Unreviewed, rolling out r151021. 4 http://trac.webkit.org/changeset/151021 5 https://bugs.webkit.org/show_bug.cgi?id=117924 6 7 caused regressions on Qt and GTK (#117141 and #117688) 8 (Requested by philn on #webkit). 9 10 * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp: 11 (webkit_web_src_init): 12 (webKitWebSrcFinalize): 13 (webKitWebSrcSetProperty): 14 (webKitWebSrcGetProperty): 15 (webKitWebSrcStop): 16 (webKitWebSrcStart): 17 (webKitWebSrcChangeState): 18 (webKitWebSrcQueryWithParent): 19 (webKitWebSrcGetUri): 20 (webKitWebSrcSetUri): 21 (webKitWebSrcNeedDataMainCb): 22 (webKitWebSrcEnoughDataMainCb): 23 (webKitWebSrcSeekMainCb): 24 (webKitWebSrcSeekDataCb): 25 (StreamingClient::StreamingClient): 26 (StreamingClient::~StreamingClient): 27 (StreamingClient::didReceiveResponse): 28 (StreamingClient::didReceiveData): 29 (StreamingClient::didFinishLoading): 30 (StreamingClient::wasBlocked): 31 (StreamingClient::cannotShowURL): 32 1 33 2013-06-24 Christophe Dumez <ch.dumez@sisa.samsung.com> 2 34 -
trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp
r151731 r151903 43 43 #include <wtf/text/CString.h> 44 44 45 /* Premisses:46 * - webkitsrc may be created from any thread inside gstreamer47 * - client holds reference to src, so that src is never deleted while client exists48 * - if the src exists, appsrc also exists49 * - client is created on start50 * - client is deleted on stop after cancelling resource handle51 * - client callbacks are always invoked from main thread52 * - resource handle methods must always be called from main thread53 */54 55 45 using namespace WebCore; 56 46 … … 95 85 guint64 requestedOffset; 96 86 97 guint startID;98 guint stopID;99 87 guint needDataID; 100 88 guint enoughDataID; … … 148 136 static void webKitWebSrcEnoughDataCb(GstAppSrc*, gpointer userData); 149 137 static gboolean webKitWebSrcSeekDataCb(GstAppSrc*, guint64 offset, gpointer userData); 138 139 static void webKitWebSrcStop(WebKitWebSrc*, bool); 150 140 151 141 static GstAppSrcCallbacks appsrcCallbacks = { … … 240 230 src->priv = priv; 241 231 232 priv->client = new StreamingClient(src); 233 242 234 priv->appsrc = GST_APP_SRC(gst_element_factory_make("appsrc", 0)); 243 235 if (!priv->appsrc) { … … 288 280 g_object_set(priv->appsrc, "min-percent", 20, NULL); 289 281 290 gst_app_src_set_caps(priv->appsrc, 0); 291 gst_app_src_set_size(priv->appsrc, -1); 282 webKitWebSrcStop(src, false); 292 283 } 293 284 … … 312 303 WebKitWebSrcPrivate* priv = src->priv; 313 304 305 delete priv->client; 306 314 307 g_free(priv->uri); 315 308 … … 324 317 switch (propID) { 325 318 case PROP_IRADIO_MODE: 326 GST_OBJECT_LOCK(src);327 319 priv->iradioMode = g_value_get_boolean(value); 328 GST_OBJECT_UNLOCK(src);329 320 break; 330 321 case PROP_LOCATION: … … 346 337 WebKitWebSrcPrivate* priv = src->priv; 347 338 348 GST_OBJECT_LOCK(src);349 339 switch (propID) { 350 340 case PROP_IRADIO_MODE: … … 370 360 break; 371 361 } 372 GST_OBJECT_UNLOCK(src); 373 } 374 375 // must be called on main thread and with object unlocked 376 static gboolean webKitWebSrcStop(WebKitWebSrc* src) 377 { 378 WebKitWebSrcPrivate* priv = src->priv; 379 gboolean seeking; 380 381 GST_OBJECT_LOCK(src); 382 383 seeking = priv->seekID; 384 385 if (priv->startID) { 386 g_source_remove(priv->startID); 387 priv->startID = 0; 388 } 362 } 363 364 365 static void webKitWebSrcStop(WebKitWebSrc* src, bool seeking) 366 { 367 WebKitWebSrcPrivate* priv = src->priv; 389 368 390 369 if (priv->resourceHandle) { … … 394 373 priv->resourceHandle = 0; 395 374 396 if (priv->client) {397 delete priv->client;398 priv->client = 0;399 }400 401 375 if (priv->frame && !seeking) 402 376 priv->frame.clear(); … … 411 385 } 412 386 387 GST_OBJECT_LOCK(src); 413 388 if (priv->needDataID) 414 389 g_source_remove(priv->needDataID); … … 424 399 425 400 priv->paused = FALSE; 401 GST_OBJECT_UNLOCK(src); 426 402 427 403 g_free(priv->iradioName); … … 436 412 g_free(priv->iradioTitle); 437 413 priv->iradioTitle = 0; 438 439 priv->offset = 0;440 priv->seekable = FALSE;441 442 if (!seeking) {443 priv->size = 0;444 priv->requestedOffset = 0;445 }446 447 priv->stopID = 0;448 GST_OBJECT_UNLOCK(src);449 414 450 415 if (priv->appsrc) { … … 454 419 } 455 420 421 priv->offset = 0; 422 priv->seekable = FALSE; 423 424 if (!seeking) { 425 priv->size = 0; 426 priv->requestedOffset = 0; 427 } 428 456 429 GST_DEBUG_OBJECT(src, "Stopped request"); 457 458 return FALSE; 459 } 460 461 // must be called on main thread and with object unlocked 462 static gboolean webKitWebSrcStart(WebKitWebSrc* src) 463 { 464 WebKitWebSrcPrivate* priv = src->priv; 465 466 GST_OBJECT_LOCK(src); 430 } 431 432 static bool webKitWebSrcStart(WebKitWebSrc* src) 433 { 434 WebKitWebSrcPrivate* priv = src->priv; 435 467 436 if (!priv->uri) { 468 437 GST_ERROR_OBJECT(src, "No URI provided"); 469 GST_OBJECT_UNLOCK(src); 470 webKitWebSrcStop(src); 471 return FALSE; 472 } 473 438 return false; 439 } 440 474 441 KURL url = KURL(KURL(), priv->uri); 475 442 … … 506 473 request.setHTTPHeaderField("transferMode.dlna", "Streaming"); 507 474 508 priv->client = new StreamingClient(src);509 475 priv->resourceHandle = ResourceHandle::create(context, request, priv->client, false, false); 510 476 if (!priv->resourceHandle) { 511 477 GST_ERROR_OBJECT(src, "Failed to create ResourceHandle"); 512 GST_OBJECT_UNLOCK(src); 513 webKitWebSrcStop(src); 514 } else { 515 GST_OBJECT_UNLOCK(src); 516 GST_DEBUG_OBJECT(src, "Started request"); 517 } 518 return FALSE; 478 return false; 479 } 480 481 GST_DEBUG_OBJECT(src, "Started request"); 482 483 return true; 519 484 } 520 485 … … 547 512 case GST_STATE_CHANGE_READY_TO_PAUSED: 548 513 GST_DEBUG_OBJECT(src, "READY->PAUSED"); 549 GST_OBJECT_LOCK(src); 550 priv->startID = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitWebSrcStart, gst_object_ref(src), (GDestroyNotify) gst_object_unref); 551 GST_OBJECT_UNLOCK(src); 514 if (!webKitWebSrcStart(src)) 515 ret = GST_STATE_CHANGE_FAILURE; 552 516 break; 553 517 case GST_STATE_CHANGE_PAUSED_TO_READY: 554 518 GST_DEBUG_OBJECT(src, "PAUSED->READY"); 555 GST_OBJECT_LOCK(src); 556 priv->stopID = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitWebSrcStop, gst_object_ref(src), (GDestroyNotify) gst_object_unref); 557 GST_OBJECT_UNLOCK(src); 519 webKitWebSrcStop(src, false); 558 520 break; 559 521 default: … … 566 528 static gboolean webKitWebSrcQueryWithParent(GstPad* pad, GstObject* parent, GstQuery* query) 567 529 { 568 WebKitWebSrc* src = WEBKIT_WEB_SRC(GST_ELEMENT(parent));530 WebKitWebSrc* webkitSrc = WEBKIT_WEB_SRC(GST_ELEMENT(parent)); 569 531 gboolean result = FALSE; 570 532 … … 575 537 gst_query_parse_duration(query, &format, NULL); 576 538 577 GST_DEBUG_OBJECT(src, "duration query in format %s", gst_format_get_name(format)); 578 GST_OBJECT_LOCK(src); 579 if ((format == GST_FORMAT_BYTES) && (src->priv->size > 0)) { 580 gst_query_set_duration(query, format, src->priv->size); 539 GST_DEBUG_OBJECT(webkitSrc, "duration query in format %s", gst_format_get_name(format)); 540 if ((format == GST_FORMAT_BYTES) && (webkitSrc->priv->size > 0)) { 541 gst_query_set_duration(query, format, webkitSrc->priv->size); 581 542 result = TRUE; 582 543 } 583 GST_OBJECT_UNLOCK(src);584 544 break; 585 545 } 586 546 case GST_QUERY_URI: { 587 GST_OBJECT_LOCK(src); 588 gst_query_set_uri(query, src->priv->uri); 589 GST_OBJECT_UNLOCK(src); 547 gst_query_set_uri(query, webkitSrc->priv->uri); 590 548 result = TRUE; 591 549 break; … … 628 586 static gchar* webKitWebSrcGetUri(GstURIHandler* handler) 629 587 { 630 WebKitWebSrc* src = WEBKIT_WEB_SRC(handler); 631 gchar* ret; 632 633 GST_OBJECT_LOCK(src); 634 ret = g_strdup(src->priv->uri); 635 GST_OBJECT_UNLOCK(src); 636 return ret; 588 return g_strdup(WEBKIT_WEB_SRC(handler)->priv->uri); 637 589 } 638 590 … … 647 599 } 648 600 649 GST_OBJECT_LOCK(src);650 601 g_free(priv->uri); 651 602 priv->uri = 0; 652 603 653 if (!uri) { 654 GST_OBJECT_UNLOCK(src); 604 if (!uri) 655 605 return TRUE; 656 }657 606 658 607 KURL url(KURL(), uri); 659 608 660 609 if (!url.isValid() || !url.protocolIsInHTTPFamily()) { 661 GST_OBJECT_UNLOCK(src);662 610 g_set_error(error, GST_URI_ERROR, GST_URI_ERROR_BAD_URI, "Invalid URI '%s'", uri); 663 611 return FALSE; … … 665 613 666 614 priv->uri = g_strdup(url.string().utf8().data()); 667 GST_OBJECT_UNLOCK(src);668 615 return TRUE; 669 616 } … … 683 630 static const gchar* webKitWebSrcGetUri(GstURIHandler* handler) 684 631 { 685 WebKitWebSrc* src = WEBKIT_WEB_SRC(handler); 686 gchar* ret; 687 688 GST_OBJECT_LOCK(src); 689 ret = g_strdup(src->priv->uri); 690 GST_OBJECT_UNLOCK(src); 691 return ret; 632 return g_strdup(WEBKIT_WEB_SRC(handler)->priv->uri); 692 633 } 693 634 … … 702 643 } 703 644 704 GST_OBJECT_LOCK(src);705 645 g_free(priv->uri); 706 646 priv->uri = 0; 707 647 708 if (!uri) { 709 GST_OBJECT_UNLOCK(src); 648 if (!uri) 710 649 return TRUE; 711 }712 650 713 651 KURL url(KURL(), uri); 714 652 715 653 if (!url.isValid() || !url.protocolIsInHTTPFamily()) { 716 GST_OBJECT_UNLOCK(src);717 654 GST_ERROR_OBJECT(src, "Invalid URI '%s'", uri); 718 655 return FALSE; … … 720 657 721 658 priv->uri = g_strdup(url.string().utf8().data()); 722 GST_OBJECT_UNLOCK(src);723 659 return TRUE; 724 660 } … … 741 677 WebKitWebSrcPrivate* priv = src->priv; 742 678 679 priv->resourceHandle->setDefersLoading(false); 680 743 681 GST_OBJECT_LOCK(src); 744 // already stopped745 if (!priv->needDataID) {746 GST_OBJECT_UNLOCK(src);747 return FALSE;748 }749 750 682 priv->paused = FALSE; 751 683 priv->needDataID = 0; 752 684 GST_OBJECT_UNLOCK(src); 753 754 if (priv->resourceHandle)755 priv->resourceHandle->setDefersLoading(false);756 685 return FALSE; 757 686 } … … 778 707 WebKitWebSrcPrivate* priv = src->priv; 779 708 709 priv->resourceHandle->setDefersLoading(true); 710 780 711 GST_OBJECT_LOCK(src); 781 // already stopped782 if (!priv->enoughDataID) {783 GST_OBJECT_UNLOCK(src);784 return FALSE;785 }786 787 712 priv->paused = TRUE; 788 713 priv->enoughDataID = 0; 789 714 GST_OBJECT_UNLOCK(src); 790 715 791 if (priv->resourceHandle)792 priv->resourceHandle->setDefersLoading(true);793 716 return FALSE; 794 717 } … … 813 736 static gboolean webKitWebSrcSeekMainCb(WebKitWebSrc* src) 814 737 { 815 webKitWebSrcStop(src );738 webKitWebSrcStop(src, true); 816 739 webKitWebSrcStart(src); 817 740 … … 825 748 826 749 GST_DEBUG_OBJECT(src, "Seeking to offset: %" G_GUINT64_FORMAT, offset); 827 GST_OBJECT_LOCK(src); 828 if (offset == priv->offset && priv->requestedOffset == priv->offset) { 829 GST_OBJECT_UNLOCK(src); 750 if (offset == priv->offset && priv->requestedOffset == priv->offset) 830 751 return TRUE; 831 } 832 833 if (!priv->seekable) { 834 GST_OBJECT_UNLOCK(src); 752 753 if (!priv->seekable) 835 754 return FALSE; 836 } 837 if (offset > priv->size) { 838 GST_OBJECT_UNLOCK(src); 755 if (offset > priv->size) 839 756 return FALSE; 840 }841 757 842 758 GST_DEBUG_OBJECT(src, "Doing range-request seek"); 843 759 priv->requestedOffset = offset; 844 760 761 GST_OBJECT_LOCK(src); 845 762 if (priv->seekID) 846 763 g_source_remove(priv->seekID); 847 764 priv->seekID = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitWebSrcSeekMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref); 848 765 GST_OBJECT_UNLOCK(src); 849 766 850 767 return TRUE; 851 768 } … … 864 781 } 865 782 866 StreamingClient::StreamingClient(WebKitWebSrc* src) 867 : m_src(static_cast<WebKitWebSrc*>(gst_object_ref(src))) 783 StreamingClient::StreamingClient(WebKitWebSrc* src) : m_src(src) 868 784 { 869 785 … … 872 788 StreamingClient::~StreamingClient() 873 789 { 874 gst_object_unref(m_src); 790 875 791 } 876 792 … … 879 795 } 880 796 881 void StreamingClient::didReceiveResponse(ResourceHandle *handle, const ResourceResponse& response)797 void StreamingClient::didReceiveResponse(ResourceHandle*, const ResourceResponse& response) 882 798 { 883 799 WebKitWebSrcPrivate* priv = m_src->priv; … … 885 801 GST_DEBUG_OBJECT(m_src, "Received response: %d", response.httpStatusCode()); 886 802 887 GST_OBJECT_LOCK(m_src);888 889 803 // If we seeked we need 206 == PARTIAL_CONTENT 890 if (handle != priv->resourceHandle || (priv->requestedOffset && response.httpStatusCode() != 206)) { 891 GST_OBJECT_UNLOCK(m_src); 804 if (priv->requestedOffset && response.httpStatusCode() != 206) { 892 805 GST_ELEMENT_ERROR(m_src, RESOURCE, READ, (0), (0)); 893 806 gst_app_src_end_of_stream(priv->appsrc); 894 webKitWebSrcStop(m_src );807 webKitWebSrcStop(m_src, false); 895 808 return; 896 809 } 897 810 898 811 long long length = response.expectedContentLength(); 899 if (length > 0) 812 if (length > 0) { 900 813 length += priv->requestedOffset; 814 gst_app_src_set_size(priv->appsrc, length); 815 816 #ifndef GST_API_VERSION_1 817 if (!priv->haveAppSrc27) { 818 gst_segment_set_duration(&GST_BASE_SRC(priv->appsrc)->segment, GST_FORMAT_BYTES, length); 819 gst_element_post_message(GST_ELEMENT(priv->appsrc), 820 gst_message_new_duration(GST_OBJECT(priv->appsrc), 821 GST_FORMAT_BYTES, length)); 822 } 823 #endif 824 } 901 825 902 826 priv->size = length >= 0 ? length : 0; 903 827 priv->seekable = length > 0 && g_ascii_strcasecmp("none", response.httpHeaderField("Accept-Ranges").utf8().data()); 828 829 // icecast stuff 830 String value = response.httpHeaderField("icy-metaint"); 831 if (!value.isEmpty()) { 832 gchar* endptr = 0; 833 gint64 icyMetaInt = g_ascii_strtoll(value.utf8().data(), &endptr, 10); 834 835 if (endptr && *endptr == '\0' && icyMetaInt > 0) { 836 GRefPtr<GstCaps> caps = adoptGRef(gst_caps_new_simple("application/x-icy", "metadata-interval", G_TYPE_INT, (gint) icyMetaInt, NULL)); 837 838 gst_app_src_set_caps(priv->appsrc, caps.get()); 839 } 840 } 904 841 905 842 #ifdef GST_API_VERSION_1 … … 908 845 GstTagList* tags = gst_tag_list_new(); 909 846 #endif 910 Stringvalue = response.httpHeaderField("icy-name");847 value = response.httpHeaderField("icy-name"); 911 848 if (!value.isEmpty()) { 912 849 g_free(priv->iradioName); … … 937 874 } 938 875 939 GST_OBJECT_UNLOCK(m_src);940 941 // notify size/duration942 if (length > 0) {943 gst_app_src_set_size(priv->appsrc, length);944 945 #ifndef GST_API_VERSION_1946 if (!priv->haveAppSrc27) {947 gst_segment_set_duration(&GST_BASE_SRC(priv->appsrc)->segment, GST_FORMAT_BYTES, length);948 gst_element_post_message(GST_ELEMENT(priv->appsrc),949 gst_message_new_duration(GST_OBJECT(priv->appsrc),950 GST_FORMAT_BYTES, length));951 }952 #endif953 } else954 gst_app_src_set_size(priv->appsrc, -1);955 956 // icecast stuff957 value = response.httpHeaderField("icy-metaint");958 if (!value.isEmpty()) {959 gchar* endptr = 0;960 gint64 icyMetaInt = g_ascii_strtoll(value.utf8().data(), &endptr, 10);961 962 if (endptr && *endptr == '\0' && icyMetaInt > 0) {963 GRefPtr<GstCaps> caps = adoptGRef(gst_caps_new_simple("application/x-icy", "metadata-interval", G_TYPE_INT, (gint) icyMetaInt, NULL));964 965 gst_app_src_set_caps(priv->appsrc, caps.get());966 }967 } else968 gst_app_src_set_caps(priv->appsrc, 0);969 970 // notify tags971 876 if (gst_tag_list_is_empty(tags)) 972 877 #ifdef GST_API_VERSION_1 … … 976 881 #endif 977 882 else 978 notifyGstTagsOnPad(GST_ELEMENT(m_src), priv->srcpad, tags);883 notifyGstTagsOnPad(GST_ELEMENT(m_src), m_src->priv->srcpad, tags); 979 884 } 980 885 … … 982 887 { 983 888 WebKitWebSrcPrivate* priv = m_src->priv; 984 985 GST_OBJECT_LOCK(m_src);986 889 987 890 GST_LOG_OBJECT(m_src, "Have %d bytes of data", priv->buffer ? getGstBufferSize(priv->buffer.get()) : length); … … 995 898 996 899 if (priv->seekID || handle != priv->resourceHandle) { 997 GST_OBJECT_UNLOCK(m_src);998 900 GST_DEBUG_OBJECT(m_src, "Seek in progress, ignoring data"); 999 901 priv->buffer.clear(); … … 1020 922 GST_BUFFER_OFFSET_END(priv->buffer.get()) = priv->offset; 1021 923 1022 GST_OBJECT_UNLOCK(m_src);1023 1024 924 GstFlowReturn ret = gst_app_src_push_buffer(priv->appsrc, priv->buffer.leakRef()); 1025 925 #ifdef GST_API_VERSION_1 … … 1055 955 GST_DEBUG_OBJECT(m_src, "Have EOS"); 1056 956 1057 GST_OBJECT_LOCK(m_src); 1058 if (!priv->seekID) { 1059 GST_OBJECT_UNLOCK(m_src); 957 if (!priv->seekID) 1060 958 gst_app_src_end_of_stream(m_src->priv->appsrc); 1061 } else1062 GST_OBJECT_UNLOCK(m_src);1063 959 } 1064 960 … … 1072 968 void StreamingClient::wasBlocked(ResourceHandle*) 1073 969 { 1074 GOwnPtr<gchar> uri;1075 1076 970 GST_ERROR_OBJECT(m_src, "Request was blocked"); 1077 1078 GST_OBJECT_LOCK(m_src); 1079 uri.set(g_strdup(m_src->priv->uri)); 1080 GST_OBJECT_UNLOCK(m_src); 1081 1082 GST_ELEMENT_ERROR(m_src, RESOURCE, OPEN_READ, ("Access to \"%s\" was blocked", uri.get()), (0)); 971 GST_ELEMENT_ERROR(m_src, RESOURCE, OPEN_READ, ("Access to \"%s\" was blocked", m_src->priv->uri), (0)); 1083 972 } 1084 973 1085 974 void StreamingClient::cannotShowURL(ResourceHandle*) 1086 975 { 1087 GOwnPtr<gchar> uri;1088 1089 976 GST_ERROR_OBJECT(m_src, "Cannot show URL"); 1090 1091 GST_OBJECT_LOCK(m_src); 1092 uri.set(g_strdup(m_src->priv->uri)); 1093 GST_OBJECT_UNLOCK(m_src); 1094 1095 GST_ELEMENT_ERROR(m_src, RESOURCE, OPEN_READ, ("Can't show \"%s\"", uri.get()), (0)); 977 GST_ELEMENT_ERROR(m_src, RESOURCE, OPEN_READ, ("Can't show \"%s\"", m_src->priv->uri), (0)); 1096 978 } 1097 979
Note: See TracChangeset
for help on using the changeset viewer.