annotate rtp_aac.c @ 4842:bbdefe369edc libavformat

AAC packetiser cleanup: remove check for a condition that cannot happen
author lucabe
date Thu, 09 Apr 2009 21:39:07 +0000
parents 94eb88d4ac0f
children 744f14413d22
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2550
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
1 /*
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
2 * copyright (c) 2007 Luca Abeni
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
3 *
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
4 * This file is part of FFmpeg.
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
5 *
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
6 * FFmpeg is free software; you can redistribute it and/or
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
9 * version 2.1 of the License, or (at your option) any later version.
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
10 *
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
11 * FFmpeg is distributed in the hope that it will be useful,
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
14 * Lesser General Public License for more details.
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
15 *
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
17 * License along with FFmpeg; if not, write to the Free Software
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
19 */
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
20
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
21 #include "avformat.h"
4388
80f21f72d7d6 Split rtp.h in rtp.h, rtpdec.h, and rtpenc.h
lucabe
parents: 4380
diff changeset
22 #include "rtpenc.h"
2550
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
23
2587
d751acab2622 Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents: 2551
diff changeset
24 #define MAX_FRAMES_PER_PACKET (s->max_frames_per_packet ? s->max_frames_per_packet : 5)
2550
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
25 #define MAX_AU_HEADERS_SIZE (2 + 2 * MAX_FRAMES_PER_PACKET)
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
26
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
27 void ff_rtp_send_aac(AVFormatContext *s1, const uint8_t *buff, int size)
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
28 {
4388
80f21f72d7d6 Split rtp.h in rtp.h, rtpdec.h, and rtpenc.h
lucabe
parents: 4380
diff changeset
29 RTPMuxContext *s = s1->priv_data;
2550
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
30 int len, max_packet_size;
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
31 uint8_t *p;
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
32
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
33 /* skip ADTS header, if present */
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
34 if ((s1->streams[0]->codec->extradata_size) == 0) {
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
35 size -= 7;
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
36 buff += 7;
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
37 }
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
38 max_packet_size = s->max_payload_size - MAX_AU_HEADERS_SIZE;
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
39
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
40 /* test if the packet must be sent */
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
41 len = (s->buf_ptr - s->buf);
4841
94eb88d4ac0f Fix two checks in the AAC packetiser, which were too conservative
lucabe
parents: 4389
diff changeset
42 if ((s->num_frames == MAX_FRAMES_PER_PACKET) || (len && (len + size) > s->max_payload_size)) {
4380
1b695f013cd3 Introduce a new num_frames field in RTPDemuxContext so that rtp_aac.c
lucabe
parents: 4291
diff changeset
43 int au_size = s->num_frames * 2;
2550
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
44
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
45 p = s->buf + MAX_AU_HEADERS_SIZE - au_size - 2;
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
46 if (p != s->buf) {
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
47 memmove(p + 2, s->buf + 2, au_size);
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
48 }
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
49 /* Write the AU header size */
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
50 p[0] = ((au_size * 8) & 0xFF) >> 8;
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
51 p[1] = (au_size * 8) & 0xFF;
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
52
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
53 ff_rtp_send_data(s1, p, s->buf_ptr - p, 1);
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
54
4380
1b695f013cd3 Introduce a new num_frames field in RTPDemuxContext so that rtp_aac.c
lucabe
parents: 4291
diff changeset
55 s->num_frames = 0;
2550
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
56 }
4380
1b695f013cd3 Introduce a new num_frames field in RTPDemuxContext so that rtp_aac.c
lucabe
parents: 4291
diff changeset
57 if (s->num_frames == 0) {
2550
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
58 s->buf_ptr = s->buf + MAX_AU_HEADERS_SIZE;
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
59 s->timestamp = s->cur_timestamp;
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
60 }
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
61
4841
94eb88d4ac0f Fix two checks in the AAC packetiser, which were too conservative
lucabe
parents: 4389
diff changeset
62 if (size <= max_packet_size) {
4380
1b695f013cd3 Introduce a new num_frames field in RTPDemuxContext so that rtp_aac.c
lucabe
parents: 4291
diff changeset
63 p = s->buf + s->num_frames++ * 2 + 2;
2550
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
64 *p++ = size >> 5;
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
65 *p = (size & 0x1F) << 3;
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
66 memcpy(s->buf_ptr, buff, size);
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
67 s->buf_ptr += size;
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
68 } else {
2551
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
69 max_packet_size = s->max_payload_size - 4;
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
70 p = s->buf;
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
71 p[0] = 0;
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
72 p[1] = 16;
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
73 while (size > 0) {
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
74 len = FFMIN(size, max_packet_size);
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
75 p[2] = len >> 5;
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
76 p[3] = (size & 0x1F) << 3;
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
77 memcpy(p + 4, buff, len);
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
78 ff_rtp_send_data(s1, p, len + 4, len == size);
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
79 size -= len;
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
80 buff += len;
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
81 }
2550
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
82 }
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
83 }