Blame docs/plugins/html/gst-plugins-good-plugins-rtprtxreceive.html

Packit 1f69a5
Packit 1f69a5
<html>
Packit 1f69a5
<head>
Packit 1f69a5
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
Packit 1f69a5
<title>rtprtxreceive: GStreamer Good Plugins 1.0 Plugins Reference Manual</title>
Packit 1f69a5
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
Packit 1f69a5
<link rel="home" href="index.html" title="GStreamer Good Plugins 1.0 Plugins Reference Manual">
Packit 1f69a5
<link rel="up" href="ch01.html" title="gst-plugins-good Elements">
Packit 1f69a5
<link rel="prev" href="gst-plugins-good-plugins-rtprtxqueue.html" title="rtprtxqueue">
Packit 1f69a5
<link rel="next" href="gst-plugins-good-plugins-rtprtxsend.html" title="rtprtxsend">
Packit 1f69a5
<meta name="generator" content="GTK-Doc V1.27 (XML mode)">
Packit 1f69a5
<link rel="stylesheet" href="style.css" type="text/css">
Packit 1f69a5
</head>
Packit 1f69a5
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Top  | 
Packit 1f69a5
                  Description  | 
Packit 1f69a5
                  Object Hierarchy  | 
Packit 1f69a5
                  Properties
Packit 1f69a5
Packit 1f69a5
Home
Packit 1f69a5
Up
Packit 1f69a5
Prev
Packit 1f69a5
Next
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

rtprtxreceive

Packit 1f69a5

rtprtxreceive

Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

Properties

Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
guint
Packit 1f69a5
num-rtx-requests
Packit 1f69a5
Read
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
guint
Packit 1f69a5
num-rtx-packets
Packit 1f69a5
Read
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
guint
Packit 1f69a5
num-rtx-assoc-packets
Packit 1f69a5
Read
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
GstStructure *
Packit 1f69a5
payload-type-map
Packit 1f69a5
Read / Write
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

Types and Values

Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
struct
Packit 1f69a5
GstRtpRtxReceive
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

Object Hierarchy

Packit 1f69a5
    GObject
Packit 1f69a5
    ╰── GInitiallyUnowned
Packit 1f69a5
        ╰── GstObject
Packit 1f69a5
            ╰── GstElement
Packit 1f69a5
                ╰── GstRtpRtxReceive
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

Description

Packit 1f69a5

rtprtxreceive listens to the retransmission events from the

Packit 1f69a5
downstream rtpjitterbuffer and remembers the SSRC (ssrc1) of the stream and
Packit 1f69a5
the sequence number that was requested. When it receives a packet with
Packit 1f69a5
a sequence number equal to one of the ones stored and with a different SSRC,
Packit 1f69a5
it identifies the new SSRC (ssrc2) as the retransmission stream of ssrc1.
Packit 1f69a5
From this point on, it replaces ssrc2 with ssrc1 in all packets of the
Packit 1f69a5
ssrc2 stream and flags them as retransmissions, so that rtpjitterbuffer
Packit 1f69a5
can reconstruct the original stream.

Packit 1f69a5

This algorithm is implemented as specified in RFC 4588.

Packit 1f69a5

This element is meant to be used with rtprtxsend on the sender side.

Packit 1f69a5
See GstRtpRtxSend

Packit 1f69a5

Below you can see some examples that illustrate how rtprtxreceive and

Packit 1f69a5
rtprtxsend fit among the other rtp elements and how they work internally.
Packit 1f69a5
Normally, hoewever, you should avoid using such pipelines and use
Packit 1f69a5
rtpbin instead, with its “request-aux-sender” and
Packit 1f69a5
“request-aux-receiver” signals. See GstRtpBin.

Packit 1f69a5
Packit 1f69a5

Example pipelines

Packit 1f69a5
Packit 1f69a5
  
Packit 1f69a5
    
Packit 1f69a5
      
Packit 1f69a5
        
