mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 10:18:41 +02:00 
			
		
		
		
	This adds logging to Pacer<T>, which is currently only used by VideoFrameConverter. It also updates VideoFrameConverter's own logging through a dedicated macro, and puts both classes' on the MediaPipeline log module. Differential Revision: https://phabricator.services.mozilla.com/D224701
		
			
				
	
	
		
			1053 lines
		
	
	
	
		
			37 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			1053 lines
		
	
	
	
		
			37 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
Debugging WebRTC Calls
 | 
						|
======================
 | 
						|
 | 
						|
.. _reporting_webrtc_call_issues:
 | 
						|
 | 
						|
Reporting WebRTC Call Issues
 | 
						|
----------------------------
 | 
						|
 | 
						|
The best way to report an issue is through Bugzilla using this
 | 
						|
`link <https://bugzilla.mozilla.org/enter_bug.cgi?product=Core&component=WebRTC>`__.
 | 
						|
Describe the issue you've run into, include a URL, along with the
 | 
						|
details of the call setup. See the :ref:`adding-call-setup-information`
 | 
						|
section for helpful templates. Here are some common examples of descriptive
 | 
						|
WebRTC bug summaries:
 | 
						|
 | 
						|
* caller is experiencing frozen video, screen capture, or desktop capture
 | 
						|
* caller does not hear audio
 | 
						|
* caller's voice sounds distorted or robotic
 | 
						|
* video resolution is lower than expected
 | 
						|
* caller's video appears rotated
 | 
						|
* there is significant delay between a caller's video and audio
 | 
						|
* camera, microphone, or screens are not appearing in the Firefox device access
 | 
						|
  permission prompts, etc.
 | 
						|
* caller's video is garbled, partially missing, or the colors are incorrect
 | 
						|
* caller can not share external display, but can share integrated display
 | 
						|
 | 
						|
.. note::
 | 
						|
  Not all web conferencing software makes extensive use of WebRTC.
 | 
						|
 | 
						|
 | 
						|
For simple issues, the first place to look is to check the
 | 
						|
`web developer console </devtools-user/web_console>`__ for error messages
 | 
						|
related to media format issues. If you see messages here related to WebRTC,
 | 
						|
getUserMedia, or getDisplayMedia, please add this information to your bug.
 | 
						|
 | 
						|
.. _adding-call-setup-information:
 | 
						|
 | 
						|
Adding Call Setup Information
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
The following template can help one provide all the call details needed to
 | 
						|
diagnose many common issues.
 | 
						|
 | 
						|
.. code:: md
 | 
						|
 | 
						|
   * Does this problem occur in Firefox for Desktop or Android?
 | 
						|
 | 
						|
   * Is this problem reproducible in Firefox Nightly?
 | 
						|
 | 
						|
   * Has this worked previously?
 | 
						|
 | 
						|
   * Have you tried using `about:profiles` to reproduce the problem in a
 | 
						|
     clean profile?
 | 
						|
 | 
						|
   * How many participants were in the call?
 | 
						|
 | 
						|
   * In which web conferencing or web calling services does the problem occur?
 | 
						|
 | 
						|
   * Does the problem present itself immediately upon starting the call?
 | 
						|
 | 
						|
   * If not how long does it take to occur?
 | 
						|
 | 
						|
   * If this is a problem with audio or video capture, what camera or microphone
 | 
						|
     are you using? (adding about:support text may be helpful)
 | 
						|
 | 
						|
   * If this is problem with screen capture, which screen was being captured,
 | 
						|
     and are there other screens attached to the same machine?
 | 
						|
 | 
						|
   * Would you be willing to help us find a regression range?
 | 
						|
 | 
						|
If the issue is of specification compliance the template provided below may be
 | 
						|
more useful. If one is unsure if this is a compliance issue, one can refer to
 | 
						|
the :ref:`standards-documentation` section for links.
 | 
						|
 | 
						|
.. code:: md
 | 
						|
 | 
						|
  * What unexpected behavior is being observed? What are the steps to reproduce
 | 
						|
    this issue?
 | 
						|
 | 
						|
  * What is the expected behavior?
 | 
						|
 | 
						|
  * Where is this behavior specified?
 | 
						|
 | 
						|
  * Is this problem reproducible in Nightly?
 | 
						|
 | 
						|
  * Have you tried using `about:profiles` to reproduce the problem in a clean
 | 
						|
    profile?
 | 
						|
 | 
						|
  * Has this worked previously?
 | 
						|
 | 
						|
  * If so, would you be willing to help us find a regression range?
 | 
						|
 | 
						|
.. _share_your_aboutsupport_text:
 | 
						|
 | 
						|
Adding about:support Text
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
In your Bugzilla report, please include support information about the
 | 
						|
current device on which you are experiencing an issue.
 | 
						|
 | 
						|
#. Open a tab and visit about:support
 | 
						|
#. Click 'Copy Text to Clipboard'
 | 
						|
#. Paste this text in your Bugzilla bug comment and post.
 | 
						|
 | 
						|
.. note::
 | 
						|
 | 
						|
  To open :code:`about:*` links in Firefox one must do the following:
 | 
						|
  #. Right-click the link and select `Open Link in New Tab`
 | 
						|
  #. Select the new tab
 | 
						|
  #. Click inside the address bar which should contain the about URL
 | 
						|
  #. Press Enter
 | 
						|
 | 
						|
.. _share_your_aboutwebrtc_contents:
 | 
						|
 | 
						|
Adding about:webrtc RTCPeerConnection Stats
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
#. Open about:webrtc.
 | 
						|
#. Expand the RTCPeerConnection section.
 | 
						|
#. Locate and expand the subsection RTCPeerConnection that one wishes to copy
 | 
						|
   stats from.
 | 
						|
#. Press the :code:`Copy Stats Report`
 | 
						|
#. In the Bugzilla bug, press the :code:`Attach New File` button.
 | 
						|
#. Click inside the large text box labeled :code:`File`, and paste the copied
 | 
						|
   stats report.
 | 
						|
#. Add a descriptive label to the the :code:`Description:`, e.g.
 | 
						|
   "PeerConnection statistics sample taken during period of frame loss".
 | 
						|
#. In the drop down box, next to the :code:`select from list` radio option,
 | 
						|
   select "JSON source (application/json)".
 | 
						|
#. If needed, add a descriptive comment to the :code:`comment` field.
 | 
						|
#. Press the :code:`Submit` button.
 | 
						|
 | 
						|
.. note::
 | 
						|
   Hovering the mouse over some headings will reveal a clipboard icon. Clicking
 | 
						|
   this icon will copy the contents under that section to the clipboard as a
 | 
						|
   JSON document. This can be useful if one wants to submit a portion of the
 | 
						|
   available stats. Of particular note are the :code:`RTP Stats` heading whose
 | 
						|
   button will copy the latests RTP stats, and the :code:`SDP` section whose
 | 
						|
   button will copy the SDP offer; answer; and roles.
 | 
						|
 | 
						|
