Commit 8747b99a authored by Andreas Pehrson's avatar Andreas Pehrson
Browse files

Bug 1828517 (MOZ) - Improve rtp packet delivery through MediaPipeline and...

Bug 1828517 (MOZ) - Improve rtp packet delivery through MediaPipeline and conduits. r=webrtc-reviewers,dbaker

With earlier fixes to upstream's PacketReceiver::DeliverPacket, received rtp
packets were parsed twice:
- In MediaPipeline, with the proper extension map in order to extract the header
  for filtering.
- In conduits, with no extension map.

The conduits would therefore not parse any rtp header extensions, leading to
problems later on as data from the extensions would not get exposed to
libwebrtc or js.

This patch removes the rtp packet parsing in the conduits and moves any setting
of metadata over to MediaPipeline so there is a single point responsible for
parsing rtp packets. The packet is then transferred verbatim via the conduits to
libwebrtc.

Differential Revision: https://phabricator.services.mozilla.com/D177536
parent d76b1723
Loading
Loading
Loading
Loading
+4 −14
Original line number Diff line number Diff line
@@ -536,7 +536,7 @@ MediaConduitErrorCode WebrtcAudioConduit::GetAudioFrame(
}

// Transport Layer Callbacks
void WebrtcAudioConduit::OnRtpReceived(MediaPacket&& aPacket,
void WebrtcAudioConduit::OnRtpReceived(webrtc::RtpPacketReceived&& aPacket,
                                       webrtc::RTPHeader&& aHeader) {
  MOZ_ASSERT(mCallThread->IsOnCurrentThread());

@@ -547,23 +547,13 @@ void WebrtcAudioConduit::OnRtpReceived(MediaPacket&& aPacket,
  }

  CSFLogVerbose(LOGTAG, "%s: seq# %u, Len %zu, SSRC %u (0x%x) ", __FUNCTION__,
                (uint16_t)ntohs(((uint16_t*)aPacket.data())[1]), aPacket.len(),
                (uint32_t)ntohl(((uint32_t*)aPacket.data())[2]),
                (uint32_t)ntohl(((uint32_t*)aPacket.data())[2]));
                aPacket.SequenceNumber(), aPacket.size(), aPacket.Ssrc(),
                aPacket.Ssrc());

  mRtpPacketEvent.Notify();
  if (mCall->Call()) {
    webrtc::RtpPacketReceived parsed_packet;
    if (!parsed_packet.Parse(
            rtc::CopyOnWriteBuffer(aPacket.data(), aPacket.len()))) {
      CSFLogError(LOGTAG, "%s Parsing packet failed for RTP packet",
                  __FUNCTION__);
      return;
    }
    parsed_packet.set_arrival_time(mCall->GetTimestampMaker().GetNowRealtime());

    mCall->Call()->Receiver()->DeliverRtpPacket(
        webrtc::MediaType::AUDIO, std::move(parsed_packet),
        webrtc::MediaType::AUDIO, std::move(aPacket),
        [self = RefPtr<WebrtcAudioConduit>(this)](
            const webrtc::RtpPacketReceived& packet) {
          CSFLogVerbose(
+4 −2
Original line number Diff line number Diff line
@@ -32,7 +32,8 @@ class WebrtcAudioConduit : public AudioSessionConduit,
  Maybe<int> ActiveSendPayloadType() const override;
  Maybe<int> ActiveRecvPayloadType() const override;

  void OnRtpReceived(MediaPacket&& aPacket, webrtc::RTPHeader&& aHeader);
  void OnRtpReceived(webrtc::RtpPacketReceived&& aPacket,
                     webrtc::RTPHeader&& aHeader);
  void OnRtcpReceived(MediaPacket&& aPacket);

  void OnRtcpBye() override;
@@ -50,7 +51,8 @@ class WebrtcAudioConduit : public AudioSessionConduit,
    return mReceiverRtcpSendEvent;
  }
  void ConnectReceiverRtpEvent(
      MediaEventSourceExc<MediaPacket, webrtc::RTPHeader>& aEvent) override {
      MediaEventSourceExc<webrtc::RtpPacketReceived, webrtc::RTPHeader>& aEvent)
      override {
    mReceiverRtpEventListener =
        aEvent.Connect(mCallThread, this, &WebrtcAudioConduit::OnRtpReceived);
  }
+4 −2
Original line number Diff line number Diff line
@@ -37,8 +37,9 @@
#include "rtc_base/copy_on_write_buffer.h"

namespace webrtc {
class RtpPacketReceived;
class VideoFrame;
}
}  // namespace webrtc

namespace mozilla {
namespace dom {
@@ -135,7 +136,8 @@ class MediaSessionConduit {
  // Receiving packets...
  // from an rtp-receiving pipeline
  virtual void ConnectReceiverRtpEvent(
      MediaEventSourceExc<MediaPacket, webrtc::RTPHeader>& aEvent) = 0;
      MediaEventSourceExc<webrtc::RtpPacketReceived, webrtc::RTPHeader>&
          aEvent) = 0;
  // from an rtp-receiving pipeline
  virtual void ConnectReceiverRtcpEvent(
      MediaEventSourceExc<MediaPacket>& aEvent) = 0;
+5 −18
Original line number Diff line number Diff line
@@ -1412,7 +1412,7 @@ void WebrtcVideoConduit::DeliverPacket(rtc::CopyOnWriteBuffer packet,
  MOZ_ASSERT(false);
}

void WebrtcVideoConduit::OnRtpReceived(MediaPacket&& aPacket,
void WebrtcVideoConduit::OnRtpReceived(webrtc::RtpPacketReceived&& aPacket,
                                       webrtc::RTPHeader&& aHeader) {
  MOZ_ASSERT(mCallThread->IsOnCurrentThread());

@@ -1441,27 +1441,14 @@ void WebrtcVideoConduit::OnRtpReceived(MediaPacket&& aPacket,
    }
  }

  CSFLogVerbose(
      LOGTAG,
      "VideoConduit %p: Received RTP packet, seq# %u, len %zu, SSRC %u (0x%x) ",
      this, (uint16_t)ntohs(((uint16_t*)aPacket.data())[1]), aPacket.len(),
      (uint32_t)ntohl(((uint32_t*)aPacket.data())[2]),
      (uint32_t)ntohl(((uint32_t*)aPacket.data())[2]));
  CSFLogVerbose(LOGTAG, "%s: seq# %u, Len %zu, SSRC %u (0x%x) ", __FUNCTION__,
                aPacket.SequenceNumber(), aPacket.size(), aPacket.Ssrc(),
                aPacket.Ssrc());

  mRtpPacketEvent.Notify();
  if (mCall->Call()) {
    webrtc::RtpPacketReceived parsed_packet;
    if (!parsed_packet.Parse(
            rtc::CopyOnWriteBuffer(aPacket.data(), aPacket.len()))) {
      CSFLogError(LOGTAG, "%s Parsing packet failed for RTP packet",
                  __FUNCTION__);
      return;
    }
    parsed_packet.set_arrival_time(mCall->GetTimestampMaker().GetNowRealtime());
    parsed_packet.set_payload_type_frequency(
        webrtc::kVideoPayloadTypeFrequency);
    mCall->Call()->Receiver()->DeliverRtpPacket(
        webrtc::MediaType::VIDEO, std::move(parsed_packet),
        webrtc::MediaType::VIDEO, std::move(aPacket),
        [self = RefPtr<WebrtcVideoConduit>(this)](
            const webrtc::RtpPacketReceived& packet) {
          CSFLogVerbose(
+4 −2
Original line number Diff line number Diff line
@@ -190,7 +190,8 @@ class WebrtcVideoConduit

  void CollectTelemetryData() override;

  void OnRtpReceived(MediaPacket&& aPacket, webrtc::RTPHeader&& aHeader);
  void OnRtpReceived(webrtc::RtpPacketReceived&& aPacket,
                     webrtc::RTPHeader&& aHeader);
  void OnRtcpReceived(MediaPacket&& aPacket);

  void OnRtcpBye() override;
@@ -208,7 +209,8 @@ class WebrtcVideoConduit
    return mReceiverRtcpSendEvent;
  }
  void ConnectReceiverRtpEvent(
      MediaEventSourceExc<MediaPacket, webrtc::RTPHeader>& aEvent) override {
      MediaEventSourceExc<webrtc::RtpPacketReceived, webrtc::RTPHeader>& aEvent)
      override {
    mReceiverRtpEventListener =
        aEvent.Connect(mCallThread, this, &WebrtcVideoConduit::OnRtpReceived);
  }
Loading