1
Packit 1f69a5
2
Packit 1f69a5
3
Packit 1f69a5
4
Packit 1f69a5
5
Packit 1f69a5
6
Packit 1f69a5
7
Packit 1f69a5
8
Packit 1f69a5
9
Packit 1f69a5
        
gst-launch-1.0 rtpsession name=rtpsession rtp-profile=avpf \
Packit 1f69a5
    audiotestsrc is-live=true ! opusenc ! rtpopuspay pt=96 ! \
Packit 1f69a5
        rtprtxsend payload-type-map="application/x-rtp-pt-map,96=(uint)97" ! \
Packit 1f69a5
        rtpsession.send_rtp_sink \
Packit 1f69a5
    rtpsession.send_rtp_src ! identity drop-probability=0.01 ! \
Packit 1f69a5
        udpsink host="127.0.0.1" port=5000 \
Packit 1f69a5
    udpsrc port=5001 ! rtpsession.recv_rtcp_sink \
Packit 1f69a5
    rtpsession.send_rtcp_src ! udpsink host="127.0.0.1" port=5002 \
Packit 1f69a5
        sync=false async=false
Packit 1f69a5
      
Packit 1f69a5
    
Packit 1f69a5
  
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

Send audio stream through port 5000 (5001 and 5002 are just the rtcp

Packit 1f69a5
link with the receiver)

Packit 1f69a5
Packit 1f69a5
  
Packit 1f69a5
    
Packit 1f69a5
      
Packit 1f69a5
        
1
Packit 1f69a5
2
Packit 1f69a5
3
Packit 1f69a5
4
Packit 1f69a5
5
Packit 1f69a5
6
Packit 1f69a5
7
Packit 1f69a5
8
Packit 1f69a5
9
Packit 1f69a5
10
Packit 1f69a5
        
gst-launch-1.0 rtpsession name=rtpsession rtp-profile=avpf \
Packit 1f69a5
    udpsrc port=5000 caps="application/x-rtp,media=(string)audio,clock-rate=(int)48000,encoding-name=(string)OPUS,payload=(int)96" ! \
Packit 1f69a5
        rtpsession.recv_rtp_sink \
Packit 1f69a5
    rtpsession.recv_rtp_src ! \
Packit 1f69a5
        rtprtxreceive payload-type-map="application/x-rtp-pt-map,96=(uint)97" ! \
Packit 1f69a5
        rtpssrcdemux ! rtpjitterbuffer do-retransmission=true ! \
Packit 1f69a5
        rtpopusdepay ! opusdec ! audioconvert ! audioresample ! autoaudiosink \
Packit 1f69a5
    rtpsession.send_rtcp_src ! \
Packit 1f69a5
        udpsink host="127.0.0.1" port=5001 sync=false async=false \
Packit 1f69a5
    udpsrc port=5002 ! rtpsession.recv_rtcp_sink
Packit 1f69a5
      
Packit 1f69a5
    
Packit 1f69a5
  
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

Receive audio stream from port 5000 (5001 and 5002 are just the rtcp

Packit 1f69a5
link with the sender)

Packit 1f69a5

In this example we can see a simple streaming of an OPUS stream with some

Packit 1f69a5
of the packets being artificially dropped by the identity element.
Packit 1f69a5
Thanks to retransmission, you should still hear a clear sound when setting
Packit 1f69a5
drop-probability to something greater than 0.

Packit 1f69a5

Internally, the rtpjitterbuffer will generate a custom upstream event,

Packit 1f69a5
GstRTPRetransmissionRequest, when it detects that one packet is missing.
Packit 1f69a5
Then this request is translated to a FB NACK in the rtcp link by rtpsession.
Packit 1f69a5
Finally the rtpsession of the sender side will re-convert it in a
Packit 1f69a5
GstRTPRetransmissionRequest that will be handled by rtprtxsend. rtprtxsend
Packit 1f69a5
will then re-send the missing packet with a new srrc and a different payload
Packit 1f69a5
type (here, 97), but with the same original sequence number. On the receiver
Packit 1f69a5
side, rtprtxreceive will associate this new stream with the original and
Packit 1f69a5
forward the retransmission packets to rtpjitterbuffer with the original
Packit 1f69a5
ssrc and payload type.

