Changeset 832cb393faa2548cbee96df95499f374daf4e8ed

Show
Ignore:
Timestamp:
06/11/08 20:39:51 (3 months ago)
Author:
Rémi Denis-Courmont <rdenis@simphalempin.com>
git-committer:
Rémi Denis-Courmont <rdenis@simphalempin.com> 1213209591 +0300
git-parent:

[e72ecce9ec4febce33d043eb88bed83a32466ed0]

git-author:
Rémi Denis-Courmont <rdenis@simphalempin.com> 1213209581 +0300
Message:

RTP sout: rework sample-based audio codecs to not exceed the MTU

Send as much data as the packetization AND the MTU allow

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • modules/stream_out/rtp.c

    r3561b9b r832cb39  
    813813} 
    814814 
     815/** 
     816 * Shrink the MTU down to a fixed packetization time (for audio). 
     817 */ 
     818static void 
     819rtp_set_ptime (sout_stream_id_t *id, unsigned ptime_ms, size_t bytes) 
     820{ 
     821    /* Samples per second */ 
     822    size_t spl = (id->i_clock_rate - 1) * ptime_ms / 1000 + 1; 
     823    bytes *= id->i_channels; 
     824    spl *= bytes; 
     825 
     826    if (spl < rtp_mtu (id)) /* MTU is big enough for ptime */ 
     827        id->i_mtu = 12 + spl; 
     828    else /* MTU is too small for ptime, align to a sample boundary */ 
     829        id->i_mtu = (id->i_mtu / bytes) * bytes; 
     830} 
    815831 
    816832/** Add an ES as a new RTP stream */ 
     
    969985                id->i_payload_type = 0; 
    970986            id->psz_enc = "PCMU"; 
    971             id->pf_packetize = rtp_packetize_l8; 
     987            id->pf_packetize = rtp_packetize_split; 
     988            rtp_set_ptime (id, 20, 1); 
    972989            break; 
    973990        case VLC_FOURCC( 'a', 'l', 'a', 'w' ): 
     
    975992                id->i_payload_type = 8; 
    976993            id->psz_enc = "PCMA"; 
    977             id->pf_packetize = rtp_packetize_l8; 
     994            id->pf_packetize = rtp_packetize_split; 
     995            rtp_set_ptime (id, 20, 1); 
    978996            break; 
    979997        case VLC_FOURCC( 's', '1', '6', 'b' ): 
     
    9881006            } 
    9891007            id->psz_enc = "L16"; 
    990             id->pf_packetize = rtp_packetize_l16; 
     1008            id->pf_packetize = rtp_packetize_split; 
     1009            rtp_set_ptime (id, 20, 1); 
    9911010            break; 
    9921011        case VLC_FOURCC( 'u', '8', ' ', ' ' ): 
    9931012            id->psz_enc = "L8"; 
    994             id->pf_packetize = rtp_packetize_l8; 
     1013            id->pf_packetize = rtp_packetize_split; 
     1014            rtp_set_ptime (id, 20, 1); 
    9951015            break; 
    9961016        case VLC_FOURCC( 'm', 'p', 'g', 'a' ): 
     
    15161536} 
    15171537 
    1518 /** 
    1519  * @return number of audio samples to include for a given packetization time 
    1520  * (this really only makes sense for audio formats). 
    1521  */ 
    1522 size_t rtp_plen (const sout_stream_id_t * id, unsigned ptime_ms) 
    1523 { 
    1524     return id->i_channels * (((id->i_clock_rate - 1) * ptime_ms / 1000) + 1); 
    1525 } 
    1526  
    1527  
    15281538/***************************************************************************** 
    15291539 * Non-RTP mux 
  • modules/stream_out/rtp.h

    r449fd28 r832cb39  
    4747void rtp_packetize_send (sout_stream_id_t *id, block_t *out); 
    4848size_t rtp_mtu (const sout_stream_id_t *id); 
    49 size_t rtp_plen (const sout_stream_id_t * id, unsigned ptime); 
    5049 
    51 int rtp_packetize_l16  (sout_stream_t *, sout_stream_id_t *, block_t *); 
    52 int rtp_packetize_l8   (sout_stream_t *, sout_stream_id_t *, block_t *); 
    5350int rtp_packetize_mpa  (sout_stream_t *, sout_stream_id_t *, block_t *); 
    5451int rtp_packetize_mpv  (sout_stream_t *, sout_stream_id_t *, block_t *); 
  • modules/stream_out/rtpfmt.c

    r3561b9b r832cb39  
    304304} 
    305305 
    306 int rtp_packetize_l16( sout_stream_t *p_stream, sout_stream_id_t *id, 
    307                        block_t *in ) 
    308 { 
    309     const uint8_t *p_data = in->p_buffer; 
    310     size_t i_data  = in->i_buffer; 
    311     size_t i_plen = 2 * rtp_plen (id, 20); 
    312  
    313     for( unsigned i_packet = 0; i_data > 0; i_packet++ ) 
    314     { 
    315         int           i_payload = __MIN( i_plen, i_data ); 
    316         block_t *out = block_New( p_stream, 12 + i_payload ); 
    317  
    318         /* rtp common header */ 
    319         rtp_packetize_common( id, out, 0, 
    320                               (in->i_pts > 0 ? in->i_pts : in->i_dts) ); 
    321         memcpy( &out->p_buffer[12], p_data, i_payload ); 
    322  
    323         out->i_buffer = 12 + i_payload; 
    324         out->i_dts    = in->i_dts + i_packet * 20000; 
    325         out->i_length = i_payload * 20000 / i_plen; 
    326  
    327         rtp_packetize_send( id, out ); 
    328  
    329         p_data += i_payload; 
    330         i_data -= i_payload; 
    331     } 
    332  
    333     return VLC_SUCCESS; 
    334 } 
    335  
    336 int rtp_packetize_l8( sout_stream_t *p_stream, sout_stream_id_t *id, 
    337                       block_t *in ) 
    338 { 
    339     const uint8_t *p_data = in->p_buffer; 
    340     size_t i_data  = in->i_buffer; 
    341     size_t i_plen = rtp_plen (id, 20); 
    342  
    343     for( unsigned i_packet = 0; i_data > 0; i_packet++ ) 
    344     { 
    345         int           i_payload = __MIN( i_plen, i_data ); 
    346         block_t *out = block_New( p_stream, 12 + i_payload ); 
    347  
    348         /* rtp common header */ 
    349         rtp_packetize_common( id, out, 0, 
    350                               (in->i_pts > 0 ? in->i_pts : in->i_dts) ); 
    351         memcpy( &out->p_buffer[12], p_data, i_payload ); 
    352  
    353         out->i_buffer = 12 + i_payload; 
    354         out->i_dts    = in->i_dts + i_packet * 20000; 
    355         out->i_length = i_payload * 20000 / i_plen; 
    356  
    357         rtp_packetize_send( id, out ); 
    358  
    359         p_data += i_payload; 
    360         i_data -= i_payload; 
    361     } 
    362  
    363     return VLC_SUCCESS; 
    364 } 
    365  
    366306int rtp_packetize_mp4a( sout_stream_t *p_stream, sout_stream_id_t *id, 
    367307                        block_t *in )