Libav
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavformat
rtpenc_h264.c
Go to the documentation of this file.
1
/*
2
* RTP packetization for H.264 (RFC3984)
3
* Copyright (c) 2008 Luca Abeni
4
*
5
* This file is part of Libav.
6
*
7
* Libav 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
* Libav 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 Libav; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
28
#include "
avformat.h
"
29
#include "
avc.h
"
30
#include "
rtpenc.h
"
31
32
static
const
uint8_t
*
avc_mp4_find_startcode
(
const
uint8_t
*start,
const
uint8_t
*end,
int
nal_length_size)
33
{
34
unsigned
int
res = 0;
35
36
if
(end - start < nal_length_size)
37
return
NULL
;
38
while
(nal_length_size--)
39
res = (res << 8) | *start++;
40
41
if
(res > end - start)
42
return
NULL
;
43
44
return
start + res;
45
}
46
47
static
void
nal_send
(
AVFormatContext
*s1,
const
uint8_t
*buf,
int
size
,
int
last)
48
{
49
RTPMuxContext
*s = s1->
priv_data
;
50
51
av_log
(s1,
AV_LOG_DEBUG
,
"Sending NAL %x of len %d M=%d\n"
, buf[0] & 0x1F, size, last);
52
if
(size <= s->max_payload_size) {
53
ff_rtp_send_data
(s1, buf, size, last);
54
}
else
{
55
uint8_t
type = buf[0] & 0x1F;
56
uint8_t
nri = buf[0] & 0x60;
57
58
if
(s->
flags
&
FF_RTP_FLAG_H264_MODE0
) {
59
av_log
(s1,
AV_LOG_ERROR
,
60
"NAL size %d > %d, try -slice-max-size %d\n"
, size,
61
s->
max_payload_size
, s->
max_payload_size
);
62
return
;
63
}
64
av_log
(s1,
AV_LOG_DEBUG
,
"NAL size %d > %d\n"
, size, s->
max_payload_size
);
65
s->
buf
[0] = 28;
/* FU Indicator; Type = 28 ---> FU-A */
66
s->
buf
[0] |= nri;
67
s->
buf
[1] = type;
68
s->
buf
[1] |= 1 << 7;
69
buf += 1;
70
size -= 1;
71
while
(size + 2 > s->
max_payload_size
) {
72
memcpy(&s->
buf
[2], buf, s->
max_payload_size
- 2);
73
ff_rtp_send_data
(s1, s->
buf
, s->
max_payload_size
, 0);
74
buf += s->
max_payload_size
- 2;
75
size -= s->
max_payload_size
- 2;
76
s->
buf
[1] &= ~(1 << 7);
77
}
78
s->
buf
[1] |= 1 << 6;
79
memcpy(&s->
buf
[2], buf, size);
80
ff_rtp_send_data
(s1, s->
buf
, size + 2, last);
81
}
82
}
83
84
void
ff_rtp_send_h264
(
AVFormatContext
*s1,
const
uint8_t
*buf1,
int
size
)
85
{
86
const
uint8_t
*
r
, *end = buf1 +
size
;
87
RTPMuxContext
*s = s1->
priv_data
;
88
89
s->
timestamp
= s->
cur_timestamp
;
90
if
(s->
nal_length_size
)
91
r =
avc_mp4_find_startcode
(buf1, end, s->
nal_length_size
) ? buf1 : end;
92
else
93
r =
ff_avc_find_startcode
(buf1, end);
94
while
(r < end) {
95
const
uint8_t
*r1;
96
97
if
(s->
nal_length_size
) {
98
r1 =
avc_mp4_find_startcode
(r, end, s->
nal_length_size
);
99
if
(!r1)
100
r1 = end;
101
r += s->
nal_length_size
;
102
}
else
{
103
while
(!*(r++));
104
r1 =
ff_avc_find_startcode
(r, end);
105
}
106
nal_send
(s1, r, r1 - r, r1 == end);
107
r = r1;
108
}
109
}
size
int size
Definition:
twinvq_data.h:11134
ff_avc_find_startcode
const uint8_t * ff_avc_find_startcode(const uint8_t *p, const uint8_t *end)
Definition:
avc.c:64
RTPMuxContext::max_payload_size
int max_payload_size
Definition:
rtpenc.h:38
RTPMuxContext::nal_length_size
int nal_length_size
Number of bytes used for H.264 NAL length, if the MP4 syntax is used (1, 2 or 4)
Definition:
rtpenc.h:58
AVFormatContext
Format I/O context.
Definition:
avformat.h:922
uint8_t
uint8_t
Definition:
audio_convert.c:194
RTPMuxContext::buf
uint8_t * buf
Definition:
rtpenc.h:49
r
#define r
Definition:
input.c:51
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition:
log.h:123
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition:
log.h:144
av_log
void av_log(void *avcl, int level, const char *fmt,...)
Definition:
log.c:169
avc_mp4_find_startcode
static const uint8_t * avc_mp4_find_startcode(const uint8_t *start, const uint8_t *end, int nal_length_size)
Definition:
rtpenc_h264.c:32
FF_RTP_FLAG_H264_MODE0
#define FF_RTP_FLAG_H264_MODE0
Definition:
rtpenc.h:70
rtpenc.h
ff_rtp_send_data
void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m)
Definition:
rtpenc.c:313
RTPMuxContext
Definition:
rtpenc.h:27
avc.h
RTPMuxContext::cur_timestamp
uint32_t cur_timestamp
Definition:
rtpenc.h:37
NULL
NULL
Definition:
eval.c:55
nal_send
static void nal_send(AVFormatContext *s1, const uint8_t *buf, int size, int last)
Definition:
rtpenc_h264.c:47
RTPMuxContext::flags
int flags
Definition:
rtpenc.h:60
avformat.h
Main libavformat public API header.
RTPMuxContext::timestamp
uint32_t timestamp
Definition:
rtpenc.h:35
AVFormatContext::priv_data
void * priv_data
Format private data.
Definition:
avformat.h:950
ff_rtp_send_h264
void ff_rtp_send_h264(AVFormatContext *s1, const uint8_t *buf1, int size)
Definition:
rtpenc_h264.c:84
Generated on Sun Jun 12 2016 21:54:24 for Libav by
1.8.8