1 /*****************************************************************************
2 * rtpfmt.c: RTP payload formats
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 *****************************************************************************/
29 #include <vlc_common.h>
31 #include <vlc_block.h>
36 rtp_packetize_h264_nal( sout_stream_t *p_stream, sout_stream_id_t *id,
37 const uint8_t *p_data, int i_data, int64_t i_pts,
38 int64_t i_dts, bool b_last, int64_t i_length );
40 int rtp_packetize_mpa( sout_stream_t *p_stream, sout_stream_id_t *id,
43 int i_max = rtp_mtu (id) - 4; /* payload max in one packet */
44 int i_count = ( in->i_buffer + i_max - 1 ) / i_max;
46 uint8_t *p_data = in->p_buffer;
47 int i_data = in->i_buffer;
50 for( i = 0; i < i_count; i++ )
52 int i_payload = __MIN( i_max, i_data );
53 block_t *out = block_Alloc( 16 + i_payload );
55 /* rtp common header */
56 rtp_packetize_common( id, out, (i == i_count - 1)?1:0, in->i_pts );
58 out->p_buffer[12] = 0;
59 out->p_buffer[13] = 0;
60 /* fragment offset in the current frame */
61 out->p_buffer[14] = ( (i*i_max) >> 8 )&0xff;
62 out->p_buffer[15] = ( (i*i_max) )&0xff;
63 memcpy( &out->p_buffer[16], p_data, i_payload );
65 out->i_buffer = 16 + i_payload;
66 out->i_dts = in->i_dts + i * in->i_length / i_count;
67 out->i_length = in->i_length / i_count;
69 rtp_packetize_send( id, out );
79 int rtp_packetize_mpv( sout_stream_t *p_stream, sout_stream_id_t *id,
82 int i_max = rtp_mtu (id) - 4; /* payload max in one packet */
83 int i_count = ( in->i_buffer + i_max - 1 ) / i_max;
85 uint8_t *p_data = in->p_buffer;
86 int i_data = in->i_buffer;
88 int b_sequence_start = 0;
89 int i_temporal_ref = 0;
90 int i_picture_coding_type = 0;
91 int i_fbv = 0, i_bfc = 0, i_ffv = 0, i_ffc = 0;
92 int b_start_slice = 0;
94 /* preparse this packet to get some info */
95 if( in->i_buffer > 4 )
98 int i_rest = in->i_buffer;
103 ( p[0] != 0x00 || p[1] != 0x00 || p[2] != 0x01 ) )
117 /* sequence start code */
118 b_sequence_start = 1;
120 else if( *p == 0x00 && i_rest >= 4 )
123 i_temporal_ref = ( p[1] << 2) |((p[2]>>6)&0x03);
124 i_picture_coding_type = (p[2] >> 3)&0x07;
126 if( i_rest >= 4 && ( i_picture_coding_type == 2 ||
127 i_picture_coding_type == 3 ) )
129 i_ffv = (p[3] >> 2)&0x01;
130 i_ffc = ((p[3]&0x03) << 1)|((p[4]>>7)&0x01);
131 if( i_rest > 4 && i_picture_coding_type == 3 )
133 i_fbv = (p[4]>>6)&0x01;
134 i_bfc = (p[4]>>3)&0x07;
138 else if( *p <= 0xaf )
145 for( i = 0; i < i_count; i++ )
147 int i_payload = __MIN( i_max, i_data );
148 block_t *out = block_Alloc( 16 + i_payload );
149 uint32_t h = ( i_temporal_ref << 16 )|
150 ( b_sequence_start << 13 )|
151 ( b_start_slice << 12 )|
152 ( i == i_count - 1 ? 1 << 11 : 0 )|
153 ( i_picture_coding_type << 8 )|
154 ( i_fbv << 7 )|( i_bfc << 4 )|( i_ffv << 3 )|i_ffc;
156 /* rtp common header */
157 rtp_packetize_common( id, out, (i == i_count - 1)?1:0,
158 in->i_pts > 0 ? in->i_pts : in->i_dts );
160 /* 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 */
161 out->p_buffer[12] = ( h >> 24 )&0xff;
162 out->p_buffer[13] = ( h >> 16 )&0xff;
163 out->p_buffer[14] = ( h >> 8 )&0xff;
164 out->p_buffer[15] = ( h )&0xff;
166 memcpy( &out->p_buffer[16], p_data, i_payload );
168 out->i_buffer = 16 + i_payload;
169 out->i_dts = in->i_dts + i * in->i_length / i_count;
170 out->i_length = in->i_length / i_count;
172 rtp_packetize_send( id, out );
181 int rtp_packetize_ac3( sout_stream_t *p_stream, sout_stream_id_t *id,
184 int i_max = rtp_mtu (id) - 2; /* payload max in one packet */
185 int i_count = ( in->i_buffer + i_max - 1 ) / i_max;
187 uint8_t *p_data = in->p_buffer;
188 int i_data = in->i_buffer;
191 for( i = 0; i < i_count; i++ )
193 int i_payload = __MIN( i_max, i_data );
194 block_t *out = block_Alloc( 14 + i_payload );
196 /* rtp common header */
197 rtp_packetize_common( id, out, (i == i_count - 1)?1:0, in->i_pts );
199 out->p_buffer[12] = 1;
201 out->p_buffer[13] = 0x00;
203 memcpy( &out->p_buffer[14], p_data, i_payload );
205 out->i_buffer = 14 + i_payload;
206 out->i_dts = in->i_dts + i * in->i_length / i_count;
207 out->i_length = in->i_length / i_count;
209 rtp_packetize_send( id, out );
218 int rtp_packetize_split( sout_stream_t *p_stream, sout_stream_id_t *id,
221 int i_max = rtp_mtu (id); /* payload max in one packet */
222 int i_count = ( in->i_buffer + i_max - 1 ) / i_max;
224 uint8_t *p_data = in->p_buffer;
225 int i_data = in->i_buffer;
228 for( i = 0; i < i_count; i++ )
230 int i_payload = __MIN( i_max, i_data );
231 block_t *out = block_Alloc( 12 + i_payload );
233 /* rtp common header */
234 rtp_packetize_common( id, out, (i == i_count - 1),
235 (in->i_pts > 0 ? in->i_pts : in->i_dts) );
236 memcpy( &out->p_buffer[12], p_data, i_payload );
238 out->i_buffer = 12 + i_payload;
239 out->i_dts = in->i_dts + i * in->i_length / i_count;
240 out->i_length = in->i_length / i_count;
242 rtp_packetize_send( id, out );
252 int rtp_packetize_mp4a_latm( sout_stream_t *p_stream, sout_stream_id_t *id,
255 int i_max = rtp_mtu (id) - 2; /* payload max in one packet */
256 int latmhdrsize = in->i_buffer / 0xff + 1;
257 int i_count = ( in->i_buffer + i_max - 1 ) / i_max;
259 uint8_t *p_data = in->p_buffer, *p_header = NULL;
260 int i_data = in->i_buffer;
263 for( i = 0; i < i_count; i++ )
265 int i_payload = __MIN( i_max, i_data );
270 out = block_Alloc( 12 + latmhdrsize + i_payload );
272 /* rtp common header */
273 rtp_packetize_common( id, out, ((i == i_count - 1) ? 1 : 0),
274 (in->i_pts > 0 ? in->i_pts : in->i_dts) );
278 int tmp = in->i_buffer;
280 p_header=out->p_buffer+12;
290 memcpy( &out->p_buffer[12+latmhdrsize], p_data, i_payload );
292 out->i_buffer = 12 + latmhdrsize + i_payload;
293 out->i_dts = in->i_dts + i * in->i_length / i_count;
294 out->i_length = in->i_length / i_count;
296 rtp_packetize_send( id, out );
305 int rtp_packetize_mp4a( sout_stream_t *p_stream, sout_stream_id_t *id,
308 int i_max = rtp_mtu (id) - 4; /* payload max in one packet */
309 int i_count = ( in->i_buffer + i_max - 1 ) / i_max;
311 uint8_t *p_data = in->p_buffer;
312 int i_data = in->i_buffer;
315 for( i = 0; i < i_count; i++ )
317 int i_payload = __MIN( i_max, i_data );
318 block_t *out = block_Alloc( 16 + i_payload );
320 /* rtp common header */
321 rtp_packetize_common( id, out, ((i == i_count - 1)?1:0),
322 (in->i_pts > 0 ? in->i_pts : in->i_dts) );
324 /* AU headers length (bits) */
325 out->p_buffer[12] = 0;
326 out->p_buffer[13] = 2*8;
327 /* for each AU length 13 bits + idx 3bits, */
328 out->p_buffer[14] = ( in->i_buffer >> 5 )&0xff;
329 out->p_buffer[15] = ( (in->i_buffer&0xff)<<3 )|0;
331 memcpy( &out->p_buffer[16], p_data, i_payload );
333 out->i_buffer = 16 + i_payload;
334 out->i_dts = in->i_dts + i * in->i_length / i_count;
335 out->i_length = in->i_length / i_count;
337 rtp_packetize_send( id, out );
348 #define RTP_H263_HEADER_SIZE (2) // plen = 0
349 #define RTP_H263_PAYLOAD_START (14) // plen = 0
350 int rtp_packetize_h263( sout_stream_t *p_stream, sout_stream_id_t *id,
353 uint8_t *p_data = in->p_buffer;
354 int i_data = in->i_buffer;
356 int i_max = rtp_mtu (id) - RTP_H263_HEADER_SIZE; /* payload max in one packet */
359 int b_v_bit = 0; // no pesky error resilience
360 int i_plen = 0; // normally plen=0 for PSC packet
361 int i_pebit = 0; // because plen=0
368 if( p_data[0] || p_data[1] )
372 /* remove 2 leading 0 bytes */
375 i_count = ( i_data + i_max - 1 ) / i_max;
377 for( i = 0; i < i_count; i++ )
379 int i_payload = __MIN( i_max, i_data );
380 block_t *out = block_Alloc( RTP_H263_PAYLOAD_START + i_payload );
381 b_p_bit = (i == 0) ? 1 : 0;
382 h = ( b_p_bit << 10 )|
387 /* rtp common header */
388 //b_m_bit = 1; // always contains end of frame
389 rtp_packetize_common( id, out, (i == i_count - 1)?1:0,
390 in->i_pts > 0 ? in->i_pts : in->i_dts );
393 out->p_buffer[12] = ( h >> 8 )&0xff;
394 out->p_buffer[13] = ( h )&0xff;
395 memcpy( &out->p_buffer[RTP_H263_PAYLOAD_START], p_data, i_payload );
397 out->i_buffer = RTP_H263_PAYLOAD_START + i_payload;
398 out->i_dts = in->i_dts + i * in->i_length / i_count;
399 out->i_length = in->i_length / i_count;
401 rtp_packetize_send( id, out );
412 rtp_packetize_h264_nal( sout_stream_t *p_stream, sout_stream_id_t *id,
413 const uint8_t *p_data, int i_data, int64_t i_pts,
414 int64_t i_dts, bool b_last, int64_t i_length )
416 const int i_max = rtp_mtu (id); /* payload max in one packet */
423 i_nal_hdr = p_data[3];
424 i_nal_type = i_nal_hdr&0x1f;
426 /* Skip start code */
431 if( i_data <= i_max )
433 /* Single NAL unit packet */
434 block_t *out = block_Alloc( 12 + i_data );
436 out->i_length = i_length;
439 rtp_packetize_common( id, out, b_last, i_pts );
440 out->i_buffer = 12 + i_data;
442 memcpy( &out->p_buffer[12], p_data, i_data );
444 rtp_packetize_send( id, out );
448 /* FU-A Fragmentation Unit without interleaving */
449 const int i_count = ( i_data-1 + i_max-2 - 1 ) / (i_max-2);
455 for( i = 0; i < i_count; i++ )
457 const int i_payload = __MIN( i_data, i_max-2 );
458 block_t *out = block_Alloc( 12 + 2 + i_payload );
459 out->i_dts = i_dts + i * i_length / i_count;
460 out->i_length = i_length / i_count;
463 rtp_packetize_common( id, out, (b_last && i_payload == i_data), i_pts );
464 out->i_buffer = 14 + i_payload;
467 out->p_buffer[12] = 0x00 | (i_nal_hdr & 0x60) | 28;
469 out->p_buffer[13] = ( i == 0 ? 0x80 : 0x00 ) | ( (i == i_count-1) ? 0x40 : 0x00 ) | i_nal_type;
470 memcpy( &out->p_buffer[14], p_data, i_payload );
472 rtp_packetize_send( id, out );
481 int rtp_packetize_h264( sout_stream_t *p_stream, sout_stream_id_t *id,
484 const uint8_t *p_buffer = in->p_buffer;
485 int i_buffer = in->i_buffer;
487 while( i_buffer > 4 && ( p_buffer[0] != 0 || p_buffer[1] != 0 || p_buffer[2] != 1 ) )
493 /* Split nal units */
494 while( i_buffer > 4 )
497 int i_size = i_buffer;
498 int i_skip = i_buffer;
501 for( i_offset = 4; i_offset+2 < i_buffer ; i_offset++)
503 if( p_buffer[i_offset] == 0 && p_buffer[i_offset+1] == 0 && p_buffer[i_offset+2] == 1 )
505 /* we found another startcode */
506 i_size = i_offset - ( p_buffer[i_offset-1] == 0 ? 1 : 0);
511 /* TODO add STAP-A to remove a lot of overhead with small slice/sei/... */
512 rtp_packetize_h264_nal( p_stream, id, p_buffer, i_size,
513 (in->i_pts > 0 ? in->i_pts : in->i_dts), in->i_dts,
514 (i_size >= i_buffer), in->i_length * i_size / in->i_buffer );
522 int rtp_packetize_amr( sout_stream_t *p_stream, sout_stream_id_t *id,
525 int i_max = rtp_mtu (id) - 2; /* payload max in one packet */
526 int i_count = ( in->i_buffer + i_max - 1 ) / i_max;
528 uint8_t *p_data = in->p_buffer;
529 int i_data = in->i_buffer;
532 /* Only supports octet-aligned mode */
533 for( i = 0; i < i_count; i++ )
535 int i_payload = __MIN( i_max, i_data );
536 block_t *out = block_Alloc( 14 + i_payload );
538 /* rtp common header */
539 rtp_packetize_common( id, out, ((i == i_count - 1)?1:0),
540 (in->i_pts > 0 ? in->i_pts : in->i_dts) );
542 out->p_buffer[12] = 0xF0; /* CMR */
543 out->p_buffer[13] = p_data[0]&0x7C; /* ToC */ /* FIXME: frame type */
545 /* FIXME: are we fed multiple frames ? */
546 memcpy( &out->p_buffer[14], p_data+1, i_payload-1 );
548 out->i_buffer = 14 + i_payload-1;
549 out->i_dts = in->i_dts + i * in->i_length / i_count;
550 out->i_length = in->i_length / i_count;
552 rtp_packetize_send( id, out );
561 int rtp_packetize_t140( sout_stream_t *p_stream, sout_stream_id_t *id,
564 const size_t i_max = rtp_mtu (id);
565 const uint8_t *p_data = in->p_buffer;
566 size_t i_data = in->i_buffer;
568 for( unsigned i_packet = 0; i_data > 0; i_packet++ )
570 size_t i_payload = i_data;
572 /* Make sure we stop on an UTF-8 character boundary
573 * (assuming the input is valid UTF-8) */
578 while( ( p_data[i_payload] & 0xC0 ) == 0x80 )
581 return VLC_SUCCESS; /* fishy input! */
587 block_t *out = block_Alloc( 12 + i_payload );
591 rtp_packetize_common( id, out, 0, in->i_pts + i_packet );
592 memcpy( out->p_buffer + 12, p_data, i_payload );
594 out->i_buffer = 12 + i_payload;
595 out->i_dts = out->i_pts;
598 rtp_packetize_send( id, out );
608 int rtp_packetize_spx( sout_stream_t *p_stream, sout_stream_id_t *id,
611 uint8_t *p_buffer = in->p_buffer;
612 int i_data_size, i_payload_size, i_payload_padding;
613 i_data_size = i_payload_size = in->i_buffer;
614 i_payload_padding = 0;
617 if ( in->i_buffer > rtp_mtu (id) )
619 msg_Warn( p_stream, "Cannot send packet larger than output MTU" );
624 RFC for Speex in RTP says that each packet must end on an octet
625 boundary. So, we check to see if the number of bytes % 4 is zero.
626 If not, we have to add some padding.
628 This MAY be overkill since packetization is handled elsewhere and
629 appears to ensure the octet boundary. However, better safe than
632 if ( i_payload_size % 4 )
634 i_payload_padding = 4 - ( i_payload_size % 4 );
635 i_payload_size += i_payload_padding;
639 Allocate a new RTP p_output block of the appropriate size.
640 Allow for 12 extra bytes of RTP header.
642 p_out = block_Alloc( 12 + i_payload_size );
644 if ( i_payload_padding )
647 The padding is required to be a zero followed by all 1s.
649 char c_first_pad, c_remaining_pad;
651 c_remaining_pad = 0xFF;
654 Allow for 12 bytes before the i_data_size because
655 of the expected RTP header added during
656 rtp_packetize_common.
658 p_out->p_buffer[12 + i_data_size] = c_first_pad;
659 switch (i_payload_padding)
662 p_out->p_buffer[12 + i_data_size + 1] = c_remaining_pad;
665 p_out->p_buffer[12 + i_data_size + 1] = c_remaining_pad;
666 p_out->p_buffer[12 + i_data_size + 2] = c_remaining_pad;
671 /* Add the RTP header to our p_output buffer. */
672 rtp_packetize_common( id, p_out, 0, (in->i_pts > 0 ? in->i_pts : in->i_dts) );
673 /* Copy the Speex payload to the p_output buffer */
674 memcpy( &p_out->p_buffer[12], p_buffer, i_data_size );
676 p_out->i_buffer = 12 + i_payload_size;
677 p_out->i_dts = in->i_dts;
678 p_out->i_length = in->i_length;
680 /* Queue the buffer for actual transmission. */
681 rtp_packetize_send( id, p_out );