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
CodecID
codec_id
;
41
int
clock_rate
;
42
int
audio_channels
;
43
}
AVRtpPayloadTypes
[]=
44
{
45
{0,
"PCMU"
,
AVMEDIA_TYPE_AUDIO
,
CODEC_ID_PCM_MULAW
, 8000, 1},
46
{3,
"GSM"
,
AVMEDIA_TYPE_AUDIO
,
CODEC_ID_NONE
, 8000, 1},
47
{4,
"G723"
,
AVMEDIA_TYPE_AUDIO
,
CODEC_ID_NONE
, 8000, 1},
48
{5,
"DVI4"
,
AVMEDIA_TYPE_AUDIO
,
CODEC_ID_NONE
, 8000, 1},
49
{6,
"DVI4"
,
AVMEDIA_TYPE_AUDIO
,
CODEC_ID_NONE
, 16000, 1},
50
{7,
"LPC"
,
AVMEDIA_TYPE_AUDIO
,
CODEC_ID_NONE
, 8000, 1},
51
{8,
"PCMA"
,
AVMEDIA_TYPE_AUDIO
,
CODEC_ID_PCM_ALAW
, 8000, 1},
52
{9,
"G722"
,
AVMEDIA_TYPE_AUDIO
,
CODEC_ID_ADPCM_G722
, 8000, 1},
53
{10,
"L16"
,
AVMEDIA_TYPE_AUDIO
,
CODEC_ID_PCM_S16BE
, 44100, 2},
54
{11,
"L16"
,
AVMEDIA_TYPE_AUDIO
,
CODEC_ID_PCM_S16BE
, 44100, 1},
55
{12,
"QCELP"
,
AVMEDIA_TYPE_AUDIO
,
CODEC_ID_QCELP
, 8000, 1},
56
{13,
"CN"
,
AVMEDIA_TYPE_AUDIO
,
CODEC_ID_NONE
, 8000, 1},
57
{14,
"MPA"
,
AVMEDIA_TYPE_AUDIO
,
CODEC_ID_MP2
, -1, -1},
58
{14,
"MPA"
,
AVMEDIA_TYPE_AUDIO
,
CODEC_ID_MP3
, -1, -1},
59
{15,
"G728"
,
AVMEDIA_TYPE_AUDIO
,
CODEC_ID_NONE
, 8000, 1},
60
{16,
"DVI4"
,
AVMEDIA_TYPE_AUDIO
,
CODEC_ID_NONE
, 11025, 1},
61
{17,
"DVI4"
,
AVMEDIA_TYPE_AUDIO
,
CODEC_ID_NONE
, 22050, 1},
62
{18,
"G729"
,
AVMEDIA_TYPE_AUDIO
,
CODEC_ID_NONE
, 8000, 1},
63
{25,
"CelB"
,
AVMEDIA_TYPE_VIDEO
,
CODEC_ID_NONE
, 90000, -1},
64
{26,
"JPEG"
,
AVMEDIA_TYPE_VIDEO
,
CODEC_ID_MJPEG
, 90000, -1},
65
{28,
"nv"
,
AVMEDIA_TYPE_VIDEO
,
CODEC_ID_NONE
, 90000, -1},
66
{31,
"H261"
,
AVMEDIA_TYPE_VIDEO
,
CODEC_ID_H261
, 90000, -1},
67
{32,
"MPV"
,
AVMEDIA_TYPE_VIDEO
,
CODEC_ID_MPEG1VIDEO
, 90000, -1},
68
{32,
"MPV"
,
AVMEDIA_TYPE_VIDEO
,
CODEC_ID_MPEG2VIDEO
, 90000, -1},
69
{33,
"MP2T"
,
AVMEDIA_TYPE_DATA
,
CODEC_ID_MPEG2TS
, 90000, -1},
70
{34,
"H263"
,
AVMEDIA_TYPE_VIDEO
,
CODEC_ID_H263
, 90000, -1},
71
{-1,
""
,
AVMEDIA_TYPE_UNKNOWN
,
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
!=
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,
AVCodecContext
*codec)
94
{
95
int
i;
96
AVOutputFormat
*ofmt = fmt ? fmt->
oformat
:
NULL
;
97
98
/* Was the payload type already specified for the RTP muxer? */
99
if
(ofmt && ofmt->
priv_class
) {
100
int64_t payload_type;
101
if
(
av_opt_get_int
(fmt->
priv_data
,
"payload_type"
, 0, &payload_type) >= 0 &&
102
payload_type >= 0)
103
return
(
int
)payload_type;
104
}
105
106
/* static payload type */
107
for
(i = 0;
AVRtpPayloadTypes
[i].pt >= 0; ++i)
108
if
(
AVRtpPayloadTypes
[i].
codec_id
== codec->
codec_id
) {
109
if
(codec->
codec_id
==
CODEC_ID_H263
)
110
continue
;
111
if
(codec->
codec_id
==
CODEC_ID_PCM_S16BE
)
112
if
(codec->
channels
!=
AVRtpPayloadTypes
[i].audio_channels)
113
continue
;
114
return
AVRtpPayloadTypes
[i].pt;
115
}
116
117
/* dynamic payload type */
118
return
RTP_PT_PRIVATE
+ (codec->
codec_type
==
AVMEDIA_TYPE_AUDIO
);
119
}
120
121
const
char
*
ff_rtp_enc_name
(
int
payload_type)
122
{
123
int
i;
124
125
for
(i = 0;
AVRtpPayloadTypes
[i].pt >= 0; i++)
126
if
(
AVRtpPayloadTypes
[i].
pt
== payload_type) {
127
return
AVRtpPayloadTypes
[i].enc_name;
128
}
129
130
return
""
;
131
}
132
133
enum
CodecID
ff_rtp_codec_id
(
const
char
*buf,
enum
AVMediaType
codec_type
)
134
{
135
int
i;
136
137
for
(i = 0;
AVRtpPayloadTypes
[i].pt >= 0; i++)
138
if
(!strcmp(buf,
AVRtpPayloadTypes
[i].
enc_name
) && (codec_type ==
AVRtpPayloadTypes
[i].codec_type)){
139
return
AVRtpPayloadTypes
[i].codec_id;
140
}
141
142
return
CODEC_ID_NONE
;
143
}