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