Skip to content

Commit

Permalink
Cherry-pick 261683@main (758056c). https://bugs.webkit.org/show_bug.c…
Browse files Browse the repository at this point in the history
…gi?id=253954

    [GStreamer][WebRTC] Improve DataChannel logs
    https://bugs.webkit.org/show_bug.cgi?id=253954

    Reviewed by Xabier Rodriguez-Calvar.

    The logs now mention one unique identifier per data-channel. This works only when building against
    GStreamer 1.22 though because it requires new macros.

    * Source/WebCore/Modules/mediastream/gstreamer/GStreamerDataChannelHandler.cpp:
    (WebCore::GStreamerDataChannelHandler::GStreamerDataChannelHandler):
    (WebCore::GStreamerDataChannelHandler::~GStreamerDataChannelHandler):
    (WebCore::GStreamerDataChannelHandler::setClient):
    (WebCore::GStreamerDataChannelHandler::sendStringData):
    (WebCore::GStreamerDataChannelHandler::sendRawData):
    (WebCore::GStreamerDataChannelHandler::close):
    (WebCore::GStreamerDataChannelHandler::checkState):
    (WebCore::GStreamerDataChannelHandler::bufferedAmountChanged):
    (WebCore::GStreamerDataChannelHandler::onMessageData):
    (WebCore::GStreamerDataChannelHandler::onMessageString):
    (WebCore::GStreamerDataChannelHandler::onError):
    (WebCore::GStreamerDataChannelHandler::onClose):
    * Source/WebCore/Modules/mediastream/gstreamer/GStreamerDataChannelHandler.h:

    Canonical link: https://commits.webkit.org/261683@main
  • Loading branch information
philn authored and aperezdc committed Apr 12, 2023
1 parent dbe13ed commit d515d9d
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 25 deletions.
Expand Up @@ -34,6 +34,16 @@
GST_DEBUG_CATEGORY(webkit_webrtc_data_channel_debug);
#define GST_CAT_DEFAULT webkit_webrtc_data_channel_debug

#if GST_CHECK_VERSION(1, 22, 0)
#define DC_DEBUG(...) GST_DEBUG_ID(m_channelId.ascii().data(), __VA_ARGS__)
#define DC_TRACE(...) GST_TRACE_ID(m_channelId.ascii().data(), __VA_ARGS__)
#define DC_WARNING(...) GST_WARNING_ID(m_channelId.ascii().data(), __VA_ARGS__)
#else
#define DC_DEBUG(...) GST_DEBUG(__VA_ARGS__)
#define DC_TRACE(...) GST_TRACE(__VA_ARGS__)
#define DC_WARNING(...) GST_WARNING(__VA_ARGS__)
#endif

