Mercurial > libavformat.hg
annotate rtpenc_h264.c @ 5041:573d181e477c libavformat
Set restrictions on packet_size, as per ISO-11172 / H-222 specifications
(max packet size should fit in 13 bits as a kB value, so 1<<23, plus the
header which is 10 bytes), and as per mpegenc.c internal assumptions
(min packet size is 20 bytes). See "[PATCH] make packet_size in
AVFormatContext unsigned" thread.
author | rbultje |
---|---|
date | Wed, 17 Jun 2009 19:04:02 +0000 |
parents | 4c1e9b3799a4 |
children | 178de7695c6c |
rev | line source |
---|---|
2960 | 1 /* |
2 * RTP packetization for H.264 (RFC3984) | |
4251
77e0c7511d41
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
3052
diff
changeset
|
3 * Copyright (c) 2008 Luca Abeni |
2960 | 4 * |
5 * This file is part of FFmpeg. | |
6 * | |
7 * FFmpeg is free software; you can redistribute it and/or | |
8 * modify it under the terms of the GNU Lesser General Public | |
9 * License as published by the Free Software Foundation; either | |
10 * version 2.1 of the License, or (at your option) any later version. | |
11 * | |
12 * FFmpeg is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
18 * License along with FFmpeg; if not, write to the Free Software | |
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
20 */ | |
21 | |
22 /** | |
4331
49c1d3b27727
Use full internal pathname in doxygen @file directives.
diego
parents:
4251
diff
changeset
|
23 * @file libavformat/rtpenc_h264.c |
2960 | 24 * @brief H.264 packetization |
25 * @author Luca Abeni <lucabe72@email.it> | |
26 */ | |
27 | |
28 #include "avformat.h" | |
29 #include "avc.h" | |
4388 | 30 #include "rtpenc.h" |
2960 | 31 |
32 static void nal_send(AVFormatContext *s1, const uint8_t *buf, int size, int last) | |
33 { | |
4388 | 34 RTPMuxContext *s = s1->priv_data; |
2960 | 35 |
36 av_log(s1, AV_LOG_DEBUG, "Sending NAL %x of len %d M=%d\n", buf[0] & 0x1F, size, last); | |
37 if (size <= s->max_payload_size) { | |
38 ff_rtp_send_data(s1, buf, size, last); | |
39 } else { | |
40 uint8_t type = buf[0] & 0x1F; | |
41 uint8_t nri = buf[0] & 0x60; | |
42 | |
43 av_log(s1, AV_LOG_DEBUG, "NAL size %d > %d\n", size, s->max_payload_size); | |
44 s->buf[0] = 28; /* FU Indicator; Type = 28 ---> FU-A */ | |
45 s->buf[0] |= nri; | |
46 s->buf[1] = type; | |
47 s->buf[1] |= 1 << 7; | |
48 buf += 1; | |
49 size -= 1; | |
50 while (size + 2 > s->max_payload_size) { | |
51 memcpy(&s->buf[2], buf, s->max_payload_size - 2); | |
52 ff_rtp_send_data(s1, s->buf, s->max_payload_size, 0); | |
53 buf += s->max_payload_size - 2; | |
54 size -= s->max_payload_size - 2; | |
55 s->buf[1] &= ~(1 << 7); | |
56 } | |
57 s->buf[1] |= 1 << 6; | |
58 memcpy(&s->buf[2], buf, size); | |
4944 | 59 ff_rtp_send_data(s1, s->buf, size + 2, last); |
2960 | 60 } |
61 } | |
62 | |
3052 | 63 void ff_rtp_send_h264(AVFormatContext *s1, const uint8_t *buf1, int size) |
2960 | 64 { |
3052 | 65 const uint8_t *r; |
4388 | 66 RTPMuxContext *s = s1->priv_data; |
2960 | 67 |
68 s->timestamp = s->cur_timestamp; | |
69 r = ff_avc_find_startcode(buf1, buf1 + size); | |
70 while (r < buf1 + size) { | |
3052 | 71 const uint8_t *r1; |
2960 | 72 |
73 while(!*(r++)); | |
74 r1 = ff_avc_find_startcode(r, buf1 + size); | |
75 nal_send(s1, r, r1 - r, (r1 == buf1 + size)); | |
76 r = r1; | |
77 } | |
78 } |