Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
3fbd12d1
F
Ffmpeg
项目概览
小白菜888
/
Ffmpeg
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
Ffmpeg
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
3fbd12d1
编写于
8月 25, 2010
作者:
M
Martin Storsjö
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Handle IPv6 in the SDP demuxer
Originally committed as revision 24924 to
svn://svn.ffmpeg.org/ffmpeg/trunk
上级
94f8b2d7
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
25 addition
and
10 deletion
+25
-10
libavformat/rtsp.c
libavformat/rtsp.c
+24
-9
libavformat/rtsp.h
libavformat/rtsp.h
+1
-1
未找到文件。
libavformat/rtsp.c
浏览文件 @
3fbd12d1
...
...
@@ -204,9 +204,21 @@ static void rtsp_parse_range_npt(const char *p, int64_t *start, int64_t *end)
// av_log(NULL, AV_LOG_DEBUG, "Range End: %lld\n", *end);
}
static
int
get_sockaddr
(
const
char
*
buf
,
struct
sockaddr_storage
*
sock
)
{
struct
addrinfo
hints
,
*
ai
=
NULL
;
memset
(
&
hints
,
0
,
sizeof
(
hints
));
hints
.
ai_flags
=
AI_NUMERICHOST
;
if
(
getaddrinfo
(
buf
,
NULL
,
&
hints
,
&
ai
))
return
-
1
;
memcpy
(
sock
,
ai
->
ai_addr
,
FFMIN
(
sizeof
(
*
sock
),
ai
->
ai_addrlen
));
freeaddrinfo
(
ai
);
return
0
;
}
typedef
struct
SDPParseState
{
/* SDP only */
struct
in_addr
default_ip
;
struct
sockaddr_storage
default_ip
;
int
default_ttl
;
int
skip_media
;
///< set if an unknown m= line occurs
}
SDPParseState
;
...
...
@@ -221,7 +233,7 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
int
payload_type
,
i
;
AVStream
*
st
;
RTSPStream
*
rtsp_st
;
struct
in_addr
sdp_ip
;
struct
sockaddr_storage
sdp_ip
;
int
ttl
;
dprintf
(
s
,
"sdp: %c='%s'
\n
"
,
letter
,
buf
);
...
...
@@ -235,10 +247,10 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
if
(
strcmp
(
buf1
,
"IN"
)
!=
0
)
return
;
get_word
(
buf1
,
sizeof
(
buf1
),
&
p
);
if
(
strcmp
(
buf1
,
"IP4"
)
!=
0
)
if
(
strcmp
(
buf1
,
"IP4"
)
&&
strcmp
(
buf1
,
"IP6"
)
)
return
;
get_word_sep
(
buf1
,
sizeof
(
buf1
),
"/"
,
&
p
);
if
(
ff_inet_aton
(
buf1
,
&
sdp_ip
)
==
0
)
if
(
get_sockaddr
(
buf1
,
&
sdp_ip
)
)
return
;
ttl
=
16
;
if
(
*
p
==
'/'
)
{
...
...
@@ -1171,7 +1183,7 @@ static int make_setup_request(AVFormatContext *s, const char *host, int port,
port
=
reply
->
transports
[
0
].
port_min
;
ttl
=
reply
->
transports
[
0
].
ttl
;
}
else
{
in
=
rtsp_st
->
sdp_ip
;
in
=
((
struct
sockaddr_in
*
)
&
rtsp_st
->
sdp_ip
)
->
sin_addr
;
port
=
rtsp_st
->
sdp_port
;
ttl
=
rtsp_st
->
sdp_ttl
;
}
...
...
@@ -1996,10 +2008,10 @@ static int sdp_probe(AVProbeData *p1)
{
const
char
*
p
=
p1
->
buf
,
*
p_end
=
p1
->
buf
+
p1
->
buf_size
;
/* we look for a line beginning "c=IN IP
4
" */
/* we look for a line beginning "c=IN IP" */
while
(
p
<
p_end
&&
*
p
!=
'\0'
)
{
if
(
p
+
sizeof
(
"c=IN IP
4
"
)
-
1
<
p_end
&&
av_strstart
(
p
,
"c=IN IP
4
"
,
NULL
))
if
(
p
+
sizeof
(
"c=IN IP"
)
-
1
<
p_end
&&
av_strstart
(
p
,
"c=IN IP"
,
NULL
))
return
AVPROBE_SCORE_MAX
/
2
;
while
(
p
<
p_end
-
1
&&
*
p
!=
'\n'
)
p
++
;
...
...
@@ -2037,10 +2049,13 @@ static int sdp_read_header(AVFormatContext *s, AVFormatParameters *ap)
/* open each RTP stream */
for
(
i
=
0
;
i
<
rt
->
nb_rtsp_streams
;
i
++
)
{
char
namebuf
[
50
];
rtsp_st
=
rt
->
rtsp_streams
[
i
];
getnameinfo
((
struct
sockaddr
*
)
&
rtsp_st
->
sdp_ip
,
sizeof
(
rtsp_st
->
sdp_ip
),
namebuf
,
sizeof
(
namebuf
),
NULL
,
0
,
NI_NUMERICHOST
);
ff_url_join
(
url
,
sizeof
(
url
),
"rtp"
,
NULL
,
inet_ntoa
(
rtsp_st
->
sdp_ip
)
,
rtsp_st
->
sdp_port
,
namebuf
,
rtsp_st
->
sdp_port
,
"?localport=%d&ttl=%d"
,
rtsp_st
->
sdp_port
,
rtsp_st
->
sdp_ttl
);
if
(
url_open
(
&
rtsp_st
->
rtp_handle
,
url
,
URL_RDWR
)
<
0
)
{
...
...
libavformat/rtsp.h
浏览文件 @
3fbd12d1
...
...
@@ -327,7 +327,7 @@ typedef struct RTSPStream {
/** The following are used only in SDP, not RTSP */
//@{
int
sdp_port
;
/**< port (from SDP content) */
struct
in_addr
sdp_ip
;
/**< IP address (from SDP content) */
struct
sockaddr_storage
sdp_ip
;
/**< IP address (from SDP content) */
int
sdp_ttl
;
/**< IP Time-To-Live (from SDP content) */
int
sdp_payload_type
;
/**< payload type */
//@}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录