1 /*****************************************************************************
2 * rtp.c: rtp stream output module
3 *****************************************************************************
4 * Copyright (C) 2003-2004 the VideoLAN team
5 * Copyright © 2007 Rémi Denis-Courmont
8 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
27 #include <vlc_block.h>
31 int rtp_packetize_mpa( sout_stream_t *p_stream, sout_stream_id_t *id,
34 int i_max = rtp_mtu (id) - 4; /* payload max in one packet */
35 int i_count = ( in->i_buffer + i_max - 1 ) / i_max;
37 uint8_t *p_data = in->p_buffer;
38 int i_data = in->i_buffer;
41 for( i = 0; i < i_count; i++ )
43 int i_payload = __MIN( i_max, i_data );
44 block_t *out = block_New( p_stream, 16 + i_payload );
46 /* rtp common header */
47 rtp_packetize_common( id, out, (i == i_count - 1)?1:0, in->i_pts );
49 out->p_buffer[12] = 0;
50 out->p_buffer[13] = 0;
51 /* fragment offset in the current frame */
52 out->p_buffer[14] = ( (i*i_max) >> 8 )&0xff;
53 out->p_buffer[15] = ( (i*i_max) )&0xff;
54 memcpy( &out->p_buffer[16], p_data, i_payload );
56 out->i_buffer = 16 + i_payload;
57 out->i_dts = in->i_dts + i * in->i_length / i_count;
58 out->i_length = in->i_length / i_count;
60 rtp_packetize_send( id, out );
70 int rtp_packetize_mpv( sout_stream_t *p_stream, sout_stream_id_t *id,
73 int i_max = rtp_mtu (id) - 4; /* payload max in one packet */
74 int i_count = ( in->i_buffer + i_max - 1 ) / i_max;
76 uint8_t *p_data = in->p_buffer;
77 int i_data = in->i_buffer;
79 int b_sequence_start = 0;
80 int i_temporal_ref = 0;
81 int i_picture_coding_type = 0;
82 int i_fbv = 0, i_bfc = 0, i_ffv = 0, i_ffc = 0;
83 int b_start_slice = 0;
85 /* preparse this packet to get some info */
86 if( in->i_buffer > 4 )
89 int i_rest = in->i_buffer;
94 ( p[0] != 0x00 || p[1] != 0x00 || p[2] != 0x01 ) )
108 /* sequence start code */
109 b_sequence_start = 1;
111 else if( *p == 0x00 && i_rest >= 4 )
114 i_temporal_ref = ( p[1] << 2) |((p[2]>>6)&0x03);
115 i_picture_coding_type = (p[2] >> 3)&0x07;
117 if( i_rest >= 4 && ( i_picture_coding_type == 2 ||
118 i_picture_coding_type == 3 ) )
120 i_ffv = (p[3] >> 2)&0x01;
121 i_ffc = ((p[3]&0x03) << 1)|((p[4]>>7)&0x01);
122 if( i_rest > 4 && i_picture_coding_type == 3 )
124 i_fbv = (p[4]>>6)&0x01;
125 i_bfc = (p[4]>>3)&0x07;
129 else if( *p <= 0xaf )
136 for( i = 0; i < i_count; i++ )
138 int i_payload = __MIN( i_max, i_data );
139 block_t *out = block_New( p_stream,
141 uint32_t h = ( i_temporal_ref << 16 )|
142 ( b_sequence_start << 13 )|
143 ( b_start_slice << 12 )|
144 ( i == i_count - 1 ? 1 << 11 : 0 )|
145 ( i_picture_coding_type << 8 )|
146 ( i_fbv << 7 )|( i_bfc << 4 )|( i_ffv << 3 )|i_ffc;
148 /* rtp common header */
149 rtp_packetize_common( id, out, (i == i_count - 1)?1:0,
150 in->i_pts > 0 ? in->i_pts : in->i_dts );
152 /* MBZ:5 T:1 TR:10 AN:1 N:1 S:1 B:1 E:1 P:3 FBV:1 BFC:3 FFV:1 FFC:3 */
153 out->p_buffer[12] = ( h >> 24 )&0xff;
154 out->p_buffer[13] = ( h >> 16 )&0xff;
155 out->p_buffer[14] = ( h >> 8 )&0xff;
156 out->p_buffer[15] = ( h )&0xff;
158 memcpy( &out->p_buffer[16], p_data, i_payload );
160 out->i_buffer = 16 + i_payload;
161 out->i_dts = in->i_dts + i * in->i_length / i_count;
162 out->i_length = in->i_length / i_count;
164 rtp_packetize_send( id, out );
173 int rtp_packetize_ac3( sout_stream_t *p_stream, sout_stream_id_t *id,
176 int i_max = rtp_mtu (id) - 2; /* payload max in one packet */
177 int i_count = ( in->i_buffer + i_max - 1 ) / i_max;
179 uint8_t *p_data = in->p_buffer;
180 int i_data = in->i_buffer;
183 for( i = 0; i < i_count; i++ )
185 int i_payload = __MIN( i_max, i_data );
186 block_t *out = block_New( p_stream, 14 + i_payload );
188 /* rtp common header */
189 rtp_packetize_common( id, out, (i == i_count - 1)?1:0, in->i_pts );
191 out->p_buffer[12] = 1;
193 out->p_buffer[13] = 0x00;
195 memcpy( &out->p_buffer[14], p_data, i_payload );
197 out->i_buffer = 14 + i_payload;
198 out->i_dts = in->i_dts + i * in->i_length / i_count;
199 out->i_length = in->i_length / i_count;
201 rtp_packetize_send( id, out );
210 int rtp_packetize_split( sout_stream_t *p_stream, sout_stream_id_t *id,
213 int i_max = rtp_mtu (id); /* payload max in one packet */
214 int i_count = ( in->i_buffer + i_max - 1 ) / i_max;
216 uint8_t *p_data = in->p_buffer;
217 int i_data = in->i_buffer;
220 for( i = 0; i < i_count; i++ )
222 int i_payload = __MIN( i_max, i_data );
223 block_t *out = block_New( p_stream, 12 + i_payload );
225 /* rtp common header */
226 rtp_packetize_common( id, out, (i == i_count - 1),
227 (in->i_pts > 0 ? in->i_pts : in->i_dts) );
228 memcpy( &out->p_buffer[12], p_data, i_payload );
230 out->i_buffer = 12 + i_payload;
231 out->i_dts = in->i_dts + i * in->i_length / i_count;
232 out->i_length = in->i_length / i_count;
234 rtp_packetize_send( id, out );
244 int rtp_packetize_mp4a_latm( sout_stream_t *p_stream, sout_stream_id_t *id,
247 int i_max = rtp_mtu (id) - 2; /* payload max in one packet */
248 int latmhdrsize = in->i_buffer / 0xff + 1;
249 int i_count = ( in->i_buffer + i_max - 1 ) / i_max;
251 uint8_t *p_data = in->p_buffer, *p_header = NULL;
252 int i_data = in->i_buffer;
255 for( i = 0; i < i_count; i++ )
257 int i_payload = __MIN( i_max, i_data );
262 out = block_New( p_stream, 12 + latmhdrsize + i_payload );
264 /* rtp common header */
265 rtp_packetize_common( id, out, ((i == i_count - 1) ? 1 : 0),
266 (in->i_pts > 0 ? in->i_pts : in->i_dts) );
270 int tmp = in->i_buffer;
272 p_header=out->p_buffer+12;
282 memcpy( &out->p_buffer[12+latmhdrsize], p_data, i_payload );
284 out->i_buffer = 12 + latmhdrsize + i_payload;
285 out->i_dts = in->i_dts + i * in->i_length / i_count;
286 out->i_length = in->i_length / i_count;
288 rtp_packetize_send( id, out );
297 int rtp_packetize_l16( sout_stream_t *p_stream, sout_stream_id_t *id,
300 const uint8_t *p_data = in->p_buffer;
301 size_t i_data = in->i_buffer;
302 size_t i_plen = 2 * rtp_plen (id, 20);
304 for( unsigned i_packet = 0; i_data > 0; i_packet++ )
306 int i_payload = __MIN( i_plen, i_data );
307 block_t *out = block_New( p_stream, 12 + i_payload );
309 /* rtp common header */
310 rtp_packetize_common( id, out, 0,
311 (in->i_pts > 0 ? in->i_pts : in->i_dts) );
312 memcpy( &out->p_buffer[12], p_data, i_payload );
314 out->i_buffer = 12 + i_payload;
315 out->i_dts = in->i_dts + i_packet * 20000;
316 out->i_length = i_payload * 20000 / i_plen;
318 rtp_packetize_send( id, out );
327 int rtp_packetize_l8( sout_stream_t *p_stream, sout_stream_id_t *id,
330 const uint8_t *p_data = in->p_buffer;
331 size_t i_data = in->i_buffer;
332 size_t i_plen = rtp_plen (id, 20);
334 for( unsigned i_packet = 0; i_data > 0; i_packet++ )
336 int i_payload = __MIN( i_plen, i_data );
337 block_t *out = block_New( p_stream, 12 + i_payload );
339 /* rtp common header */
340 rtp_packetize_common( id, out, 0,
341 (in->i_pts > 0 ? in->i_pts : in->i_dts) );
342 memcpy( &out->p_buffer[12], p_data, i_payload );
344 out->i_buffer = 12 + i_payload;
345 out->i_dts = in->i_dts + i_packet * 20000;
346 out->i_length = i_payload * 20000 / i_plen;
348 rtp_packetize_send( id, out );
357 int rtp_packetize_mp4a( sout_stream_t *p_stream, sout_stream_id_t *id,
360 int i_max = rtp_mtu (id) - 4; /* payload max in one packet */
361 int i_count = ( in->i_buffer + i_max - 1 ) / i_max;
363 uint8_t *p_data = in->p_buffer;
364 int i_data = in->i_buffer;
367 for( i = 0; i < i_count; i++ )
369 int i_payload = __MIN( i_max, i_data );
370 block_t *out = block_New( p_stream, 16 + i_payload );
372 /* rtp common header */
373 rtp_packetize_common( id, out, ((i == i_count - 1)?1:0),
374 (in->i_pts > 0 ? in->i_pts : in->i_dts) );
376 /* AU headers length (bits) */
377 out->p_buffer[12] = 0;
378 out->p_buffer[13] = 2*8;
379 /* for each AU length 13 bits + idx 3bits, */
380 out->p_buffer[14] = ( in->i_buffer >> 5 )&0xff;
381 out->p_buffer[15] = ( (in->i_buffer&0xff)<<3 )|0;
383 memcpy( &out->p_buffer[16], p_data, i_payload );
385 out->i_buffer = 16 + i_payload;
386 out->i_dts = in->i_dts + i * in->i_length / i_count;
387 out->i_length = in->i_length / i_count;
389 rtp_packetize_send( id, out );
400 #define RTP_H263_HEADER_SIZE (2) // plen = 0
401 #define RTP_H263_PAYLOAD_START (14) // plen = 0
402 int rtp_packetize_h263( sout_stream_t *p_stream, sout_stream_id_t *id,
405 uint8_t *p_data = in->p_buffer;
406 int i_data = in->i_buffer;
408 int i_max = rtp_mtu (id) - RTP_H263_HEADER_SIZE; /* payload max in one packet */
411 int b_v_bit = 0; // no pesky error resilience
412 int i_plen = 0; // normally plen=0 for PSC packet
413 int i_pebit = 0; // because plen=0
420 if( p_data[0] || p_data[1] )
424 /* remove 2 leading 0 bytes */
427 i_count = ( i_data + i_max - 1 ) / i_max;
429 for( i = 0; i < i_count; i++ )
431 int i_payload = __MIN( i_max, i_data );
432 block_t *out = block_New( p_stream,
433 RTP_H263_PAYLOAD_START + i_payload );
434 b_p_bit = (i == 0) ? 1 : 0;
435 h = ( b_p_bit << 10 )|
440 /* rtp common header */
441 //b_m_bit = 1; // always contains end of frame
442 rtp_packetize_common( id, out, (i == i_count - 1)?1:0,
443 in->i_pts > 0 ? in->i_pts : in->i_dts );
446 out->p_buffer[12] = ( h >> 8 )&0xff;
447 out->p_buffer[13] = ( h )&0xff;
448 memcpy( &out->p_buffer[RTP_H263_PAYLOAD_START], p_data, i_payload );
450 out->i_buffer = RTP_H263_PAYLOAD_START + i_payload;
451 out->i_dts = in->i_dts + i * in->i_length / i_count;
452 out->i_length = in->i_length / i_count;
454 rtp_packetize_send( id, out );
465 rtp_packetize_h264_nal( sout_stream_t *p_stream, sout_stream_id_t *id,
466 const uint8_t *p_data, int i_data, int64_t i_pts,
467 int64_t i_dts, vlc_bool_t b_last, int64_t i_length )
469 const int i_max = rtp_mtu (id); /* payload max in one packet */
476 i_nal_hdr = p_data[3];
477 i_nal_type = i_nal_hdr&0x1f;
479 /* Skip start code */
484 if( i_data <= i_max )
486 /* Single NAL unit packet */
487 block_t *out = block_New( p_stream, 12 + i_data );
489 out->i_length = i_length;
492 rtp_packetize_common( id, out, b_last, i_pts );
493 out->i_buffer = 12 + i_data;
495 memcpy( &out->p_buffer[12], p_data, i_data );
497 rtp_packetize_send( id, out );
501 /* FU-A Fragmentation Unit without interleaving */
502 const int i_count = ( i_data-1 + i_max-2 - 1 ) / (i_max-2);
508 for( i = 0; i < i_count; i++ )
510 const int i_payload = __MIN( i_data, i_max-2 );
511 block_t *out = block_New( p_stream, 12 + 2 + i_payload );
512 out->i_dts = i_dts + i * i_length / i_count;
513 out->i_length = i_length / i_count;
516 rtp_packetize_common( id, out, (b_last && i_payload == i_data), i_pts );
517 out->i_buffer = 14 + i_payload;
520 out->p_buffer[12] = 0x00 | (i_nal_hdr & 0x60) | 28;
522 out->p_buffer[13] = ( i == 0 ? 0x80 : 0x00 ) | ( (i == i_count-1) ? 0x40 : 0x00 ) | i_nal_type;
523 memcpy( &out->p_buffer[14], p_data, i_payload );
525 rtp_packetize_send( id, out );
534 int rtp_packetize_h264( sout_stream_t *p_stream, sout_stream_id_t *id,
537 const uint8_t *p_buffer = in->p_buffer;
538 int i_buffer = in->i_buffer;
540 while( i_buffer > 4 && ( p_buffer[0] != 0 || p_buffer[1] != 0 || p_buffer[2] != 1 ) )
546 /* Split nal units */
547 while( i_buffer > 4 )
550 int i_size = i_buffer;
551 int i_skip = i_buffer;
554 for( i_offset = 4; i_offset+2 < i_buffer ; i_offset++)
556 if( p_buffer[i_offset] == 0 && p_buffer[i_offset+1] == 0 && p_buffer[i_offset+2] == 1 )
558 /* we found another startcode */
559 i_size = i_offset - ( p_buffer[i_offset-1] == 0 ? 1 : 0);
564 /* TODO add STAP-A to remove a lot of overhead with small slice/sei/... */
565 rtp_packetize_h264_nal( p_stream, id, p_buffer, i_size,
566 (in->i_pts > 0 ? in->i_pts : in->i_dts), in->i_dts,
567 (i_size >= i_buffer), in->i_length * i_size / in->i_buffer );
575 int rtp_packetize_amr( sout_stream_t *p_stream, sout_stream_id_t *id,
578 int i_max = rtp_mtu (id) - 2; /* payload max in one packet */
579 int i_count = ( in->i_buffer + i_max - 1 ) / i_max;
581 uint8_t *p_data = in->p_buffer;
582 int i_data = in->i_buffer;
585 /* Only supports octet-aligned mode */
586 for( i = 0; i < i_count; i++ )
588 int i_payload = __MIN( i_max, i_data );
589 block_t *out = block_New( p_stream, 14 + i_payload );
591 /* rtp common header */
592 rtp_packetize_common( id, out, ((i == i_count - 1)?1:0),
593 (in->i_pts > 0 ? in->i_pts : in->i_dts) );
595 out->p_buffer[12] = 0xF0; /* CMR */
596 out->p_buffer[13] = p_data[0]&0x7C; /* ToC */ /* FIXME: frame type */
598 /* FIXME: are we fed multiple frames ? */
599 memcpy( &out->p_buffer[14], p_data+1, i_payload-1 );
601 out->i_buffer = 14 + i_payload-1;
602 out->i_dts = in->i_dts + i * in->i_length / i_count;
603 out->i_length = in->i_length / i_count;
605 rtp_packetize_send( id, out );
614 int rtp_packetize_t140( sout_stream_t *p_stream, sout_stream_id_t *id,
617 const size_t i_max = rtp_mtu (id);
618 const uint8_t *p_data = in->p_buffer;
619 size_t i_data = in->i_buffer;
621 for( unsigned i_packet = 0; i_data > 0; i_packet++ )
623 size_t i_payload = i_data;
625 /* Make sure we stop on an UTF-8 character boundary
626 * (assuming the input is valid UTF-8) */
631 while( ( p_data[i_payload] & 0xC0 ) == 0x80 )
634 return VLC_SUCCESS; /* fishy input! */
640 block_t *out = block_New( p_stream, 12 + i_payload );
644 rtp_packetize_common( id, out, 0, in->i_pts + i_packet );
645 memcpy( out->p_buffer + 12, p_data, i_payload );
647 out->i_buffer = 12 + i_payload;
648 out->i_dts = out->i_pts;
651 rtp_packetize_send( id, out );
661 int rtp_packetize_spx( sout_stream_t *p_stream, sout_stream_id_t *id,
664 uint8_t *p_buffer = in->p_buffer;
665 int i_data_size, i_payload_size, i_payload_padding;
666 i_data_size = i_payload_size = in->i_buffer;
667 i_payload_padding = 0;
670 if ( in->i_buffer > rtp_mtu (id) )
672 msg_Warn( p_stream, "Cannot send packet larger than output MTU" );
677 RFC for Speex in RTP says that each packet must end on an octet
678 boundary. So, we check to see if the number of bytes % 4 is zero.
679 If not, we have to add some padding.
681 This MAY be overkill since packetization is handled elsewhere and
682 appears to ensure the octet boundary. However, better safe than
685 if ( i_payload_size % 4 )
687 i_payload_padding = 4 - ( i_payload_size % 4 );
688 i_payload_size += i_payload_padding;
692 Allocate a new RTP p_output block of the appropriate size.
693 Allow for 12 extra bytes of RTP header.
695 p_out = block_New( p_stream, 12 + i_payload_size );
697 if ( i_payload_padding )
700 The padding is required to be a zero followed by all 1s.
702 char c_first_pad, c_remaining_pad;
704 c_remaining_pad = 0xFF;
707 Allow for 12 bytes before the i_data_size because
708 of the expected RTP header added during
709 rtp_packetize_common.
711 p_out->p_buffer[12 + i_data_size] = c_first_pad;
712 switch (i_payload_padding)
715 p_out->p_buffer[12 + i_data_size + 1] = c_remaining_pad;
718 p_out->p_buffer[12 + i_data_size + 1] = c_remaining_pad;
719 p_out->p_buffer[12 + i_data_size + 2] = c_remaining_pad;
724 /* Add the RTP header to our p_output buffer. */
725 rtp_packetize_common( id, p_out, 0, (in->i_pts > 0 ? in->i_pts : in->i_dts) );
726 /* Copy the Speex payload to the p_output buffer */
727 memcpy( &p_out->p_buffer[12], p_buffer, i_data_size );
729 p_out->i_buffer = 12 + i_payload_size;
730 p_out->i_dts = in->i_dts;
731 p_out->i_length = in->i_length;
733 /* Queue the buffer for actual transmission. */
734 rtp_packetize_send( id, p_out );