Adding Your about:webrtc Contents
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
For issues with call quality, please share web conferencing related
 | 
						|
performance information by providing your about:webrtc information. Note
 | 
						|
this information should be collected while the call in question is still
 | 
						|
active.
 | 
						|
 | 
						|
#. While your call is still ongoing, open an additional tab and visit
 | 
						|
   about:webrtc.
 | 
						|
#. Click "Clear History" to clear the stats from other recent calls
 | 
						|
   which are no longer ongoing.
 | 
						|
#. At the bottom of the page click 'Save Page', and save this file.
 | 
						|
#. Add this file as an attachment to your bug.
 | 
						|
 | 
						|
This data contains statistics about your call, the signalling that was
 | 
						|
used to setup your call, and information about the network transports.
 | 
						|
 | 
						|
.. _diagnosing_call_quality_issues:
 | 
						|
 | 
						|
Diagnosing Call Quality Issues
 | 
						|
------------------------------
 | 
						|
 | 
						|
.. _about_webrtc_overview:
 | 
						|
 | 
						|
about:webrtc Overview
 | 
						|
~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
about:webrtc is an in-browser resource for debugging WebRTC calls. The
 | 
						|
primary audience for about:webrtc is browser developers but it can also be
 | 
						|
of use to anyone that needs to troubleshoot a WebRTC call. When there is no
 | 
						|
call data to display, about:webrtc will appear as follows:
 | 
						|
 | 
						|
.. figure:: img/about_webrtc_default_view.png
 | 
						|
   :alt: about:webrtc before any calls have been made
 | 
						|
 | 
						|
   about:webrtc before any calls have been made
 | 
						|
 | 
						|
Note that there are several sections. During a call each section will contain
 | 
						|
information pertinent to different aspects of the WebRTC browser implementation.
 | 
						|
 | 
						|
RTCPeerConnection Statistics
 | 
						|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
This section presents information useful for diagnosing active calls. It
 | 
						|
contains RTCPeerConnection creation parameters, connection information,
 | 
						|
negotiation details, RTP stream statistics, bandwidth statistics, and
 | 
						|
output frame statistics.
 | 
						|
 | 
						|
Connection Log
 | 
						|
^^^^^^^^^^^^^^
 | 
						|
 | 
						|
When one needs to diagnose issues with the underlying transports, logs
 | 
						|
can be found under Connection Log.
 | 
						|
 | 
						|
User Modified WebRTC Configuration
 | 
						|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
						|
This section will display any user modified preferences which effect the
 | 
						|
performance or behavior of browser components which can impact WebRTC calls.
 | 
						|
When hovering over a preference path displayed in this section a clipboard
 | 
						|
icon will appear. Clicking that icon will copy the path to the clipboard. It
 | 
						|
can then be pasted into `about:config <about:config>`__, to change or reset the
 | 
						|
value to its default.
 | 
						|
 | 
						|
.. warning::
 | 
						|
   Unexpected values in this section may be caused by installed extensions. It
 | 
						|
   is best to test issues in a clean profile when possible using
 | 
						|
   `about:profiles <about:profiles>`__.
 | 
						|
 | 
						|
Media Context
 | 
						|
^^^^^^^^^^^^^
 | 
						|
 | 
						|
Information that is gathered to determine Codec availability and capability is
 | 
						|
recorded under Media Context.
 | 
						|
 | 
						|
 | 
						|
Bottom Control Bar
 | 
						|
^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
At the bottom of about:webrtc is a row of buttons which allow the user to
 | 
						|
perform miscellaneous actions.
 | 
						|
 | 
						|
The `Save Page` button expands all the sections and presents a dialog to save
 | 
						|
the contents of the page. This will produce an HTML file suitable for attaching
 | 
						|
to bug reports.
 | 
						|
 | 
						|
In the event of a WebRTC issue, the :code:`Enable WebRTC Log Preset` button is a very
 | 
						|
quick way to start logging. Pressing that button will open a new tab with
 | 
						|
`about:logging <about:logging>`__ with the :code:`webrtc` preset selected. This
 | 
						|
preset contains all :ref:`standard-logging-modules`. Logging
 | 
						|
will begin immediately. If one needs to change other log settings on that page
 | 
						|
one can customize them, and then press :code:`Start Logging`. This may be
 | 
						|
necessary if one wishes to log to the profiler.
 | 
						|
 | 
						|
If experiencing echo cancellation issues, one may be asked to submit echo
 | 
						|
cancellation logs. These logs are gathered by pressing the
 | 
						|
:code:`Start AEC Logging` button. One should press the button to activate
 | 
						|
the logging while actively experiencing an echo cancellation failure.
 | 
						|
 | 
						|
.. note::
 | 
						|
 | 
						|
  Producing echo cancellation logs is incompatible with the content sandbox.
 | 
						|
  The user will be prompted with further instructions if the sandbox is active
 | 
						|
  and the :code:`Start AEC Logging` button is pressed.
 | 
						|
 | 
						|
.. _audiovideo_delay:
 | 
						|
 | 
						|
Audio/Video Delay
 | 
						|
^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
Delayed media is commonly caused by long physical paths between
 | 
						|
endpoints, though anything that slows down inter-hop delivery of packets
 | 
						|
can be at fault. Note that this is different than the bandwidth of the
 | 
						|
network path, and a high latency will not be fixed by reducing the video
 | 
						|
resolution or audio sample rate. Round trip time, or RTT, is the time it
 | 
						|
takes for a packet to get from the sender to the receiver and then for a
 | 
						|
packet to get from the receiver back to the sender. If the path is
 | 
						|
symmetric between the two endpoints one can assume that the one way
 | 
						|
delay is half the delay of the round trip.
 | 
						|
 | 
						|
The second common cause of A/V delay is jitter, the magnitude of
 | 
						|
variability in packet inter-arrival times. In order to smoothly play out
 | 
						|
of the incoming stream a receiver experiencing jitter will have to
 | 
						|
buffer (delay) incoming packets.
 | 
						|
 | 
						|
**Using** `about:webrtc <about:webrtc>`__ **to Diagnose Delay**
 | 
						|
 | 
						|
The key metrics in `about:webrtc <about:webrtc>`__ are RTT (round-trip-time) and
 | 
						|
jitter. They can be found in the RTP stats section of the
 | 
						|
PeerConnection. The PeerConnection informational blocks start out in a
 | 
						|
minimized state, and one will need to expand a block to find the RTP
 | 
						|
stats section:
 | 
						|
 | 
						|
