| Differences between
and this patch
- a/Source/WebCore/ChangeLog +17 lines
Lines 1-3 a/Source/WebCore/ChangeLog_sec1
1
2020-07-08  Philippe Normand  <pnormand@igalia.com>
2
3
        REGRESSION(r263836): [GStreamer] Debug ASSERT hits
4
        https://bugs.webkit.org/show_bug.cgi?id=214047
5
6
        Reviewed by Xabier Rodriguez-Calvar.
7
8
        Reduce the element dependency on RefPtr<MediaStreamTrackPrivate> which is not MT-safe. The
9
        data we need from it are its ID and the contents required to build a GstTagList. So we now
10
        create this tag-list upfront and keep track of the trackID as well.
11
12
        * platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:
13
        (webkitMediaStreamSrcAddPad):
14
        (ProbeData::ProbeData):
15
        (webkitMediaStreamSrcPadProbeCb):
16
        (webkitMediaStreamSrcSetupSrc):
17
1
2020-07-07  Andy Estes  <aestes@apple.com>
18
2020-07-07  Andy Estes  <aestes@apple.com>
2
19
3
        [Apple Pay] Fix the build on Catalina internal SDKs
20
        [Apple Pay] Fix the build on Catalina internal SDKs
- a/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp -11 / +14 lines
Lines 429-435 static GstFlowReturn webkitMediaStreamSrcChain(GstPad* pad, GstObject* parent, G a/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp_sec1
429
    return result;
429
    return result;
430
}
430
}
431
431
432
static void webkitMediaStreamSrcAddPad(WebKitMediaStreamSrc* self, GstPad* target, GstStaticPadTemplate* padTemplate, MediaStreamTrackPrivate* track)
432
static void webkitMediaStreamSrcAddPad(WebKitMediaStreamSrc* self, GstPad* target, GstStaticPadTemplate* padTemplate, GRefPtr<GstTagList>&& tags)
433
{
433
{
434
    GST_DEBUG_OBJECT(self, "%s Ghosting %" GST_PTR_FORMAT, gst_object_get_path_string(GST_OBJECT_CAST(self)), target);
434
    GST_DEBUG_OBJECT(self, "%s Ghosting %" GST_PTR_FORMAT, gst_object_get_path_string(GST_OBJECT_CAST(self)), target);
435
435
Lines 443-462 static void webkitMediaStreamSrcAddPad(WebKitMediaStreamSrc* self, GstPad* targe a/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp_sec2
443
    gst_flow_combiner_add_pad(self->priv->flowCombiner.get(), proxyPad.get());
443
    gst_flow_combiner_add_pad(self->priv->flowCombiner.get(), proxyPad.get());
444
    gst_pad_set_chain_function(proxyPad.get(), static_cast<GstPadChainFunction>(webkitMediaStreamSrcChain));
444
    gst_pad_set_chain_function(proxyPad.get(), static_cast<GstPadChainFunction>(webkitMediaStreamSrcChain));
445
445
446
    auto tags = mediaStreamTrackPrivateGetTags(track);
447
    gst_pad_push_event(target, gst_event_new_tag(tags.leakRef()));
446
    gst_pad_push_event(target, gst_event_new_tag(tags.leakRef()));
448
}
447
}
449
448
450
struct ProbeData {
449
struct ProbeData {
451
    WTF_MAKE_STRUCT_FAST_ALLOCATED;
450
    ProbeData(GstElement* element, GstStaticPadTemplate* padTemplate, GRefPtr<GstTagList>&& tags, const char* trackId)
452
    ProbeData(GstElement* element, GstStaticPadTemplate* padTemplate, RefPtr<MediaStreamTrackPrivate> track)
453
        : element(element)
451
        : element(element)
454
        , padTemplate(padTemplate)
452
        , padTemplate(padTemplate)
455
        , track(track) { }
453
        , tags(WTFMove(tags))
454
    {
455
        this->trackId.reset(g_strdup(trackId));
456
    }
456
457
457
    GRefPtr<GstElement> element;
458
    GRefPtr<GstElement> element;
458
    GstStaticPadTemplate* padTemplate;
459
    GstStaticPadTemplate* padTemplate;
459
    RefPtr<MediaStreamTrackPrivate> track;
460
    GRefPtr<GstTagList> tags;
461
    GUniquePtr<char> trackId;
460
};
462
};
461
463
462
static GstPadProbeReturn webkitMediaStreamSrcPadProbeCb(GstPad* pad, GstPadProbeInfo* info, ProbeData* data)
464
static GstPadProbeReturn webkitMediaStreamSrcPadProbeCb(GstPad* pad, GstPadProbeInfo* info, ProbeData* data)
Lines 469-484 static GstPadProbeReturn webkitMediaStreamSrcPadProbeCb(GstPad* pad, GstPadProbe a/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp_sec3
469
    case GST_EVENT_STREAM_START: {
471
    case GST_EVENT_STREAM_START: {
470
        const char* streamId;
472
        const char* streamId;
471
        gst_event_parse_stream_start(event, &streamId);
473
        gst_event_parse_stream_start(event, &streamId);
472
        if (!g_strcmp0(streamId, data->track->id().utf8().data())) {
474
        if (!g_strcmp0(streamId, data->trackId.get())) {
473
            GST_INFO_OBJECT(pad, "Event has been sticked already");
475
            GST_INFO_OBJECT(pad, "Event has been sticked already");
474
            return GST_PAD_PROBE_REMOVE;
476
            return GST_PAD_PROBE_REMOVE;
475
        }
477
        }
476
478
477
        auto* streamStart = gst_event_new_stream_start(data->track->id().utf8().data());
479
        auto* streamStart = gst_event_new_stream_start(data->trackId.get());
478
        gst_event_set_group_id(streamStart, 1);
480
        gst_event_set_group_id(streamStart, 1);
479
        gst_pad_push_event(pad, streamStart);
481
        gst_pad_push_event(pad, streamStart);
480
482
481
        webkitMediaStreamSrcAddPad(self, pad, data->padTemplate, data->track.get());
483
        webkitMediaStreamSrcAddPad(self, pad, data->padTemplate, WTFMove(data->tags));
482
        return GST_PAD_PROBE_REMOVE;
484
        return GST_PAD_PROBE_REMOVE;
483
    }
485
    }
484
    default:
486
    default:
Lines 494-507 static void webkitMediaStreamSrcSetupSrc(WebKitMediaStreamSrc* self, MediaStream a/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp_sec4
494
    gst_bin_add(GST_BIN_CAST(self), element);
496
    gst_bin_add(GST_BIN_CAST(self), element);
495
497
496
    auto pad = adoptGRef(gst_element_get_static_pad(element, "src"));
498
    auto pad = adoptGRef(gst_element_get_static_pad(element, "src"));
499
    auto tags = mediaStreamTrackPrivateGetTags(track);
497
    if (!onlyTrack) {
500
    if (!onlyTrack) {
498
        auto* data = new ProbeData(GST_ELEMENT_CAST(self), padTemplate, track);
501
        auto* data = new ProbeData(GST_ELEMENT_CAST(self), padTemplate, WTFMove(tags), track->id().utf8().data());
499
        gst_pad_add_probe(pad.get(), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, reinterpret_cast<GstPadProbeCallback>(webkitMediaStreamSrcPadProbeCb), data, [](gpointer data) {
502
        gst_pad_add_probe(pad.get(), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, reinterpret_cast<GstPadProbeCallback>(webkitMediaStreamSrcPadProbeCb), data, [](gpointer data) {
500
            delete reinterpret_cast<ProbeData*>(data);
503
            delete reinterpret_cast<ProbeData*>(data);
501
        });
504
        });
502
    } else {
505
    } else {
503
        gst_pad_set_active(pad.get(), TRUE);
506
        gst_pad_set_active(pad.get(), TRUE);
504
        webkitMediaStreamSrcAddPad(self, pad.get(), padTemplate, track);
507
        webkitMediaStreamSrcAddPad(self, pad.get(), padTemplate, WTFMove(tags));
505
    }
508
    }
506
509
507
    auto* priv = self->priv;
510
    auto* priv = self->priv;

Return to Bug 214047