Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavformat
rtp.c
Go to the documentation of this file.
1
/*
2
* RTP input/output format
3
* Copyright (c) 2002 Fabrice Bellard
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
22
#include <
libavutil/opt.h
>
23
#include "
avformat.h
"
24
25
#include "
rtp.h
"
26
27
//#define DEBUG
28
29
/* from http://www.iana.org/assignments/rtp-parameters last updated 05 January 2005 */
30
/* payload types >= 96 are dynamic;
31
* payload types between 72 and 76 are reserved for RTCP conflict avoidance;
32
* all the other payload types not present in the table are unassigned or
33
* reserved
34
*/
35
static
const
struct
36
{
37
int
pt
;
38
const
char
enc_name
[6];
39
enum
AVMediaType
codec_type
;
40
enum
AVCodecID
codec_id
;
41
int
clock_rate
;
42
int
audio_channels
;
43
}
AVRtpPayloadTypes
[]=
44
{
45
{0,
"PCMU"
,
AVMEDIA_TYPE_AUDIO
,
AV_CODEC_ID_PCM_MULAW
, 8000, 1},
46
{3,
"GSM"
,
AVMEDIA_TYPE_AUDIO
,
AV_CODEC_ID_NONE
, 8000, 1},
47
{4,
"G723"
,
AVMEDIA_TYPE_AUDIO
,
AV_CODEC_ID_G723_1
, 8000, 1},
48
{5,
"DVI4"
,
AVMEDIA_TYPE_AUDIO
,
AV_CODEC_ID_NONE
, 8000, 1},
49
{6,
"DVI4"
,
AVMEDIA_TYPE_AUDIO
,
AV_CODEC_ID_NONE
, 16000, 1},
50
{7,
"LPC"
,
AVMEDIA_TYPE_AUDIO
,
AV_CODEC_ID_NONE
, 8000, 1},
51
{8,
"PCMA"
,
AVMEDIA_TYPE_AUDIO
,
AV_CODEC_ID_PCM_ALAW
, 8000, 1},
52
{9,
"G722"
,
AVMEDIA_TYPE_AUDIO
,
AV_CODEC_ID_ADPCM_G722
, 8000, 1},
53
{10,
"L16"
,
AVMEDIA_TYPE_AUDIO
,
AV_CODEC_ID_PCM_S16BE
, 44100, 2},
54
{11,
"L16"
,
AVMEDIA_TYPE_AUDIO
,
AV_CODEC_ID_PCM_S16BE
, 44100, 1},
55
{12,
"QCELP"
,
AVMEDIA_TYPE_AUDIO
,
AV_CODEC_ID_QCELP
, 8000, 1},
56
{13,
"CN"
,
AVMEDIA_TYPE_AUDIO
,
AV_CODEC_ID_NONE
, 8000, 1},
57
{14,
"MPA"
,
AVMEDIA_TYPE_AUDIO
,
AV_CODEC_ID_MP2
, -1, -1},
58
{14,
"MPA"
,
AVMEDIA_TYPE_AUDIO
,
AV_CODEC_ID_MP3
, -1, -1},
59
{15,
"G728"
,
AVMEDIA_TYPE_AUDIO
,
AV_CODEC_ID_NONE
, 8000, 1},
60
{16,
"DVI4"
,
AVMEDIA_TYPE_AUDIO
,
AV_CODEC_ID_NONE
, 11025, 1},
61
{17,
"DVI4"
,
AVMEDIA_TYPE_AUDIO
,
AV_CODEC_ID_NONE
, 22050, 1},
62
{18,
"G729"
,
AVMEDIA_TYPE_AUDIO
,
AV_CODEC_ID_NONE
, 8000, 1},
63
{25,
"CelB"
,
AVMEDIA_TYPE_VIDEO
,
AV_CODEC_ID_NONE
, 90000, -1},
64
{26,
"JPEG"
,
AVMEDIA_TYPE_VIDEO
,
AV_CODEC_ID_MJPEG
, 90000, -1},
65
{28,
"nv"
,
AVMEDIA_TYPE_VIDEO
,
AV_CODEC_ID_NONE
, 90000, -1},
66
{31,
"H261"
,
AVMEDIA_TYPE_VIDEO
,
AV_CODEC_ID_H261
, 90000, -1},
67
{32,
"MPV"
,
AVMEDIA_TYPE_VIDEO
,
AV_CODEC_ID_MPEG1VIDEO
, 90000, -1},
68
{32,
"MPV"
,
AVMEDIA_TYPE_VIDEO
,
AV_CODEC_ID_MPEG2VIDEO
, 90000, -1},
69
{33,
"MP2T"
,
AVMEDIA_TYPE_DATA
,
AV_CODEC_ID_MPEG2TS
, 90000, -1},
70
{34,
"H263"
,
AVMEDIA_TYPE_VIDEO
,
AV_CODEC_ID_H263
, 90000, -1},
71
{-1,
""
,
AVMEDIA_TYPE_UNKNOWN
,
AV_CODEC_ID_NONE
, -1, -1}
72
};
73
74
int
ff_rtp_get_codec_info
(
AVCodecContext
*codec,
int
payload_type)
75
{
76
int
i = 0;
77
78
for
(i = 0;
AVRtpPayloadTypes
[i].pt >= 0; i++)
79
if
(
AVRtpPayloadTypes
[i].
pt
== payload_type) {
80
if
(
AVRtpPayloadTypes
[i].
codec_id
!=
AV_CODEC_ID_NONE
) {
81
codec->
codec_type
=
AVRtpPayloadTypes
[i].codec_type;
82
codec->
codec_id
=
AVRtpPayloadTypes
[i].codec_id;
83
if
(
AVRtpPayloadTypes
[i].
audio_channels
> 0)
84
codec->
channels
=
AVRtpPayloadTypes
[i].audio_channels;
85
if
(
AVRtpPayloadTypes
[i].
clock_rate
> 0)
86
codec->
sample_rate
=
AVRtpPayloadTypes
[i].clock_rate;
87
return
0;
88
}
89
}
90
return
-1;
91
}
92
93
int
ff_rtp_get_payload_type
(
AVFormatContext
*fmt,
94
AVCodecContext
*codec,
int
idx)
95
{
96
int
i;
97
AVOutputFormat
*ofmt = fmt ? fmt->
oformat
:
NULL
;
98
99
/* Was the payload type already specified for the RTP muxer? */
100
if
(ofmt && ofmt->
priv_class
&& fmt->
priv_data
) {
101
int64_t payload_type;
102
if
(
av_opt_get_int
(fmt->
priv_data
,
"payload_type"
, 0, &payload_type) >= 0 &&
103
payload_type >= 0)
104
return
(
int
)payload_type;
105
}
106
107
/* static payload type */
108
for
(i = 0;
AVRtpPayloadTypes
[i].pt >= 0; ++i)
109
if
(
AVRtpPayloadTypes
[i].
codec_id
== codec->
codec_id
) {
110
if
(codec->
codec_id
==
AV_CODEC_ID_H263
&& (!fmt || !fmt->
oformat
||
111
!fmt->
oformat
->
priv_class
|| !fmt->
priv_data
||
112
!
av_opt_flag_is_set
(fmt->
priv_data
,
"rtpflags"
,
"rfc2190"
)))
113
continue
;
114
/* G722 has 8000 as nominal rate even if the sample rate is 16000,
115
* see section 4.5.2 in RFC 3551. */
116
if
(codec->
codec_id
==
AV_CODEC_ID_ADPCM_G722
&&
117
codec->
sample_rate
== 16000 && codec->
channels
== 1)
118
return
AVRtpPayloadTypes
[i].pt;
119
if
(codec->
codec_type
==
AVMEDIA_TYPE_AUDIO
&&
120
((
AVRtpPayloadTypes
[i].clock_rate > 0 &&
121
codec->
sample_rate
!=
AVRtpPayloadTypes
[i].clock_rate) ||
122
(
AVRtpPayloadTypes
[i].audio_channels > 0 &&
123
codec->
channels
!=
AVRtpPayloadTypes
[i].audio_channels)))
124
continue
;
125
return
AVRtpPayloadTypes
[i].pt;
126
}
127
128
if
(idx < 0)
129
idx = codec->
codec_type
==
AVMEDIA_TYPE_AUDIO
;
130
131
/* dynamic payload type */
132
return
RTP_PT_PRIVATE
+ idx;
133
}
134
135
const
char
*
ff_rtp_enc_name
(
int
payload_type)
136
{
137
int
i;
138
139
for
(i = 0;
AVRtpPayloadTypes
[i].pt >= 0; i++)
140
if
(
AVRtpPayloadTypes
[i].
pt
== payload_type) {
141
return
AVRtpPayloadTypes
[i].enc_name;
142
}
143
144
return
""
;
145
}
146
147
enum
AVCodecID
ff_rtp_codec_id
(
const
char
*buf,
enum
AVMediaType
codec_type
)
148
{
149
int
i;
150
151
for
(i = 0;
AVRtpPayloadTypes
[i].pt >= 0; i++)
152
if
(!strcmp(buf,
AVRtpPayloadTypes
[i].
enc_name
) && (codec_type ==
AVRtpPayloadTypes
[i].codec_type)){
153
return
AVRtpPayloadTypes
[i].codec_id;
154
}
155
156
return
AV_CODEC_ID_NONE
;
157
}