.. figure:: img/about_webrtc_reveal_PeerConnection_stats.png
 | 
						|
   :alt: How to reveal the full statistics of a PeerConnection in about:webrtc
 | 
						|
   :width: 800px
 | 
						|
 | 
						|
   How to reveal the full statistics of a PeerConnection in about:webrtc
 | 
						|
 | 
						|
Once expanded one can locate the RTP Stats section and find the key
 | 
						|
diagnostic stats:
 | 
						|
 | 
						|
.. figure:: img/about_webrtc_Jitter_and_RTT.png
 | 
						|
   :alt: Location in about:webrtc of jitter and RTT stats
 | 
						|
   :width: 800px
 | 
						|
 | 
						|
   Location in about:webrtc of jitter and RTT stats
 | 
						|
 | 
						|
In this image we can see that there are 0 milliseconds of jitter, and 32
 | 
						|
milliseconds of round trip delay. This call should not be experiencing any
 | 
						|
noticeable delay. See the `Delay Calculation <#delay-calculation>`__
 | 
						|
appendix section below for some more detail.
 | 
						|
 | 
						|
If the perceived delay is larger than the estimated delay that could
 | 
						|
indicate a problem within Firefox that requires debugging. Under these
 | 
						|
circumstances it would be helpful to grab a JSON copy of the current
 | 
						|
stats by pressing the "Copy Report" button, pasting those stats into
 | 
						|
your Bugzilla bug report.
 | 
						|
 | 
						|
.. figure:: img/about_webrtc_copy_report.png
 | 
						|
   :alt: Location in about:webrtc of Copy Report button
 | 
						|
   :width: 800px
 | 
						|
 | 
						|
   Location in about:webrtc of Copy Report button
 | 
						|
 | 
						|
.. _performance-profiling-and-logging:
 | 
						|
 | 
						|
Performance Profiling and Logging
 | 
						|
---------------------------------
 | 
						|
 | 
						|
.. _capturing-a-firefox-performance-profile:
 | 
						|
 | 
						|
Capturing a Firefox Performance Profile
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
For basic performance issues, a performance profile can help engineers
 | 
						|
diagnose issues with video formats, performance, and rendering.
 | 
						|
 | 
						|
#. Visit https://profiler.firefox.com/ and enable the Profiler toolbar
 | 
						|
   button.
 | 
						|
#. Click the toolbar button down arrow and select 'Media' in the
 | 
						|
   Settings drop down.
 | 
						|
#. Open a tab and visit the page with the affected media content.
 | 
						|
#. Click the Profiler toolbar main button to start recording.
 | 
						|
#. Play media until the issue you are seeing manifests.
 | 
						|
#. Click the Profiler toolbar button again to stop recording.
 | 
						|
#. When a new Profile tab opens, click the upload profile button on the
 | 
						|
   upper right.
 | 
						|
#. Copy the resulting profile URL and post this to your Bugzilla report.
 | 
						|
 | 
						|
Additionally, detailed logging can be collected within performance
 | 
						|
profiles to help aid in debugging complicated issues. To enable the
 | 
						|
collection of a profile with low level debugging -
 | 
						|
 | 
						|
#. Visit https://profiler.firefox.com/ and enable the Profiler toolbar
 | 
						|
   button.
 | 
						|
#. In a new tab, visit about:webrtc. Click the 'Enable WebRTC Log
 | 
						|
   Preset' button, which will open a tab for about:logging with
 | 
						|
   pre-populated information.
 | 
						|
#. In about:logging, click the "Start Logging" button. (You are now
 | 
						|
   recording a profile, the profiler toolbar toggle button should be
 | 
						|
   selected automatically.)
 | 
						|
#. Open a new tab for testing and view the media you are having an issue
 | 
						|
   with. (After reproducing, DO NOT close this test tab yet.)
 | 
						|
#. Switch to the about:logging tab, click 'Stop logging', and then close
 | 
						|
   the test tab.
 | 
						|
#. Wait approximately 10 - 20 seconds for a new tab to automatically
 | 
						|
   open containing the generated performance profile.
 | 
						|
#. Within the upper-right side of the profiler tab click the 'upload
 | 
						|
   local profile' button to initiate profile upload. Once the upload is
 | 
						|
   complete, a drop down text field will open displaying the URL of the
 | 
						|
   profile. Select this text and copy it.
 | 
						|
#. Share the URL of the profile for analysis with the engineer you are
 | 
						|
   working with.
 | 
						|
 | 
						|
Alternatively one can set the following environment variable:
 | 
						|
 | 
						|
.. code:: sh
 | 
						|
 | 
						|
   MOZ_LOG="jsep:5,sdp:5,signaling:5,mtransport:5,nicer:5,RTCRtpReceiver:5,RTCRtpSender:5,RTCDMTFSender:5,WebrtcTCPSocket:5,CamerasChild:5,CamerasParent:5,VideoEngine:5,ShmemPool:5,TabShare:5,MediaChild:5,MediaParent:5,MediaManager:5,MediaTrackGraph:5,cubeb:5,MediaStream:5,MediaStreamTrack:5,DriftCompensator:5,ForwardInputTrack:5,MediaRecorder:5,MediaEncoder:5,TrackEncoder:5,VP8TrackEncoder:5,Muxer:5,GetUserMedia:5,MediaPipeline:5,WebAudioAPI:5,webrtc_trace:5,RTCRtpTransceiver:5,ForwardedInputTrack:5,HTMLMediaElement:5,HTMLMediaElementEvents:5"
 | 
						|
 | 
						|
.. _standard-logging-modules:
 | 
						|
 | 
						|