Packit 1f69a5
Packit 1f69a5
  
Packit 1f69a5
    
Packit 1f69a5
      
Packit 1f69a5
        
1
Packit 1f69a5
2
Packit 1f69a5
3
Packit 1f69a5
4
Packit 1f69a5
5
Packit 1f69a5
6
Packit 1f69a5
7
Packit 1f69a5
8
Packit 1f69a5
9
Packit 1f69a5
10
Packit 1f69a5
11
Packit 1f69a5
12
Packit 1f69a5
13
Packit 1f69a5
        
gst-launch-1.0 rtpsession name=rtpsession rtp-profile=avpf \
Packit 1f69a5
    audiotestsrc is-live=true ! opusenc ! rtpopuspay pt=97 seqnum-offset=1 ! \
Packit 1f69a5
        rtprtxsend payload-type-map="application/x-rtp-pt-map,97=(uint)99" ! \
Packit 1f69a5
        funnel name=f ! rtpsession.send_rtp_sink \
Packit 1f69a5
    audiotestsrc freq=660.0 is-live=true ! opusenc ! \
Packit 1f69a5
        rtpopuspay pt=97 seqnum-offset=100 ! \
Packit 1f69a5
        rtprtxsend payload-type-map="application/x-rtp-pt-map,97=(uint)99" ! \
Packit 1f69a5
        f. \
Packit 1f69a5
    rtpsession.send_rtp_src ! identity drop-probability=0.01 ! \
Packit 1f69a5
        udpsink host="127.0.0.1" port=5000 \
Packit 1f69a5
    udpsrc port=5001 ! rtpsession.recv_rtcp_sink \
Packit 1f69a5
    rtpsession.send_rtcp_src ! udpsink host="127.0.0.1" port=5002 \
Packit 1f69a5
        sync=false async=false
Packit 1f69a5
      
Packit 1f69a5
    
Packit 1f69a5
  
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

Send two audio streams to port 5000.

Packit 1f69a5
Packit 1f69a5
  
Packit 1f69a5
    
Packit 1f69a5
      
Packit 1f69a5
        
1
Packit 1f69a5
2
Packit 1f69a5
3
Packit 1f69a5
4
Packit 1f69a5
5
Packit 1f69a5
6
Packit 1f69a5
7
Packit 1f69a5
8
Packit 1f69a5
9
Packit 1f69a5
10
Packit 1f69a5
11
Packit 1f69a5
12
Packit 1f69a5
13
Packit 1f69a5
        
gst-launch-1.0 rtpsession name=rtpsession rtp-profile=avpf \
Packit 1f69a5
    udpsrc port=5000 caps="application/x-rtp,media=(string)audio,clock-rate=(int)48000,encoding-name=(string)OPUS,payload=(int)97" ! \
Packit 1f69a5
        rtpsession.recv_rtp_sink \
Packit 1f69a5
    rtpsession.recv_rtp_src ! \
Packit 1f69a5
        rtprtxreceive payload-type-map="application/x-rtp-pt-map,97=(uint)99" ! \
Packit 1f69a5
        rtpssrcdemux name=demux \
Packit 1f69a5
    demux. ! queue ! rtpjitterbuffer do-retransmission=true ! rtpopusdepay ! \
Packit 1f69a5
        opusdec ! audioconvert ! autoaudiosink \
Packit 1f69a5
    demux. ! queue ! rtpjitterbuffer do-retransmission=true ! rtpopusdepay ! \
Packit 1f69a5
        opusdec ! audioconvert ! autoaudiosink \
Packit 1f69a5
    udpsrc port=5002 ! rtpsession.recv_rtcp_sink \
