annotate rtpenc_aac.c @ 6455:3f50c7effad1 libavformat

rtsp: 10l, try to update the correct rtp stream This fixes a bug from rev 22917. Now RTSP streams where the individual RTCP sender reports aren't sent at the same time actually are synced properly.
author mstorsjo
date Fri, 03 Sep 2010 07:10:21 +0000
parents e09092917f7e
children
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
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
24
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
25 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
26 {
4388
80f21f72d7d6 Split rtp.h in rtp.h, rtpdec.h, and rtpenc.h
lucabe
parents: 4380
diff changeset
27 RTPMuxContext *s = s1->priv_data;
2550
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
28 int len, max_packet_size;
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
29 uint8_t *p;
4843
744f14413d22 AAC packetiser cleanup: use consts instead of #defines
lucabe
parents: 4842
diff changeset
30 const int max_frames_per_packet = s->max_frames_per_packet ? s->max_frames_per_packet : 5;
744f14413d22 AAC packetiser cleanup: use consts instead of #defines
lucabe
parents: 4842
diff changeset
31 const int max_au_headers_size = 2 + 2 * max_frames_per_packet;
2550
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 }
4843
744f14413d22 AAC packetiser cleanup: use consts instead of #defines
lucabe
parents: 4842
diff changeset
38 max_packet_size = s->max_payload_size - max_au_headers_size;
2550
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);
4843
744f14413d22 AAC packetiser cleanup: use consts instead of #defines
lucabe
parents: 4842
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
4843
744f14413d22 AAC packetiser cleanup: use consts instead of #defines
lucabe
parents: 4842
diff changeset
45 p = s->buf + max_au_headers_size - au_size - 2;
2550
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) {
4843
744f14413d22 AAC packetiser cleanup: use consts instead of #defines
lucabe
parents: 4842
diff changeset
58 s->buf_ptr = s->buf + max_au_headers_size;
2550
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 {
4970
04c546a9a3fd Correctly set the "AU size" field in the payload header for
lucabe
parents: 4843
diff changeset
69 int au_size = size;
04c546a9a3fd Correctly set the "AU size" field in the payload header for
lucabe
parents: 4843
diff changeset
70
2551
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
71 max_packet_size = s->max_payload_size - 4;
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
72 p = s->buf;
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
73 p[0] = 0;
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
74 p[1] = 16;
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
75 while (size > 0) {
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
76 len = FFMIN(size, max_packet_size);
4970
04c546a9a3fd Correctly set the "AU size" field in the payload header for
lucabe
parents: 4843
diff changeset
77 p[2] = au_size >> 5;
04c546a9a3fd Correctly set the "AU size" field in the payload header for
lucabe
parents: 4843
diff changeset
78 p[3] = (au_size & 0x1F) << 3;
2551
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
79 memcpy(p + 4, buff, len);
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
80 ff_rtp_send_data(s1, p, len + 4, len == size);
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
81 size -= len;
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
82 buff += len;
be9b08eba612 Support fragmentation for AAC frames
lucabe
parents: 2550
diff changeset
83 }
2550
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
84 }
e9c34ec665c6 Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
diff changeset
85 }