Standard Logging Modules
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
.. list-table:: Standard Logging Modules
 | 
						|
   :header-rows: 1
 | 
						|
 | 
						|
   * - Module
 | 
						|
     - Component
 | 
						|
     - Function
 | 
						|
     - Notes
 | 
						|
   * - jsep
 | 
						|
     - signalling
 | 
						|
     - JSEP state machine
 | 
						|
     -
 | 
						|
   * - sdp
 | 
						|
     - signalling
 | 
						|
     - SDP parsing
 | 
						|
     -
 | 
						|
   * - mtransport
 | 
						|
     - networking
 | 
						|
     - Network transports
 | 
						|
     -
 | 
						|
   * - nicer
 | 
						|
     - networking
 | 
						|
     - ICE stack
 | 
						|
     -
 | 
						|
   * - RTCRtpReceiver
 | 
						|
     - JS API
 | 
						|
     - JS API related to receiving media and media control packets
 | 
						|
     -
 | 
						|
   * - RTCRtpSender
 | 
						|
     - JS API
 | 
						|
     - JS API related to sending media and media control packets
 | 
						|
     -
 | 
						|
   * - RTCDMTFSender
 | 
						|
     - JS API
 | 
						|
     - JS API related to sending DTMF messages
 | 
						|
     -
 | 
						|
   * - WebrtcTCPSocket
 | 
						|
     - networking
 | 
						|
     -
 | 
						|
     -
 | 
						|
   * - CamerasChild
 | 
						|
     - media capture
 | 
						|
     - Content process end of IPC channel for receiving frames from media
 | 
						|
       capture devices
 | 
						|
     -
 | 
						|
   * - CamerasParent
 | 
						|
     - media capture
 | 
						|
     - Parent process end of IPC channel for sending frames from media capture devices
 | 
						|
     -
 | 
						|
   * - VideoEngine
 | 
						|
     - media capture
 | 
						|
     - Orchestrates capture of frames from media capture devices in the parent process
 | 
						|
     -
 | 
						|
   * - ShmemPool
 | 
						|
     - media capture
 | 
						|
     - Object pool of shared memory frame buffers for transferring media capture frames from parent to child process
 | 
						|
     -
 | 
						|
   * - TabShare
 | 
						|
     - media capture
 | 
						|
     - Captures tab content for sharing
 | 
						|
     -
 | 
						|
   * - MediaChild
 | 
						|
     - media
 | 
						|
     -
 | 
						|
     -
 | 
						|
   * - MediaParent
 | 
						|
     - media
 | 
						|
     -
 | 
						|
     -
 | 
						|
   * - MediaManager
 | 
						|
     - media
 | 
						|
     -
 | 
						|
     -
 | 
						|
   * - MediaTrackGraph
 | 
						|
     - media
 | 
						|
     -
 | 
						|
     -
 | 
						|
   * - cubeb
 | 
						|
     - media
 | 
						|
     -
 | 
						|
     -
 | 
						|
   * - MediaStream
 | 
						|
     - media
 | 
						|
     -
 | 
						|
     -
 | 
						|
   * - MediaStreamTrack
 | 
						|
     - media
 | 
						|
     -
 | 
						|
     -
 | 
						|
   * - DriftCompensator
 | 
						|
     - media
 | 
						|
     -
 | 
						|
     -
 | 
						|
   * - ForwardInputTrack
 | 
						|
     - media
 | 
						|
     -
 | 
						|
     -
 | 
						|
   * - MediaRecorder
 | 
						|
     - media
 | 
						|
     -
 | 
						|
     -
 | 
						|
   * - MediaEncoder
 | 
						|
     - media
 | 
						|
     -
 | 
						|
     -
 | 
						|
   * - TrackEncoder
 | 
						|
     - media
 | 
						|
     -
 | 
						|
     -
 | 
						|
   * - VP8TrackEncoder
 | 
						|
     - media
 | 
						|
     -
 | 
						|
     -
 | 
						|
   * - Muxer
 | 
						|
     - media
 | 
						|
     -
 | 
						|
     -
 | 
						|
   * - MediaPipeline
 | 
						|
     - network
 | 
						|
     - Glue code between transport, media, and libwebrtc components
 | 
						|
     -
 | 
						|
   * - WebAudioAPI
 | 
						|
     -
 | 
						|
     -
 | 
						|
     -
 | 
						|
   * - webrtc_trace
 | 
						|
     - webrtc
 | 
						|
     - libwebrtc logging
 | 
						|
     - Prior to Firefox v123 it must be enabled from
 | 
						|
       `about:webrtc <about:webrtc>`__ at runtime, or it must be set in the
 | 
						|
       :code:`MOZ_LOG` environment variable at launch.
 | 
						|
   * - RTCRtpTransceiver
 | 
						|
     - JS API
 | 
						|
     - implements the RTCRtpTransceiver object
 | 
						|
     -
 | 
						|
   * - HTMLMediaElement
 | 
						|
     -
 | 
						|
     -
 | 
						|
     -
 | 
						|
   * - ForwardedInputTrack
 | 
						|
     -
 | 
						|
     -
 | 
						|
     -
 | 
						|
   * - HTMLMediaElementEvents
 | 
						|
     -
 | 
						|
     -
 | 
						|
     -
 | 
						|
 | 
						|
.. _non-standard-loggin-modules:
 | 
						|
 | 
						|
Non-standard Logging Modules
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
.. list-table:: Standard Logging Modules
 | 
						|
   :header-rows: 1
 | 
						|
 | 
						|
   * - Module
 | 
						|
     - Component
 | 
						|
     - Function
 | 
						|
     - Notes
 | 
						|
   * - RTPLogger
 | 
						|
     - network
 | 
						|
     - Logs RTP and RTCP packet fragments
 | 
						|
     - See `Debugging Encrypted Packets <#debugging-encrypted-packets>`__
 | 
						|
 | 
						|
.. _examining-call-performance-issues:
 | 
						|
 | 
						|
Examining Call Performance Issues
 | 
						|
---------------------------------
 | 
						|
 | 
						|
.. _enabling-call-stats-history:
 | 
						|
 | 
						|
Enabling Call Stats History
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
Call stats history is enabled by default in Nightly. To enable in
 | 
						|
release builds open `about:config <about:config>`__, and change
 | 
						|
"media.aboutwebrtc.hist.enabled" to true. This will keep a history
 | 
						|
window of stats for a number of recent calls, allowing for inspection
 | 
						|
in `about:webrtc <about:webrtc>`__ after a call has completed.
 | 
						|
 | 
						|
.. _dumping-call-stats:
 | 
						|
 | 
						|
Dumping Call Stats
 | 
						|
~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
One can dump a JSON blob of call stats for an active call, or a recent
 | 
						|
call if call stats history is enabled. There are two buttons in
 | 
						|
`about:webrtc <about:webrtc>`__ to do this, "Copy Report" and "Copy Report
 | 
						|
History". The former will create a copy of the most recent stats for the
 | 
						|
PeerConnection. The later will copy all the history of stats reports
 | 
						|
that `about:webrtc <about:webrtc>`__ has accumulated for that PeerConnection, this
 | 
						|
can be up to several minutes of stats.
 | 
						|
 | 
						|
.. _debugging-encrypted-packets:
 | 
						|
 | 
						|
Debugging Encrypted Packets
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
.. warning::
 | 
						|
   There is a `blog
 | 
						|
   post <https://blog.mozilla.org/webrtc/debugging-encrypted-rtp-is-more-fun-than-it-used-to-be/>`__
 | 
						|
   covering dumping unencrypted partial RTP and RTCP packets in the logs.
 | 
						|
   While the information presented in that post is still relevant,
 | 
						|
   the command to extract the packet data in the blog is out of date. A
 | 
						|
   working method is presented below;
 | 
						|
 | 
						|
Using the gecko logging system, unencrypted, mangled, partial, RTP-packets can
 | 
						|
be written out. This may be a good avenue of investigation for packet loss and
 | 
						|
