FFmpeg
libavformat
rtpenc_aac.c
Go to the documentation of this file.
1
/*
2
* copyright (c) 2007 Luca Abeni
3
*
4
* This file is part of FFmpeg.
5
*
6
* FFmpeg is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.1 of the License, or (at your option) any later version.
10
*
11
* FFmpeg is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with FFmpeg; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
*/
20
21
#include "
libavutil/intreadwrite.h
"
22
23
#include "
avformat.h
"
24
#include "
rtpenc.h
"
25
26
27
void
ff_rtp_send_aac
(
AVFormatContext
*
s1
,
const
uint8_t *buff,
int
size
)
28
{
29
RTPMuxContext
*
s
=
s1
->priv_data;
30
AVStream
*
st
=
s1
->streams[0];
31
const
int
max_au_headers_size = 2 + 2 *
s
->max_frames_per_packet;
32
int
len
, max_packet_size =
s
->max_payload_size - max_au_headers_size;
33
uint8_t *p;
34
35
/* skip ADTS header, if present */
36
if
((
s1
->streams[0]->codecpar->extradata_size) == 0) {
37
size
-= 7;
38
buff += 7;
39
}
40
41
/* test if the packet must be sent */
42
len
= (
s
->buf_ptr -
s
->buf);
43
if
(
s
->num_frames &&
44
(
s
->num_frames ==
s
->max_frames_per_packet ||
45
(
len
+
size
) >
s
->max_payload_size ||
46
av_compare_ts
(
s
->cur_timestamp -
s
->timestamp,
st
->
time_base
,
47
s1
->max_delay,
AV_TIME_BASE_Q
) >= 0)) {
48
int
au_size =
s
->num_frames * 2;
49
50
p =
s
->buf + max_au_headers_size - au_size - 2;
51
if
(p !=
s
->buf) {
52
memmove(p + 2,
s
->buf + 2, au_size);
53
}
54
/* Write the AU header size */
55
AV_WB16
(p, au_size * 8);
56
57
ff_rtp_send_data
(
s1
, p,
s
->buf_ptr - p, 1);
58
59
s
->num_frames = 0;
60
}
61
if
(
s
->num_frames == 0) {
62
s
->buf_ptr =
s
->buf + max_au_headers_size;
63
s
->timestamp =
s
->cur_timestamp;
64
}
65
66
if
(
size
<= max_packet_size) {
67
p =
s
->buf +
s
->num_frames++ * 2 + 2;
68
AV_WB16
(p,
size
* 8);
69
memcpy(
s
->buf_ptr, buff,
size
);
70
s
->buf_ptr +=
size
;
71
}
else
{
72
int
au_size =
size
;
73
74
max_packet_size =
s
->max_payload_size - 4;
75
p =
s
->buf;
76
AV_WB16
(p, 2 * 8);
77
while
(
size
> 0) {
78
len
=
FFMIN
(
size
, max_packet_size);
79
AV_WB16
(&p[2], au_size * 8);
80
memcpy(p + 4, buff,
len
);
81
ff_rtp_send_data
(
s1
, p,
len
+ 4,
len
==
size
);
82
size
-=
len
;
83
buff +=
len
;
84
}
85
}
86
}
av_compare_ts
int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b)
Compare two timestamps each in its own time base.
Definition:
mathematics.c:147
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition:
avutil.h:260
ff_rtp_send_data
void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m)
Definition:
rtpenc.c:335
RTPMuxContext::st
AVStream * st
Definition:
rtpenc.h:30
ff_rtp_send_aac
void ff_rtp_send_aac(AVFormatContext *s1, const uint8_t *buff, int size)
Definition:
rtpenc_aac.c:27
intreadwrite.h
s
#define s(width, name)
Definition:
cbs_vp9.c:256
s1
#define s1
Definition:
regdef.h:38
AVFormatContext
Format I/O context.
Definition:
avformat.h:1104
AVStream::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition:
avformat.h:877
AV_WB16
#define AV_WB16(p, v)
Definition:
intreadwrite.h:405
RTPMuxContext
Definition:
rtpenc.h:27
size
int size
Definition:
twinvq_data.h:10344
FFMIN
#define FFMIN(a, b)
Definition:
macros.h:49
len
int len
Definition:
vorbis_enc_data.h:426
rtpenc.h
AVStream
Stream structure.
Definition:
avformat.h:838
avformat.h
Generated on Tue Feb 28 2023 21:34:09 for FFmpeg by
1.8.17