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
//#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
}
Generated on Sat May 25 2013 03:58:48 for FFmpeg by
1.8.2