recovery, simulcast, and feedback. Because the entirety of the packet is not
 | 
						|
guaranteed to be logged, this is less suitable for debugging issues with
 | 
						|
encoded media. These logged packets can be converted to PCAP files, which can
 | 
						|
then be explored in `Wireshark <https://www.wireshark.org/>`__. The logs
 | 
						|
produced by this module can be quite large, making it easy to identify by file
 | 
						|
size which child process log files contain packet dumps.
 | 
						|
 | 
						|
To start RTP logging, one must enable the :code:`RtpLogger` log module. The :code:`sync`
 | 
						|
option should also be used, as it prevents undesirable interleaving of log
 | 
						|
messages. Here are the minimal log settings needed:
 | 
						|
 | 
						|
.. code:: sh
 | 
						|
 | 
						|
   MOZ_LOG='sync,RtpLogger:5'
 | 
						|
 | 
						|
In order to interpret the packet contents, one needs to refer to the SDP.
 | 
						|
Wireshark is unaware of the negotiated details, so it can not directly decode
 | 
						|
the media, nor can it decode the header extensions. The SDP can also be logged,
 | 
						|
and so the following is a more useful set of log settings:
 | 
						|
 | 
						|
.. code:: sh
 | 
						|
 | 
						|
   MOZ_LOG='sync,RtpLogger:5,jsep:5'
 | 
						|
 | 
						|
.. note::
 | 
						|
 | 
						|
   On macOS it is simple to install Wireshark and text2pcap with Homebrew:
 | 
						|
 | 
						|
   .. code:: sh
 | 
						|
 | 
						|
      # Use only one of the following:
 | 
						|
      # ==============================
 | 
						|
 | 
						|
      # To install the Wireshark GUI application and the command line utilities:
 | 
						|
      brew install --cask wireshark
 | 
						|
 | 
						|
      # To install only the command line utilities:
 | 
						|
      brew install wireshark
 | 
						|
 | 
						|
One can use :code:`tee` to capture log output
 | 
						|
from a copy of Firefox launched from the command line, e.g. through
 | 
						|
:code:`mach`. Alternatively, one can set a log file through the environment
 | 
						|
variable :code:`MOZ_LOG_FILE` or through about:logging.
 | 
						|
 | 
						|
.. warning::
 | 
						|
 | 
						|
   If log files are not being created by child processes, this is likely due
 | 
						|
   to sandboxing of content processes. To work around this one must either
 | 
						|
   select a location within the sandbox, disable the content sandbox, or launch
 | 
						|
   Firefox from the command line, e.g. from a Firefox dev environment:
 | 
						|
 | 
						|
   .. code::
 | 
						|
 | 
						|
      MOZ_LOG=sync,RtpLogger:5,jsep:5 MOZ_LOG_FILE= ./mach run 2>&1 | tee your.log
 | 
						|
 | 
						|
 | 
						|
To produce a PCAP file one needs to filter the logs to include only the
 | 
						|
RtpLogger log lines, reduce them down to the expected ingestion format for
 | 
						|
text2pcap, and finally to invoke text2pcap.
 | 
						|
 | 
						|
.. code:: sh
 | 
						|
 | 
						|
   cat your.log  | rg 'RtpLogger.*RTC?P_PACKET|>>\s(?P<packet>.+$)' --only-matching  --replace '$packet' | text2pcap -D -n -l 1 -i 17 -u 1234,1235 -t '%H:%M:%S.' - your.output.pcap
 | 
						|
 | 
						|
.. note::
 | 
						|
 | 
						|
   If :code:`rg`, a.k.a ripgrep, is not already available, one can install it via one of the following methods:
 | 
						|
 | 
						|
   .. code:: sh
 | 
						|
 | 
						|
      # Install through cargo on macOS, Linux, or Windows
 | 
						|
      cargo install ripgrep
 | 
						|
 | 
						|
      # Install via Homebrew on macOS
 | 
						|
      brew install ripgrep
 | 
						|
 | 
						|
      # ripgrep packages may be available through the package manager for your
 | 
						|
      # Linux distro
 | 
						|
 | 
						|
 | 
						|
The resulting PCAP file can be explored with Wireshark. Currently, one must refer to the SDP in order to interpret the RTP packets.
 | 
						|
 | 
						|
.. code:: sh
 | 
						|
 | 
						|
   # On most Linux distros
 | 
						|
   wireshark -d 'udp.port==1234,rtp' your.output.pcap
 | 
						|
 | 
						|
   # On macOS when installed via Homebrew
 | 
						|
   open /Applications/Wireshark.app --args -d 'udp.port==1234,rtp' your.output.pcap
 | 
						|
 | 
						|
.. _examining-codec_availability-and-capabilities:
 | 
						|
 | 
						|
Examining Codec Availability and Capabilities
 | 
						|
---------------------------------------------
 | 
						|
 | 
						|
When codec negotiation doesn't happen as expected there are several helpful
 | 
						|
locations where one can find information. The SDP offer and answer contain the
 | 
						|
list of codecs that were in the initial offer, and the subset of those codecs
 | 
						|
that were selected in the answer.
 | 
						|
 | 
						|
The easiest way to get this information on  a live call is through
 | 
						|
about:webrtc. Each RTCPeerConnection has its own subsection, that when
 | 
						|
expanded contains an SDP section. There are buttons to display the offer
 | 
						|
and the answer. Depending on which party was the offerer and which was
 | 
						|
the answerer one may have a local offer and a remote answer, or a remote offer
 | 
						|
and a local answer.
 | 
						|
 | 
						|
Firefox chooses which codecs to offer based on availability. Some codecs,
 | 
						|
like Opus or VP8, are always available. Some codecs are available in software
 | 
						|
and some codecs on some platforms are available in hardware. H264 support is
 | 
						|
provided by a third-party, and is automatically downloaded the first time its
 | 
						|
use is requested. This is a process which can take a variable amount of time
 | 
						|
depending on network circumstances.
 | 
						|
 | 
						|
.. note::
 | 
						|
   A list of media codecs with playback support are available in the Media
 | 
						|
   section of `about:support#media <about:support#media>`__ . Not all media
 | 
						|
   codecs present and available to Firefox for playback are supported in WebRTC
 | 
						|
   calls.
 | 
						|
 | 
						|
To check the current factors, including preferences, that are being used to
 | 
						|
calculate availability beyond codec presence, one can check the `Media Context`
 | 
						|
section of about:webrtc.
 | 
						|
 | 
						|
.. figure:: img/about_webrtc_media_context.png
 | 
						|
   :alt: example about:webrtc media context values
 | 
						|
 | 
						|
.. _running-webrtc-tests:
 | 
						|
 | 
						|
For an in-depth reference covering the codecs available through WebRTC please
 | 
						|