Packit 1f69a5
    rtpsession.send_rtcp_src ! udpsink host="127.0.0.1" port=5001 \
Packit 1f69a5
        sync=false async=false
Packit 1f69a5
      
Packit 1f69a5
    
Packit 1f69a5
  
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

Receive two audio streams from port 5000.

Packit 1f69a5

In this example we are streaming two streams of the same type through the

Packit 1f69a5
same port. They, however, are using a different SSRC (ssrc is randomly
Packit 1f69a5
generated on each payloader - rtpopuspay in this example), so they can be
Packit 1f69a5
identified and demultiplexed by rtpssrcdemux on the receiver side. This is
Packit 1f69a5
an example of SSRC-multiplexing.

Packit 1f69a5

It is important here to use a different starting sequence number

Packit 1f69a5
(seqnum-offset), since this is the only means of identification that
Packit 1f69a5
rtprtxreceive uses the very first time to identify retransmission streams.
Packit 1f69a5
It is an error, according to RFC4588 to have two retransmission requests for
Packit 1f69a5
packets belonging to two different streams but with the same sequence number.
Packit 1f69a5
Note that the default seqnum-offset value (-1, which means random) would
Packit 1f69a5
work just fine, but it is overriden here for illustration purposes.

Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

Synopsis

Packit 1f69a5
Packit 1f69a5

Element Information

Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

plugin

Packit 1f69a5
Packit 1f69a5
            rtpmanager
Packit 1f69a5
          
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

author

Packit 1f69a5
Julien Isorce <julien.isorce@collabora.co.uk>
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

class

Packit 1f69a5
Codec
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

Packit 1f69a5
Packit 1f69a5

Element Pads

Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

name

Packit 1f69a5
sink
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

direction

Packit 1f69a5
sink
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

presence

Packit 1f69a5
always
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

details

Packit 1f69a5
application/x-rtp
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

name

Packit 1f69a5
src
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

direction

Packit 1f69a5
source
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

presence

Packit 1f69a5
always
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

details

Packit 1f69a5
application/x-rtp
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

Functions

Packit 1f69a5

Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

Types and Values

Packit 1f69a5
Packit 1f69a5

struct GstRtpRtxReceive

Packit 1f69a5
struct GstRtpRtxReceive;
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

Property Details

Packit 1f69a5
Packit 1f69a5

The “num-rtx-requests” property

Packit 1f69a5
  “num-rtx-requests”         guint
Packit 1f69a5

Number of retransmission events received.

Packit 1f69a5

Flags: Read

Packit 1f69a5

Default value: 0

Packit 1f69a5
Packit 1f69a5

Packit 1f69a5
Packit 1f69a5

The “num-rtx-packets” property

Packit 1f69a5
  “num-rtx-packets”          guint
Packit 1f69a5

Number of retransmission packets received.

Packit 1f69a5

Flags: Read

Packit 1f69a5

Default value: 0

Packit 1f69a5
Packit 1f69a5

Packit 1f69a5
Packit 1f69a5

The “num-rtx-assoc-packets” property

Packit 1f69a5
  “num-rtx-assoc-packets”    guint
Packit 1f69a5

Number of retransmission packets correctly associated with retransmission requests.

Packit 1f69a5

Flags: Read

Packit 1f69a5

Default value: 0

Packit 1f69a5
Packit 1f69a5

Packit 1f69a5
Packit 1f69a5

The “payload-type-map” property

Packit 1f69a5
  “payload-type-map”         GstStructure *
Packit 1f69a5

Map of original payload types to their retransmission payload types.

Packit 1f69a5

Flags: Read / Write

Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

See Also

Packit 1f69a5

rtprtxsend, rtpsession, rtpjitterbuffer

Packit 1f69a5
Packit 1f69a5
Packit 1f69a5
Packit 1f69a5

Generated by GTK-Doc V1.27
Packit 1f69a5
</body>
Packit 1f69a5
</html>