Mercurial > libavformat.hg
annotate rtpenc_h264.c @ 6491:b7f807b4cd88 libavformat tip
In mov demuxer, check that nb_streams is valid before using it in read_dac3
| author | bcoudurier |
|---|---|
| date | Tue, 28 Sep 2010 00:33:21 +0000 |
| parents | 178de7695c6c |
| children |
| 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 /** | |
|
5969
178de7695c6c
Remove explicit filename from Doxygen @file commands.
diego
parents:
4944
diff
changeset
|
23 * @file |
| 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 } |