see the MDN Page: `Codecs Used by WebRTC <https://developer.mozilla.org/en-US/docs/Web/Media/Formats/WebRTC_codecs>`__.
 | 
						|
 | 
						|
Running WebRTC Tests
 | 
						|
--------------------
 | 
						|
 | 
						|
There are a variety of tests providing coverage over WebRTC related code. The
 | 
						|
Web Platform Suite provides conformance tests for browsers. The
 | 
						|
:code:`gtest` suite is composed of unit tests. Crashtests are a type of
 | 
						|
regression test which are written to induce crashes. There are fuzzing tests
 | 
						|
which exercise APIs in ways that the authors did not foresee. All of the WebRTC
 | 
						|
tests can be run locally with :code:`mach` or in CI on `Try`. There is a
 | 
						|
detailed overview of all available test types including those not exercised by
 | 
						|
WebRTC code `here </testing/automated-testing/index.html#functional-testing>`__.
 | 
						|
 | 
						|
.. note::
 | 
						|
   Running :code:`./mach <verb> --help` is an indispensable tool for discovering
 | 
						|
   options that can streamline your testing process.
 | 
						|
 | 
						|
.. note::
 | 
						|
   A test suite on `Try` maybe an aggregate of multiple logical test suites.
 | 
						|
   For example, the `mochitest-media` suite on try includes both the WebRTC and
 | 
						|
   playback mochitests.
 | 
						|
 | 
						|
.. warning::
 | 
						|
   WebRTC calls make use of a number of internal timers. Amongst the
 | 
						|
   behaviors these timers control are transport selection, bandwidth estimation,
 | 
						|
   packet loss determination, media adaptation, lip sync, connection timeout,
 | 
						|
   and more. There are `Try` targets which are too slow to reliably run a
 | 
						|
   number of the tests. Before running a specific test on `Try` for the first
 | 
						|
   time, it may be best to check the relevant test suite manifest. This can be
 | 
						|
   done easily with Searchfox.org by searching for and viewing a test file. If
 | 
						|
   that test has been disabled on one or more platforms the details will appear
 | 
						|
   as shown below:
 | 
						|
 | 
						|
   .. figure:: img/searchfox_test_disabled_warning.png
 | 
						|
      :alt: Searchfox.org warning that the displayed test file has been disabled on Android
 | 
						|
 | 
						|
.. _test-atlas:
 | 
						|
 | 
						|
Test Atlas
 | 
						|
----------
 | 
						|
 | 
						|
.. list-table:: WebRTC Test Locations
 | 
						|
   :widths: 10 10 20 10 10
 | 
						|
   :header-rows: 1
 | 
						|
 | 
						|
   * - Component
 | 
						|
     - Test type
 | 
						|
     - Test file location
 | 
						|
     - Try suite
 | 
						|
     - Treeherder Abbreviations
 | 
						|
   * - WebRTC
 | 
						|
     - Mochitest
 | 
						|
     - dom/media/webrtc/mochitests
 | 
						|
     - mochitest-media
 | 
						|
     - :code:`mda`, :code:`M(mda)`
 | 
						|
   * -
 | 
						|
     - Web Platform Test
 | 
						|
     - testing/web-platform/tests/webrtc
 | 
						|
     - wpt
 | 
						|
     - :code:`wpt`, :code:`W(wpt)`
 | 
						|
   * -
 | 
						|
     - Crashtest
 | 
						|
     - dom/media/webrtc/tests/crashtests
 | 
						|
     - crash
 | 
						|
     - :code:`R(C)`
 | 
						|
   * - WebRTC Signalling
 | 
						|
     - GTest
 | 
						|
     - media/webrtc/signaling/gtest
 | 
						|
     - gtest
 | 
						|
     - :code:`gtest`
 | 
						|
   * - WebRTC (gUM / gDDM)
 | 
						|
     - Browser Chrome Test (mochitest)
 | 
						|
     - browser/base/content/test/webrtc
 | 
						|
     - browser-chrome
 | 
						|
     - :code:`bc`, :code:`M(bc)`
 | 
						|
   * - WebRTC Transport
 | 
						|
     - CPPUnit
 | 
						|
     - dom/media/webrtc/transport/test
 | 
						|
     - cppunit
 | 
						|
     -
 | 
						|
   * -
 | 
						|
     - fuzztest
 | 
						|
     - dom/media/webrtc/transport/fuzztest
 | 
						|
     - fuzzing
 | 
						|
     -
 | 
						|
   * - SDP parser
 | 
						|
     - Fuzzing
 | 
						|
     - dom/media/webrtc/tests/fuzztests
 | 
						|
     - fuzzing
 | 
						|
     -
 | 
						|
 | 
						|
.. _webrtc-web-platform-tests:
 | 
						|
 | 
						|
Web Platform Tests
 | 
						|
~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
The WPT suite comprises conformance tests for various W3C specs such as: CSS,
 | 
						|
JS APIs, and HTML. WebRTC is a JS API and as such its tests are of the `testharness.js <https://web-platform-tests.org/writing-tests/testharness.html>`__ type.
 | 
						|
There is detailed :code:`WPT` documentation available `here </web-platform/index.html#web-platform-tests>`__
 | 
						|
Web Platform Tests can be run locally from
 | 
						|
 | 
						|
.. code:: bash
 | 
						|
 | 
						|
   # Run the entire WebRTC WPT test suite
 | 
						|
   ./mach wpt testing/web-platform/tests/webrtc
 | 
						|
 | 
						|
   # Run a single test, e.g. RTCPeerConnection-createAnswer.html
 | 
						|
   ./mach wpt testing/web-platform/tests/webrtc/RTCPeerConnection-createAnswer.html
 | 
						|
 | 
						|
   # Run all of the PeerConnection tests, i.e. RTCPeerConnection-*.html
 | 
						|
   # NOTE that the `mach` verb in use is `test` not `wpt`
 | 
						|
   ./mach test testing/web-platform/tests/webrtc/RTCPeerConnection
 | 
						|
 | 
						|
.. warning::
 | 
						|
   Running the :code:`WPT` tests locally can be very disruptive to one's working
 | 
						|
   desktop environment, as windows will frequently appear and grab focus. Using
 | 
						|
   :code:`mach`'s :code:`--headless` flag will prevent this, and can be a great
 | 
						|
   way to run them if one's problem can be evaluated from command line output.
 | 
						|
 | 
						|
These tests are synced from the main `Web Platform Test
 | 
						|
repository <https://github.com/web-platform-tests/wpt>`__, and likewise
 | 
						|
our changes are synced from our `in-tree
 | 
						|
copy <https://searchfox.org/mozilla-central/search?q=&path=testing%2Fweb-platform%2Ftests%2Fwebrtc&case=false®exp=false>`__
 | 
						|