namespace WebCore {

GUniquePtr<GstStructure> GStreamerDataChannelHandler::fromRTCDataChannelInit(const RTCDataChannelInit& options)
Expand Down Expand Up @@ -74,12 +84,15 @@ GUniquePtr<GstStructure> GStreamerDataChannelHandler::fromRTCDataChannelInit(con
GStreamerDataChannelHandler::GStreamerDataChannelHandler(GRefPtr<GstWebRTCDataChannel>&& channel)
: m_channel(WTFMove(channel))
{
static Atomic<uint64_t> nChannel = 0;
m_channelId = makeString("webkit-webrtc-data-channel-", nChannel.exchangeAdd(1));

ASSERT(m_channel);
static std::once_flag debugRegisteredFlag;
std::call_once(debugRegisteredFlag, [] {
GST_DEBUG_CATEGORY_INIT(webkit_webrtc_data_channel_debug, "webkitwebrtcdatachannel", 0, "WebKit WebRTC data-channel");
});
GST_DEBUG("New GStreamerDataChannelHandler for channel %p", m_channel.get());
DC_DEBUG("New GStreamerDataChannelHandler for channel %p", m_channel.get());

{
Locker locker { m_clientLock };
Expand Down Expand Up @@ -108,7 +121,7 @@ GStreamerDataChannelHandler::GStreamerDataChannelHandler(GRefPtr<GstWebRTCDataCh

GStreamerDataChannelHandler::~GStreamerDataChannelHandler()
{
GST_DEBUG("Deleting GStreamerDataChannelHandler for channel %p", m_channel.get());
DC_DEBUG("Deleting GStreamerDataChannelHandler for channel %p", m_channel.get());
if (m_channel)
g_signal_handlers_disconnect_by_data(m_channel.get(), this);
}
Expand Down Expand Up @@ -142,26 +155,26 @@ void GStreamerDataChannelHandler::setClient(RTCDataChannelHandlerClient& client,
{
Locker locker { m_clientLock };
ASSERT(!m_client);
GST_DEBUG("Setting client on channel %p", m_channel.get());
DC_DEBUG("Setting client on channel %p", m_channel.get());
m_client = client;
m_contextIdentifier = contextIdentifier;

checkState();

for (auto& message : m_pendingMessages) {
switchOn(message, [&](Ref<FragmentedSharedBuffer>& data) {
GST_DEBUG("Notifying queued raw data (size: %zu)", data->size());
DC_DEBUG("Notifying queued raw data (size: %zu)", data->size());
client.didReceiveRawData(data->makeContiguous()->data(), data->size());
}, [&](String& text) {
GST_DEBUG("Notifying queued string of size %d", text.sizeInBytes());
GST_TRACE("Notifying queued string %s", text.ascii().data());
DC_DEBUG("Notifying queued string of size %d", text.sizeInBytes());
DC_TRACE("Notifying queued string %s", text.ascii().data());
client.didReceiveStringData(text);
}, [&](StateChange stateChange) {
if (stateChange.error) {
if (auto rtcError = toRTCError(*stateChange.error))
client.didDetectError(rtcError.releaseNonNull());
}
GST_DEBUG("Dispatching state change to %d on channel %p", static_cast<int>(stateChange.state), m_channel.get());
DC_DEBUG("Dispatching state change to %d on channel %p", static_cast<int>(stateChange.state), m_channel.get());
client.didChangeReadyState(stateChange.state);
});
}
Expand All @@ -170,23 +183,23 @@ void GStreamerDataChannelHandler::setClient(RTCDataChannelHandlerClient& client,

bool GStreamerDataChannelHandler::sendStringData(const CString& text)
{
GST_DEBUG("Sending string of length: %zu", text.length());
GST_TRACE("Sending string %s", text.data());
DC_DEBUG("Sending string of length: %zu", text.length());
DC_TRACE("Sending string %s", text.data());
g_signal_emit_by_name(m_channel.get(), "send-string", text.data());
return true;
}

bool GStreamerDataChannelHandler::sendRawData(const uint8_t* data, size_t length)
{
GST_DEBUG("Sending raw data of length: %zu", length);
DC_DEBUG("Sending raw data of length: %zu", length);
auto bytes = adoptGRef(g_bytes_new(data, length));
g_signal_emit_by_name(m_channel.get(), "send-data", bytes.get());
return true;
}

void GStreamerDataChannelHandler::close()
{
GST_DEBUG("Closing channel %p", m_channel.get());
DC_DEBUG("Closing channel %p", m_channel.get());
m_closing = true;

GstWebRTCDataChannelState channelState;
Expand All @@ -207,8 +220,11 @@ void GStreamerDataChannelHandler::checkState()
{
ASSERT(m_clientLock.isHeld());

if (!m_channel)
DC_DEBUG("Checking state.");
if (!m_channel) {
DC_DEBUG("No channel.");
return;
}

GstWebRTCDataChannelState channelState;
g_object_get(m_channel.get(), "ready-state", &channelState, nullptr);
Expand All @@ -234,20 +250,25 @@ void GStreamerDataChannelHandler::checkState()
}

if (!m_client) {
GST_DEBUG("No client yet on channel %p, queueing state", m_channel.get());
DC_DEBUG("No client yet on channel %p, queueing state", m_channel.get());
m_pendingMessages.append(StateChange { state, { } });
return;
}

if (channelState == GST_WEBRTC_DATA_CHANNEL_STATE_OPEN && m_closing) {
GST_DEBUG("Ignoring open state notification on channel %p because it was pending to be closed", m_channel.get());
DC_DEBUG("Ignoring open state notification on channel %p because it was pending to be closed", m_channel.get());
return;
}

if (!*m_client)
if (!*m_client) {
DC_DEBUG("Client is empty.");
return;
}

GST_DEBUG("Dispatching state change to %d on channel %p", static_cast<int>(state), m_channel.get());
#ifndef GST_DISABLE_GST_DEBUG
GUniquePtr<char> stateString(g_enum_to_string(GST_TYPE_WEBRTC_DATA_CHANNEL_STATE, channelState));
DC_DEBUG("Dispatching state change to %s on channel %p", stateString.get(), m_channel.get());
#endif
postTask([client = m_client, state] {
if (!*client) {
GST_DEBUG("No client");
Expand All @@ -271,12 +292,12 @@ void GStreamerDataChannelHandler::bufferedAmountChanged()
g_object_get(m_channel.get(), "buffered-amount", &currentBufferedAmount, nullptr);

auto bufferedAmount = static_cast<size_t>(currentBufferedAmount);
GST_DEBUG("New buffered amount on channel %p: %" G_GSIZE_FORMAT " old: %" G_GSIZE_FORMAT, m_channel.get(), bufferedAmount, m_cachedBufferedAmount ? *m_cachedBufferedAmount : -1);
DC_DEBUG("New buffered amount on channel %p: %" G_GSIZE_FORMAT " old: %" G_GSIZE_FORMAT, m_channel.get(), bufferedAmount, m_cachedBufferedAmount ? *m_cachedBufferedAmount : -1);

if (m_cachedBufferedAmount && (*m_cachedBufferedAmount >= bufferedAmount)) {
GST_DEBUG("Buffered amount getting low on channel %p", m_channel.get());
DC_DEBUG("Buffered amount getting low on channel %p", m_channel.get());
if (!m_client) {
GST_DEBUG("No client yet on channel %p", m_channel.get());
DC_DEBUG("No client yet on channel %p", m_channel.get());
return;
}

Expand All @@ -296,7 +317,7 @@ void GStreamerDataChannelHandler::bufferedAmountChanged()
void GStreamerDataChannelHandler::onMessageData(GBytes* bytes)
{
auto size = g_bytes_get_size(bytes);
GST_DEBUG("Incoming data of size: %zu", size);
DC_DEBUG("Incoming data of size: %zu", size);
Locker locker { m_clientLock };

if (!m_client) {
Expand All @@ -320,17 +341,17 @@ void GStreamerDataChannelHandler::onMessageString(const char* message)
{
Locker locker { m_clientLock };

GST_TRACE("Incoming string: %s", message);
DC_TRACE("Incoming string: %s", message);
if (!m_client) {
GST_DEBUG("No client yet, keeping as buffered message");
DC_DEBUG("No client yet, keeping as buffered message");
m_pendingMessages.append(String::fromUTF8(message));
return;
}

if (!*m_client)
return;

GST_DEBUG("Dispatching string of size %zu", strlen(message));
DC_DEBUG("Dispatching string of size %zu", strlen(message));
postTask([client = m_client, string = String::fromUTF8(message)] {
if (!*client)
return;
Expand All @@ -345,7 +366,7 @@ void GStreamerDataChannelHandler::onError(GError* error)
if (!m_client)
return;

GST_WARNING("Got data-channel error %s", error->message);
DC_WARNING("Got data-channel error %s", error->message);
GUniquePtr<GError> errorCopy(g_error_copy(error));
postTask([client = m_client, error = WTFMove(errorCopy)] {
if (!client || !error)
Expand All @@ -361,7 +382,7 @@ void GStreamerDataChannelHandler::onError(GError* error)
void GStreamerDataChannelHandler::onClose()
{
Locker locker { m_clientLock };
GST_DEBUG("Channel %p closed!", m_channel.get());
DC_DEBUG("Channel %p closed!", m_channel.get());
checkState();
}

Expand Down
Expand Up @@ -84,6 +84,8 @@ class GStreamerDataChannelHandler final : public RTCDataChannelHandler {

std::optional<size_t> m_cachedBufferedAmount;
bool m_closing { false };

String m_channelId;
};

} // namespace WebCore
Expand Down

0 comments on commit d515d9d

Please sign in to comment.