FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavformat
srtpproto.c
Go to the documentation of this file.
1
/*
2
* SRTP network protocol
3
* Copyright (c) 2012 Martin Storsjo
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
#include "
avio_internal.h
"
25
#include "
url.h
"
26
27
#include "
internal.h
"
28
#include "
rtpdec.h
"
29
#include "
srtp.h
"
30
31
typedef
struct
SRTPProtoContext
{
32
const
AVClass
*
class
;
33
URLContext
*
rtp_hd
;
34
const
char
*
out_suite
, *
out_params
;
35
const
char
*
in_suite
, *
in_params
;
36
struct
SRTPContext
srtp_out,
srtp_in
;
37
uint8_t
encryptbuf
[
RTP_MAX_PACKET_LENGTH
];
38
}
SRTPProtoContext
;
39
40
#define D AV_OPT_FLAG_DECODING_PARAM
41
#define E AV_OPT_FLAG_ENCODING_PARAM
42
static
const
AVOption
options
[] = {
43
{
"srtp_out_suite"
,
""
, offsetof(
SRTPProtoContext
, out_suite),
AV_OPT_TYPE_STRING
, { .str =
NULL
}, 0, 0,
E
},
44
{
"srtp_out_params"
,
""
, offsetof(
SRTPProtoContext
, out_params),
AV_OPT_TYPE_STRING
, { .str =
NULL
}, 0, 0,
E
},
45
{
"srtp_in_suite"
,
""
, offsetof(
SRTPProtoContext
, in_suite),
AV_OPT_TYPE_STRING
, { .str =
NULL
}, 0, 0,
D
},
46
{
"srtp_in_params"
,
""
, offsetof(
SRTPProtoContext
, in_params),
AV_OPT_TYPE_STRING
, { .str =
NULL
}, 0, 0,
D
},
47
{
NULL
}
48
};
49
50
static
const
AVClass
srtp_context_class
= {
51
.
class_name
=
"srtp"
,
52
.item_name =
av_default_item_name
,
53
.option =
options
,
54
.version =
LIBAVUTIL_VERSION_INT
,
55
};
56
57
static
int
srtp_close
(
URLContext
*h)
58
{
59
SRTPProtoContext
*
s
= h->
priv_data
;
60
ff_srtp_free
(&s->srtp_out);
61
ff_srtp_free
(&s->
srtp_in
);
62
ffurl_close
(s->
rtp_hd
);
63
s->
rtp_hd
=
NULL
;
64
return
0;
65
}
66
67
static
int
srtp_open
(
URLContext
*h,
const
char
*uri,
int
flags
)
68
{
69
SRTPProtoContext
*
s
= h->
priv_data
;
70
char
hostname[256],
buf
[1024], path[1024];
71
int
rtp_port,
ret
;
72
73
if
(s->
out_suite
&& s->
out_params
)
74
if
((ret =
ff_srtp_set_crypto
(&s->srtp_out, s->
out_suite
, s->
out_params
)) < 0)
75
goto
fail;
76
if
(s->
in_suite
&& s->
in_params
)
77
if
((ret =
ff_srtp_set_crypto
(&s->
srtp_in
, s->
in_suite
, s->
in_params
)) < 0)
78
goto
fail;
79
80
av_url_split
(
NULL
, 0,
NULL
, 0, hostname,
sizeof
(hostname), &rtp_port,
81
path,
sizeof
(path), uri);
82
ff_url_join
(buf,
sizeof
(buf),
"rtp"
,
NULL
, hostname, rtp_port,
"%s"
, path);
83
if
((ret =
ffurl_open
(&s->
rtp_hd
, buf, flags, &h->
interrupt_callback
,
NULL
)) < 0)
84
goto
fail;
85
86
h->
max_packet_size
=
FFMIN
(s->
rtp_hd
->
max_packet_size
,
87
sizeof
(s->
encryptbuf
)) - 14;
88
h->
is_streamed
= 1;
89
return
0;
90
91
fail:
92
srtp_close
(h);
93
return
ret
;
94
}
95
96
static
int
srtp_read
(
URLContext
*h,
uint8_t
*
buf
,
int
size
)
97
{
98
SRTPProtoContext
*
s
= h->
priv_data
;
99
int
ret
;
100
start
:
101
ret =
ffurl_read
(s->
rtp_hd
, buf, size);
102
if
(ret > 0 && s->
srtp_in
.
aes
) {
103
if
(
ff_srtp_decrypt
(&s->
srtp_in
, buf, &ret) < 0)
104
goto
start
;
105
}
106
return
ret
;
107
}
108
109
static
int
srtp_write
(
URLContext
*h,
const
uint8_t
*
buf
,
int
size
)
110
{
111
SRTPProtoContext
*
s
= h->
priv_data
;
112
if
(!s->srtp_out.aes)
113
return
ffurl_write
(s->
rtp_hd
, buf, size);
114
size =
ff_srtp_encrypt
(&s->srtp_out, buf, size, s->
encryptbuf
,
115
sizeof
(s->
encryptbuf
));
116
if
(size < 0)
117
return
size
;
118
return
ffurl_write
(s->
rtp_hd
, s->
encryptbuf
, size);
119
}
120
121
static
int
srtp_get_file_handle
(
URLContext
*h)
122
{
123
SRTPProtoContext
*
s
= h->
priv_data
;
124
return
ffurl_get_file_handle
(s->
rtp_hd
);
125
}
126
127
static
int
srtp_get_multi_file_handle
(
URLContext
*h,
int
**handles,
128
int
*numhandles)
129
{
130
SRTPProtoContext
*
s
= h->
priv_data
;
131
return
ffurl_get_multi_file_handle
(s->
rtp_hd
, handles, numhandles);
132
}
133
134
URLProtocol
ff_srtp_protocol
= {
135
.
name
=
"srtp"
,
136
.url_open =
srtp_open
,
137
.url_read =
srtp_read
,
138
.url_write =
srtp_write
,
139
.url_close =
srtp_close
,
140
.url_get_file_handle =
srtp_get_file_handle
,
141
.url_get_multi_file_handle =
srtp_get_multi_file_handle
,
142
.priv_data_size =
sizeof
(
SRTPProtoContext
),
143
.priv_data_class = &srtp_context_class,
144
.
flags
=
URL_PROTOCOL_FLAG_NETWORK
,
145
};
Generated on Sun Mar 8 2015 02:35:12 for FFmpeg by
1.8.2