ffmpeg / libavformat / rtpenc_h264.c @ 2912e87a
History | View | Annotate | Download (2.47 KB)
1 | f79bfe48 | Luca Abeni | /*
|
---|---|---|---|
2 | * RTP packetization for H.264 (RFC3984)
|
||
3 | 406792e7 | Diego Biurrun | * Copyright (c) 2008 Luca Abeni
|
4 | f79bfe48 | Luca Abeni | *
|
5 | 2912e87a | Mans Rullgard | * This file is part of Libav.
|
6 | f79bfe48 | Luca Abeni | *
|
7 | 2912e87a | Mans Rullgard | * Libav is free software; you can redistribute it and/or
|
8 | f79bfe48 | Luca Abeni | * 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 | 2912e87a | Mans Rullgard | * Libav is distributed in the hope that it will be useful,
|
13 | f79bfe48 | Luca Abeni | * 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 | 2912e87a | Mans Rullgard | * License along with Libav; if not, write to the Free Software
|
19 | f79bfe48 | Luca Abeni | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
20 | */
|
||
21 | |||
22 | /**
|
||
23 | ba87f080 | Diego Biurrun | * @file
|
24 | f79bfe48 | Luca Abeni | * @brief H.264 packetization
|
25 | * @author Luca Abeni <lucabe72@email.it>
|
||
26 | */
|
||
27 | |||
28 | #include "avformat.h" |
||
29 | #include "avc.h" |
||
30 | 302879cb | Luca Abeni | #include "rtpenc.h" |
31 | f79bfe48 | Luca Abeni | |
32 | static void nal_send(AVFormatContext *s1, const uint8_t *buf, int size, int last) |
||
33 | { |
||
34 | 302879cb | Luca Abeni | RTPMuxContext *s = s1->priv_data; |
35 | f79bfe48 | Luca Abeni | |
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);
|
||
59 | eb853afb | Yao Peter | ff_rtp_send_data(s1, s->buf, size + 2, last);
|
60 | f79bfe48 | Luca Abeni | } |
61 | } |
||
62 | |||
63 | a56dcc57 | Reimar Döffinger | void ff_rtp_send_h264(AVFormatContext *s1, const uint8_t *buf1, int size) |
64 | f79bfe48 | Luca Abeni | { |
65 | a56dcc57 | Reimar Döffinger | const uint8_t *r;
|
66 | 302879cb | Luca Abeni | RTPMuxContext *s = s1->priv_data; |
67 | f79bfe48 | Luca Abeni | |
68 | s->timestamp = s->cur_timestamp; |
||
69 | r = ff_avc_find_startcode(buf1, buf1 + size); |
||
70 | while (r < buf1 + size) {
|
||
71 | a56dcc57 | Reimar Döffinger | const uint8_t *r1;
|
72 | f79bfe48 | Luca Abeni | |
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 | } |