back to that repository.
 | 
						|
 | 
						|
.. warning::
 | 
						|
   Running the WebRTC mochitests in `Try` is done using the entire Web Platform Test suite, :code:`wpt`.
 | 
						|
   As such, this can be slow.
 | 
						|
 | 
						|
.. code:: bash
 | 
						|
 | 
						|
   ./mach try fuzzy --query 'wpt'
 | 
						|
 | 
						|
One can `run those same tests in
 | 
						|
Chromium <https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/testing/web_platform_tests_wptrunner.md>`__,
 | 
						|
Safari, or Servo if one needs to compare behavior between browsers. This can be
 | 
						|
done directly through :code:`mach`, see `running tests in other browsers </web-platform/index.html#running-tests-in-other-browsers>`__
 | 
						|
for more details.
 | 
						|
 | 
						|
.. _mochitests:
 | 
						|
 | 
						|
Mochitests
 | 
						|
~~~~~~~~~~
 | 
						|
 | 
						|
The WebRTC mochitests are integration tests, regression tests, and sanity
 | 
						|
tests. The needs of these tests did not align with specification conformance
 | 
						|
testing in the WPT, Web Platform Test, suite. Before writing a new mochitest,
 | 
						|
one should consider if a test would be better expressed as a WPT, which all browsers
 | 
						|
can test against.
 | 
						|
 | 
						|
Locally running the WebRTC mochitests should be done in a Firefox dev
 | 
						|
environment using :code:`mach` as follows:
 | 
						|
 | 
						|
.. code:: bash
 | 
						|
 | 
						|
   # Run the whole suite
 | 
						|
   ./mach mochitest dom/media/webrtc/tests/mochitests
 | 
						|
 | 
						|
   # Run a single test, e.g. test_peerConnection_basicAudioVideo.html
 | 
						|
   ./mach mochitest dom/media/webrtc/tests/mochitests/test_peerConnection_basicAudioVideo.html
 | 
						|
   # Or
 | 
						|
   ./mach mochitest test_peerConnection_basicAudioVideo.html
 | 
						|
 | 
						|
   # Run all of the PeerConnection tests, i.e. test_peerConnection_*.html
 | 
						|
   ./mach mochitest test_peerConnection
 | 
						|
 | 
						|
 | 
						|
On :code:`try`, WebRTC mochitests are part of the larger media test suite.
 | 
						|
This suite can be easily selected with the following fuzzy query:
 | 
						|
 | 
						|
.. code:: bash
 | 
						|
 | 
						|
   # Run the media mochitest suite on all regular platforms
 | 
						|
   ./mach try fuzzy --query 'mochitest-media'
 | 
						|
 | 
						|
   # Run the media mochitest suite only on Linux which will resolve far faster
 | 
						|
   ./mach try fuzzy --query 'linux mochitest-media'
 | 
						|
 | 
						|
 | 
						|
.. _gtests:
 | 
						|
 | 
						|
GTests
 | 
						|
~~~~~~
 | 
						|
 | 
						|
The gtests are all compiled into a single library target: :code:`xul-test`.
 | 
						|
This makes running gtests from :code:`mach` slightly different than the other
 | 
						|
test types.
 | 
						|
 | 
						|
.. code:: bash
 | 
						|
 | 
						|
   # Run a single test by using Prefix.TestName, e.g. JsepSessionTest.FullCall
 | 
						|
   # https://searchfox.org/mozilla-central/rev/4d6a5b97428760d15bfcad13f8fc81439370a7ec/media/webrtc/signaling/gtest/jsep_session_unittest.cpp#1551
 | 
						|
   ./mach gtest 'JsepSessionTest.FullCall'
 | 
						|
 | 
						|
   # Run all the tests in a single Prefix, e.g. JsepSessionTest
 | 
						|
   ./mach gtest 'JsepSessiontTest.*'
 | 
						|
 | 
						|
   # Run all tests which have a Prefix.TestName containing the substring 'Jsep'
 | 
						|
   # See the table of selectors below
 | 
						|
   ./mach gtest '*Jsep*'
 | 
						|
 | 
						|
   # Run all the gtests for Firefox
 | 
						|
   ./mach gtest
 | 
						|
 | 
						|
Here is a list of helpful substring selectors for executing specific WebRTC gtests:
 | 
						|
 | 
						|
.. list-table:: WebRTC GTest Selectors
 | 
						|
   :header-rows: 1
 | 
						|
 | 
						|
   * - Selector
 | 
						|
     - Description
 | 
						|
     - Files
 | 
						|
   * - :code:`*Jsep*`
 | 
						|
     - JSEP (signalling) tests
 | 
						|
     - `jsep_session_unittest.cpp <https://searchfox.org/mozilla-central/source/media/webrtc/signaling/gtest/jsep_session_unittest.cpp>`__
 | 
						|
       `jsep_trak_unittest.cpp <https://searchfox.org/mozilla-central/source/media/webrtc/signaling/gtest/jsep_track_unittest.cpp>`__
 | 
						|
   * - :code:`*Sdp*`
 | 
						|
     - SDP parsing tests
 | 
						|
     - `sdp_unittests.cpp <https://searchfox.org/mozilla-central/source/media/webrtc/signaling/gtest/sdp_unittests.cpp>`__
 | 
						|
   * - :code:`*MediaPipeline*`
 | 
						|
     - MediaPipline and MediaPipeline filter tests for RTP media handling
 | 
						|
     - `mediapipeline_unittest.cpp <https://searchfox.org/mozilla-central/source/media/webrtc/signaling/gtest/mediapipeline_unittest.cpp>`__
 | 
						|
   * - :code:`*AudioConduit*`
 | 
						|
     - AudioConduit tests for libwebrtc glue for RTP audio media
 | 
						|
     - `audioconduit_unittests.cpp <https://searchfox.org/mozilla-central/source/media/webrtc/signaling/gtest/audioconduit_unittests.cpp>`__
 | 
						|
   * - :code:`*VideoConduit*`
 | 
						|
     - VideoConduit tests for libwebrtc glue for RTP video media
 | 
						|
     - `videoconduit_unittests.cpp <https://searchfox.org/mozilla-central/source/media/webrtc/signaling/gtest/videoconduit_unittests.cpp>`__
 | 
						|
 | 
						|
For more general information about gtests see the documentation `here </gtest/index.html>`__.
 | 
						|
 | 
						|
Fuzz Testing
 | 
						|
~~~~~~~~~~~~
 | 
						|
 | 
						|
It is not common to need to run fuzz testing as it is run on a semi-continuous
 | 
						|
fashion in CI. It is more likely that one will need to respond to a bug filed
 | 
						|
by a fuzzing bot. If one is interested in fuzzing one should consult the
 | 
						|
excellent documentation available `here </tools/fuzzing/index.html>`__.
 | 
						|
 | 
						|
.. _code-atlas:
 | 
						|
 | 
						|
Code Atlas
 | 
						|
----------
 | 
						|
 | 
						|
There are a number of components that work together to create a successful
 | 
						|
WebRTC call. When debugging a call it can be difficult to see the larger puzzle
 | 
						|
for all the pieces. A listing of the WebRTC related source code directories is
 | 
						|
provided below to help one navigate.
 | 
						|
 | 
						|
.. list-table:: WebRTC Code Atlas
 | 
						|
   :header-rows: 1
 | 
						|
 | 
						|
   * - Directory
 | 
						|
     - Component
 | 
						|
     - Description
 | 
						|
     - Notes
 | 
						|
   * - `dom/media/webrtc <https://searchfox.org/mozilla-central/source/dom/media/webrtc>`__
 | 
						|
     - WebRTC
 | 
						|
     - This is the primary directory for Firefox WebRTC code
 | 
						|
     -
 | 
						|
   * - `dom/media/webrtc/common <https://searchfox.org/mozilla-central/source/dom/media/webrtc/common>`__
 | 
						|
     - WebRTC
 | 
						|
     - This contains WebRTC related utility code
 | 
						|
     -
 | 
						|
   * - `dom/media/webrtc/jsapi <https://searchfox.org/mozilla-central/source/dom/media/webrtc/jsapi>`__
 | 
						|
     - JS API
 | 
						|
     - This contains the C++ implementations of the JavaScript WebRTC interfaces
 | 
						|
     -
 | 
						|
   * - `dom/media/webrtc/jsep <https://searchfox.org/mozilla-central/source/dom/media/webrtc/jsep>`__
 | 
						|
     - Signalling
 | 
						|
     - This is the JSEP state engine implementation
 | 
						|
     -
 | 
						|
   * - `media/webrtc/libwebrtcglue <https://searchfox.org/mozilla-central/source/dom/media/webrtc/libwebrtcglue>`__
 | 
						|
     - WebRTC (various)
 | 
						|
     - This is the glue code between libwebrtc and Firefox
 | 
						|
     -
 | 
						|
   * - `dom/media/webrtc/sdp <https://searchfox.org/mozilla-central/source/dom/media/webrtc/sdp>`__
 | 
						|
     - Signalling
 | 
						|
     - This contains the SDP parsing interface
 | 
						|
     -
 | 
						|
   * - `dom/media/webrtc/tests <https://searchfox.org/mozilla-central/source/dom/media/webrtc/tests>`__
 | 
						|
     - Tests
 | 
						|
     - This contains `some` of the WebRTC related tests
 | 
						|
     -
 | 
						|
   * - `dom/media/webrtc/third_party_build <https://searchfox.org/mozilla-central/source/dom/media/webrtc/third_party_build>`__
 | 
						|
     - Build
 | 
						|
     - The scripting and configuration for vendoring new versions of libwebrtc are here
 | 
						|
     - This is unlikely to be of concern for debugging
 | 
						|
   * - `dom/media/webrtc/transport <https://searchfox.org/mozilla-central/source/dom/media/webrtc/transport>`__
 | 
						|
     - Network
 | 
						|
     - This contains the ICE implementation, the MDNS implementation, and transport code
 | 
						|
     -
 | 
						|
   * - `dom/media/webrtc/transportbridge <https://searchfox.org/mozilla-central/source/dom/media/webrtc/transportbridge>`__
 | 
						|
     - WebRTC
 | 
						|
     - This contains the MediaPipeline and MediaPipeline filter code which is glue between transport and the libwebrtc RTP stack
 | 
						|
     -
 | 
						|
   * - `third_party/libsrtp <https://searchfox.org/mozilla-central/source/third_party/libsrtp>`__
 | 
						|
     - Network
 | 
						|
     - This is the SRTP implementation used by Firefox
 | 
						|
     -
 | 
						|
   * - `third_party/libwebrtc <https://searchfox.org/mozilla-central/source/third_party/libwebrtc>`__
 | 
						|
     - WebRTC (various)
 | 
						|
     - libwebrtc handles many aspects of WebRTC calls above the transport layer and below the presentation layer
 | 
						|
     -
 | 
						|
   * - `third_party/rust/webrtc-sdp <https://searchfox.org/mozilla-central/source/third_party/rust/webrtc-sdp>`__
 | 
						|
     - Signalling
 | 
						|
     - webrtc-sdp is a Rust implementation of a WebRTC-only SDP parser
 | 
						|
     -
 | 
						|
   * - `third_party/sipcc <https://searchfox.org/mozilla-central/source/third_party/sipcc>`__
 | 
						|
     - Signalling
 | 
						|
     - sipcc is a C implementation of a general SDP parser
 | 
						|
     - this carries many local modifications
 | 
						|
   * - `dom/media <https://searchfox.org/mozilla-central/source/dom/media>`__
 | 
						|
     - Media Capture
 | 
						|
     - GetUserMedia and related classes are here
 | 
						|
     - There are many other unrelated media source files here
 | 
						|
   * - `dom/webidl <https://searchfox.org/mozilla-central/source/dom/webidl>`__
 | 
						|
     - WebIDL (JS API)
 | 
						|
     - This contains the WebIDL definitions for the WebRTC JS API amongst many other WebIDL definitions
 | 
						|
     -  :code:`RTC*.webidl`
 | 
						|
 | 
						|
.. _standards-documentation:
 | 
						|
 | 
						|
Standards Documentation
 | 
						|
-----------------------
 | 
						|
 | 
						|
When debugging API behavior it may be necessary to consult the specifications
 | 
						|
for WebRTC. The ECMAScript API is defined in several W3C standards,
 | 
						|
`webrtc-pc <https://www.w3.org/TR/webrtc/>`__, and
 | 
						|
`webrtc-stats <https://www.w3.org/TR/webrtc-stats/>`__. The number of IETF
 | 
						|
standards that are incorporated into WebRTC are too numerous to list here. One
 | 
						|
can find these standards in the
 | 
						|
`Normative References <https://www.w3.org/TR/webrtc/#normative-references>`__
 | 
						|
section of the :code:`webrtc-pc` spec.
 | 
						|
 | 
						|
.. _delay-calculation:
 | 
						|
 | 
						|
Appendix: Delay Calculation
 | 
						|
---------------------------
 | 
						|
 | 
						|
For all intents and purposes jitter and RTT are
 | 
						|
additive in nature. If there was 25ms of jitter reported and a RTT of
 | 
						|
272ms, one could estimate the expected delay from transmission at the
 | 
						|
send side to play out on receive side to be
 | 
						|
 | 
						|
::
 | 
						|
 | 
						|
   25ms + (272ms / 2) = 161ms
 |