Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-2-2
Commits
563338ed
Commit
563338ed
authored
Sep 29, 2010
by
Sébastien Escudier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use live555 asynchronous calls.
Require live555 version >= 2010.05.29
parent
5925a384
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
156 additions
and
98 deletions
+156
-98
configure.ac
configure.ac
+4
-4
modules/demux/live555.cpp
modules/demux/live555.cpp
+152
-94
No files found.
configure.ac
View file @
563338ed
...
@@ -1739,11 +1739,11 @@ if test "${enable_live555}" != "no"; then
...
@@ -1739,11 +1739,11 @@ if test "${enable_live555}" != "no"; then
CPPFLAGS="${CPPFLAGS} ${CPPFLAGS_live555}"
CPPFLAGS="${CPPFLAGS} ${CPPFLAGS_live555}"
AC_CHECK_HEADERS(liveMedia_version.hh, [
AC_CHECK_HEADERS(liveMedia_version.hh, [
AC_MSG_CHECKING(for liveMedia version >= 12
148956
00 )
AC_MSG_CHECKING(for liveMedia version >= 12
750912
00 )
AC_EGREP_CPP(yes,
AC_EGREP_CPP(yes,
[#include <liveMedia_version.hh>
[#include <liveMedia_version.hh>
#ifdef LIVEMEDIA_LIBRARY_VERSION_INT
#ifdef LIVEMEDIA_LIBRARY_VERSION_INT
#if LIVEMEDIA_LIBRARY_VERSION_INT < 12
148956
00
#if LIVEMEDIA_LIBRARY_VERSION_INT < 12
750912
00
yes
yes
#endif
#endif
#endif],
#endif],
...
@@ -1792,11 +1792,11 @@ lternatively you can use --disable-live555 to disable the liveMedia plugin.])
...
@@ -1792,11 +1792,11 @@ lternatively you can use --disable-live555 to disable the liveMedia plugin.])
AC_MSG_RESULT(${real_live555_tree}/liveMedia/libliveMedia.a)
AC_MSG_RESULT(${real_live555_tree}/liveMedia/libliveMedia.a)
AC_CHECK_HEADERS(${real_live555_tree}/liveMedia/include/liveMedia_version.hh,[
AC_CHECK_HEADERS(${real_live555_tree}/liveMedia/include/liveMedia_version.hh,[
AC_MSG_CHECKING(for liveMedia version >= 12
148956
00 )
AC_MSG_CHECKING(for liveMedia version >= 12
750912
00 )
AC_EGREP_CPP(yes,
AC_EGREP_CPP(yes,
[#include "${real_live555_tree}/liveMedia/include/liveMedia_version.hh"
[#include "${real_live555_tree}/liveMedia/include/liveMedia_version.hh"
#ifdef LIVEMEDIA_LIBRARY_VERSION_INT
#ifdef LIVEMEDIA_LIBRARY_VERSION_INT
#if LIVEMEDIA_LIBRARY_VERSION_INT < 12
148956
00
#if LIVEMEDIA_LIBRARY_VERSION_INT < 12
750912
00
yes
yes
#endif
#endif
#endif],
#endif],
...
...
modules/demux/live555.cpp
View file @
563338ed
...
@@ -7,6 +7,7 @@
...
@@ -7,6 +7,7 @@
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
* Derk-Jan Hartman <hartman at videolan. org>
* Derk-Jan Hartman <hartman at videolan. org>
* Derk-Jan Hartman <djhartman at m2x .dot. nl> for M2X
* Derk-Jan Hartman <djhartman at m2x .dot. nl> for M2X
* Sébastien Escudier <sebastien-devel celeos eu>
*
*
* This program is free software; you can redistribute it and/or modify
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* it under the terms of the GNU General Public License as published by
...
@@ -181,6 +182,8 @@ struct timeout_thread_t
...
@@ -181,6 +182,8 @@ struct timeout_thread_t
bool
b_handle_keep_alive
;
bool
b_handle_keep_alive
;
};
};
class
RTSPClientVlc
;
struct
demux_sys_t
struct
demux_sys_t
{
{
char
*
p_sdp
;
/* XXX mallocated */
char
*
p_sdp
;
/* XXX mallocated */
...
@@ -190,7 +193,7 @@ struct demux_sys_t
...
@@ -190,7 +193,7 @@ struct demux_sys_t
MediaSession
*
ms
;
MediaSession
*
ms
;
TaskScheduler
*
scheduler
;
TaskScheduler
*
scheduler
;
UsageEnvironment
*
env
;
UsageEnvironment
*
env
;
RTSPClient
*
rtsp
;
RTSPClient
Vlc
*
rtsp
;
/* */
/* */
int
i_track
;
int
i_track
;
...
@@ -223,10 +226,26 @@ struct demux_sys_t
...
@@ -223,10 +226,26 @@ struct demux_sys_t
bool
b_get_param
;
/* Does the server support GET_PARAMETER */
bool
b_get_param
;
/* Does the server support GET_PARAMETER */
bool
b_paused
;
/* Are we paused? */
bool
b_paused
;
/* Are we paused? */
bool
b_error
;
bool
b_error
;
int
i_live555_ret
;
/* live555 callback return code */
float
f_seek_request
;
/* In case we receive a seek request while paused*/
float
f_seek_request
;
/* In case we receive a seek request while paused*/
};
};
class
RTSPClientVlc
:
public
RTSPClient
{
public:
RTSPClientVlc
(
UsageEnvironment
&
env
,
char
const
*
rtspURL
,
int
verbosityLevel
,
char
const
*
applicationName
,
portNumBits
tunnelOverHTTPPortNum
,
demux_sys_t
*
p_sys
)
:
RTSPClient
(
env
,
rtspURL
,
verbosityLevel
,
applicationName
,
tunnelOverHTTPPortNum
)
{
this
->
p_sys
=
p_sys
;
}
demux_sys_t
*
p_sys
;
};
static
int
Demux
(
demux_t
*
);
static
int
Demux
(
demux_t
*
);
static
int
Control
(
demux_t
*
,
int
,
va_list
);
static
int
Control
(
demux_t
*
,
int
,
va_list
);
...
@@ -298,11 +317,12 @@ static int Open ( vlc_object_t *p_this )
...
@@ -298,11 +317,12 @@ static int Open ( vlc_object_t *p_this )
p_sys
->
b_multicast
=
false
;
p_sys
->
b_multicast
=
false
;
p_sys
->
b_real
=
false
;
p_sys
->
b_real
=
false
;
p_sys
->
psz_path
=
strdup
(
p_demux
->
psz_location
);
p_sys
->
psz_path
=
strdup
(
p_demux
->
psz_location
);
p_sys
->
b_force_mcast
=
var_
CreateGe
tBool
(
p_demux
,
"rtsp-mcast"
);
p_sys
->
b_force_mcast
=
var_
Inheri
tBool
(
p_demux
,
"rtsp-mcast"
);
p_sys
->
b_get_param
=
false
;
p_sys
->
b_get_param
=
false
;
p_sys
->
b_paused
=
false
;
p_sys
->
b_paused
=
false
;
p_sys
->
f_seek_request
=
-
1
;
p_sys
->
f_seek_request
=
-
1
;
p_sys
->
b_error
=
false
;
p_sys
->
b_error
=
false
;
p_sys
->
i_live555_ret
=
0
;
/* parse URL for rtsp://[user:[passwd]@]serverip:port/options */
/* parse URL for rtsp://[user:[passwd]@]serverip:port/options */
vlc_UrlParse
(
&
p_sys
->
url
,
p_sys
->
psz_path
,
0
);
vlc_UrlParse
(
&
p_sys
->
url
,
p_sys
->
psz_path
,
0
);
...
@@ -423,7 +443,7 @@ static void Close( vlc_object_t *p_this )
...
@@ -423,7 +443,7 @@ static void Close( vlc_object_t *p_this )
demux_t
*
p_demux
=
(
demux_t
*
)
p_this
;
demux_t
*
p_demux
=
(
demux_t
*
)
p_this
;
demux_sys_t
*
p_sys
=
p_demux
->
p_sys
;
demux_sys_t
*
p_sys
=
p_demux
->
p_sys
;
if
(
p_sys
->
rtsp
&&
p_sys
->
ms
)
p_sys
->
rtsp
->
teardownMediaSession
(
*
p_sys
->
ms
);
if
(
p_sys
->
rtsp
&&
p_sys
->
ms
)
p_sys
->
rtsp
->
sendTeardownCommand
(
*
p_sys
->
ms
,
NULL
);
if
(
p_sys
->
ms
)
Medium
::
close
(
p_sys
->
ms
);
if
(
p_sys
->
ms
)
Medium
::
close
(
p_sys
->
ms
);
if
(
p_sys
->
rtsp
)
RTSPClient
::
close
(
p_sys
->
rtsp
);
if
(
p_sys
->
rtsp
)
RTSPClient
::
close
(
p_sys
->
rtsp
);
if
(
p_sys
->
env
)
p_sys
->
env
->
reclaim
();
if
(
p_sys
->
env
)
p_sys
->
env
->
reclaim
();
...
@@ -458,6 +478,83 @@ static void Close( vlc_object_t *p_this )
...
@@ -458,6 +478,83 @@ static void Close( vlc_object_t *p_this )
static
inline
const
char
*
strempty
(
const
char
*
s
)
{
return
s
?
s
:
""
;
}
static
inline
const
char
*
strempty
(
const
char
*
s
)
{
return
s
?
s
:
""
;
}
static
inline
Boolean
toBool
(
bool
b
)
{
return
b
?
True
:
False
;
}
// silly, no?
static
inline
Boolean
toBool
(
bool
b
)
{
return
b
?
True
:
False
;
}
// silly, no?
static
void
default_live555_callback
(
RTSPClient
*
client
,
int
result_code
,
char
*
result_string
)
{
RTSPClientVlc
*
client_vlc
=
static_cast
<
RTSPClientVlc
*>
(
client
);
demux_sys_t
*
p_sys
=
client_vlc
->
p_sys
;
delete
[]
result_string
;
p_sys
->
i_live555_ret
=
result_code
;
p_sys
->
b_error
=
p_sys
->
i_live555_ret
!=
0
;
p_sys
->
event
=
1
;
}
/* return true if the RTSP command succeeded */
static
bool
wait_Live555_response
(
demux_t
*
p_demux
,
int
i_timeout
=
0
/* ms */
)
{
TaskToken
task
;
demux_sys_t
*
p_sys
=
p_demux
->
p_sys
;
p_sys
->
event
=
0
;
if
(
i_timeout
>
0
)
{
/* Create a task that will be called if we wait more than timeout ms */
task
=
p_sys
->
scheduler
->
scheduleDelayedTask
(
i_timeout
*
1000
,
TaskInterrupt
,
p_demux
);
}
p_sys
->
event
=
0
;
p_sys
->
b_error
=
true
;
p_sys
->
i_live555_ret
=
0
;
p_sys
->
scheduler
->
doEventLoop
(
&
p_sys
->
event
);
//here, if b_error is true and i_live555_ret = 0 we didn't receive a response
if
(
i_timeout
>
0
)
{
/* remove the task */
p_sys
->
scheduler
->
unscheduleDelayedTask
(
task
);
}
return
!
p_sys
->
b_error
;
}
static
void
continueAfterDESCRIBE
(
RTSPClient
*
client
,
int
result_code
,
char
*
result_string
)
{
RTSPClientVlc
*
client_vlc
=
static_cast
<
RTSPClientVlc
*>
(
client
);
demux_sys_t
*
p_sys
=
client_vlc
->
p_sys
;
char
*
sdpDescription
=
result_string
;
p_sys
->
i_live555_ret
=
result_code
;
if
(
result_code
!=
0
)
{
delete
[]
sdpDescription
;
return
;
}
free
(
p_sys
->
p_sdp
);
p_sys
->
p_sdp
=
NULL
;
if
(
sdpDescription
)
{
p_sys
->
p_sdp
=
strdup
(
sdpDescription
);
delete
[]
sdpDescription
;
}
p_sys
->
b_error
=
false
;
p_sys
->
event
=
1
;
}
static
void
continueAfterOPTIONS
(
RTSPClient
*
client
,
int
result_code
,
char
*
result_string
)
{
RTSPClientVlc
*
client_vlc
=
static_cast
<
RTSPClientVlc
*>
(
client
);
demux_sys_t
*
p_sys
=
client_vlc
->
p_sys
;
p_sys
->
i_live555_ret
=
result_code
;
if
(
result_code
!=
0
)
{
p_sys
->
b_error
=
true
;
p_sys
->
event
=
1
;
}
else
{
p_sys
->
b_get_param
=
(
bool
)
strstr
(
result_string
,
"GET_PARAMETER"
);
client
->
sendDescribeCommand
(
continueAfterDESCRIBE
);
}
delete
[]
result_string
;
}
/*****************************************************************************
/*****************************************************************************
* Connect: connects to the RTSP server to setup the session DESCRIBE
* Connect: connects to the RTSP server to setup the session DESCRIBE
*****************************************************************************/
*****************************************************************************/
...
@@ -472,6 +569,7 @@ static int Connect( demux_t *p_demux )
...
@@ -472,6 +569,7 @@ static int Connect( demux_t *p_demux )
char
*
p_sdp
=
NULL
;
char
*
p_sdp
=
NULL
;
int
i_http_port
=
0
;
int
i_http_port
=
0
;
int
i_ret
=
VLC_SUCCESS
;
int
i_ret
=
VLC_SUCCESS
;
const
int
i_timeout
=
var_InheritInteger
(
p_demux
,
"ipv4-timeout"
);
/* Get the user name and password */
/* Get the user name and password */
if
(
p_sys
->
url
.
psz_username
||
p_sys
->
url
.
psz_password
)
if
(
p_sys
->
url
.
psz_username
||
p_sys
->
url
.
psz_password
)
...
@@ -493,8 +591,8 @@ static int Connect( demux_t *p_demux )
...
@@ -493,8 +591,8 @@ static int Connect( demux_t *p_demux )
if
(
asprintf
(
&
psz_url
,
"rtsp://%s"
,
p_sys
->
psz_path
)
==
-
1
)
if
(
asprintf
(
&
psz_url
,
"rtsp://%s"
,
p_sys
->
psz_path
)
==
-
1
)
return
VLC_ENOMEM
;
return
VLC_ENOMEM
;
psz_user
=
var_
CreateGe
tString
(
p_demux
,
"rtsp-user"
);
psz_user
=
var_
Inheri
tString
(
p_demux
,
"rtsp-user"
);
psz_pwd
=
var_
CreateGe
tString
(
p_demux
,
"rtsp-pwd"
);
psz_pwd
=
var_
Inheri
tString
(
p_demux
,
"rtsp-pwd"
);
}
}
createnew:
createnew:
...
@@ -504,12 +602,13 @@ createnew:
...
@@ -504,12 +602,13 @@ createnew:
goto
bailout
;
goto
bailout
;
}
}
if
(
var_
CreateGe
tBool
(
p_demux
,
"rtsp-http"
)
)
if
(
var_
Inheri
tBool
(
p_demux
,
"rtsp-http"
)
)
i_http_port
=
var_
CreateGe
tInteger
(
p_demux
,
"rtsp-http-port"
);
i_http_port
=
var_
Inheri
tInteger
(
p_demux
,
"rtsp-http-port"
);
if
(
(
p_sys
->
rtsp
=
RTSPClient
::
createNew
(
*
p_sys
->
env
,
p_sys
->
rtsp
=
new
RTSPClientVlc
(
*
p_sys
->
env
,
psz_url
,
var_CreateGetInteger
(
p_demux
,
"verbose"
)
>
1
,
var_InheritInteger
(
p_demux
,
"verbose"
)
>
1
?
1
:
0
,
"LibVLC/"
VERSION
,
i_http_port
)
)
==
NULL
)
"LibVLC/"
VERSION
,
i_http_port
,
p_sys
);
if
(
!
p_sys
->
rtsp
)
{
{
msg_Err
(
p_demux
,
"RTSPClient::createNew failed (%s)"
,
msg_Err
(
p_demux
,
"RTSPClient::createNew failed (%s)"
,
p_sys
->
env
->
getResultMsg
()
);
p_sys
->
env
->
getResultMsg
()
);
...
@@ -524,7 +623,7 @@ createnew:
...
@@ -524,7 +623,7 @@ createnew:
* to spaces in the string or the string being too long. Here we override
* to spaces in the string or the string being too long. Here we override
* the default string with a more compact version.
* the default string with a more compact version.
*/
*/
if
(
var_
CreateGe
tBool
(
p_demux
,
"rtsp-kasenna"
))
if
(
var_
Inheri
tBool
(
p_demux
,
"rtsp-kasenna"
))
{
{
p_sys
->
rtsp
->
setUserAgentString
(
"VLC_MEDIA_PLAYER_KA"
);
p_sys
->
rtsp
->
setUserAgentString
(
"VLC_MEDIA_PLAYER_KA"
);
}
}
...
@@ -532,62 +631,11 @@ createnew:
...
@@ -532,62 +631,11 @@ createnew:
describe:
describe:
authenticator
.
setUsernameAndPassword
(
psz_user
,
psz_pwd
);
authenticator
.
setUsernameAndPassword
(
psz_user
,
psz_pwd
);
/* */
p_sys
->
rtsp
->
sendOptionsCommand
(
&
continueAfterOPTIONS
,
&
authenticator
);
{
/* i_timeout hack scope */
#if LIVEMEDIA_LIBRARY_VERSION_INT >= 1223337600
const
int
i_timeout
=
var_CreateGetInteger
(
p_demux
,
"ipv4-timeout"
)
/
1000
;
psz_options
=
p_sys
->
rtsp
->
sendOptionsCmd
(
psz_url
,
psz_user
,
psz_pwd
,
&
authenticator
,
i_timeout
);
#else
psz_options
=
p_sys
->
rtsp
->
sendOptionsCmd
(
psz_url
,
psz_user
,
psz_pwd
,
&
authenticator
);
#endif
if
(
psz_options
==
NULL
&&
authenticator
.
realm
()
!=
NULL
)
{
// try again, with the realm set this time
#if LIVEMEDIA_LIBRARY_VERSION_INT >= 1223337600
psz_options
=
p_sys
->
rtsp
->
sendOptionsCmd
(
psz_url
,
psz_user
,
psz_pwd
,
&
authenticator
,
i_timeout
);
#else
psz_options
=
p_sys
->
rtsp
->
sendOptionsCmd
(
psz_url
,
psz_user
,
psz_pwd
,
&
authenticator
);
#endif
}
if
(
psz_options
)
p_sys
->
b_get_param
=
(
bool
)
strstr
(
psz_options
,
"GET_PARAMETER"
);
delete
[]
psz_options
;
if
(
var_CreateGetBool
(
p_demux
,
"rtsp-wmserver"
)
)
p_sys
->
b_get_param
=
true
;
#if LIVEMEDIA_LIBRARY_VERSION_INT >= 1223337600
if
(
!
wait_Live555_response
(
p_demux
,
i_timeout
)
)
p_sdp
=
p_sys
->
rtsp
->
describeWithPassword
(
psz_url
,
psz_user
,
psz_pwd
,
var_GetBool
(
p_demux
,
"rtsp-kasenna"
),
i_timeout
);
#else
p_sdp
=
p_sys
->
rtsp
->
describeWithPassword
(
psz_url
,
psz_user
,
psz_pwd
,
var_GetBool
(
p_demux
,
"rtsp-kasenna"
)
);
#endif
}
/* i_timeout scope end */
if
(
p_sdp
==
NULL
)
{
{
/* failure occurred */
int
i_code
=
p_sys
->
i_live555_ret
;
int
i_code
=
0
;
const
char
*
psz_error
=
p_sys
->
env
->
getResultMsg
();
if
(
var_GetBool
(
p_demux
,
"rtsp-http"
)
)
sscanf
(
psz_error
,
"%*s %*s HTTP GET %*s HTTP/%*u.%*u %3u %*s"
,
&
i_code
);
else
{
const
char
*
psz_tmp
=
strstr
(
psz_error
,
"RTSP"
);
if
(
psz_tmp
)
sscanf
(
psz_tmp
,
"RTSP/%*s%3u"
,
&
i_code
);
else
i_code
=
0
;
}
msg_Dbg
(
p_demux
,
"DESCRIBE failed with %d: %s"
,
i_code
,
psz_error
);
if
(
i_code
==
401
)
if
(
i_code
==
401
)
{
{
msg_Dbg
(
p_demux
,
"authentication failed"
);
msg_Dbg
(
p_demux
,
"authentication failed"
);
...
@@ -603,7 +651,7 @@ describe:
...
@@ -603,7 +651,7 @@ describe:
goto
describe
;
goto
describe
;
}
}
}
}
else
if
(
(
i_code
!=
0
)
&&
!
var_GetBool
(
p_demux
,
"rtsp-http"
)
)
else
if
(
(
i_code
>
0
)
&&
!
var_GetBool
(
p_demux
,
"rtsp-http"
)
)
{
{
/* Perhaps a firewall is being annoying. Try HTTP tunneling mode */
/* Perhaps a firewall is being annoying. Try HTTP tunneling mode */
msg_Dbg
(
p_demux
,
"we will now try HTTP tunneling mode"
);
msg_Dbg
(
p_demux
,
"we will now try HTTP tunneling mode"
);
...
@@ -614,18 +662,14 @@ describe:
...
@@ -614,18 +662,14 @@ describe:
}
}
else
else
{
{
msg_Dbg
(
p_demux
,
"connection timeout"
);
if
(
i_code
==
0
)
msg_Dbg
(
p_demux
,
"connection timeout"
);
if
(
p_sys
->
rtsp
)
RTSPClient
::
close
(
p_sys
->
rtsp
);
if
(
p_sys
->
rtsp
)
RTSPClient
::
close
(
p_sys
->
rtsp
);
p_sys
->
rtsp
=
NULL
;
p_sys
->
rtsp
=
NULL
;
}
}
i_ret
=
VLC_EGENERIC
;
i_ret
=
VLC_EGENERIC
;
}
}
free
(
p_sys
->
p_sdp
);
p_sys
->
p_sdp
=
NULL
;
if
(
p_sdp
)
p_sys
->
p_sdp
=
strdup
(
(
char
*
)
p_sdp
);
delete
[]
p_sdp
;
bailout:
bailout:
/* malloc-ated copy */
/* malloc-ated copy */
free
(
psz_url
);
free
(
psz_url
);
...
@@ -650,9 +694,9 @@ static int SessionsSetup( demux_t *p_demux )
...
@@ -650,9 +694,9 @@ static int SessionsSetup( demux_t *p_demux )
unsigned
int
i_buffer
=
0
;
unsigned
int
i_buffer
=
0
;
unsigned
const
thresh
=
200000
;
/* RTP reorder threshold .2 second (default .1) */
unsigned
const
thresh
=
200000
;
/* RTP reorder threshold .2 second (default .1) */
b_rtsp_tcp
=
var_
CreateGe
tBool
(
p_demux
,
"rtsp-tcp"
)
||
b_rtsp_tcp
=
var_
Inheri
tBool
(
p_demux
,
"rtsp-tcp"
)
||
var_
Ge
tBool
(
p_demux
,
"rtsp-http"
);
var_
Inheri
tBool
(
p_demux
,
"rtsp-http"
);
i_client_port
=
var_
CreateGe
tInteger
(
p_demux
,
"rtp-client-port"
);
i_client_port
=
var_
Inheri
tInteger
(
p_demux
,
"rtp-client-port"
);
/* Create the session from the SDP */
/* Create the session from the SDP */
if
(
!
(
p_sys
->
ms
=
MediaSession
::
createNew
(
*
p_sys
->
env
,
p_sys
->
p_sdp
)
)
)
if
(
!
(
p_sys
->
ms
=
MediaSession
::
createNew
(
*
p_sys
->
env
,
p_sys
->
p_sdp
)
)
)
...
@@ -727,16 +771,17 @@ static int SessionsSetup( demux_t *p_demux )
...
@@ -727,16 +771,17 @@ static int SessionsSetup( demux_t *p_demux )
/* Issue the SETUP */
/* Issue the SETUP */
if
(
p_sys
->
rtsp
)
if
(
p_sys
->
rtsp
)
{
{
if
(
!
p_sys
->
rtsp
->
setupMediaSubsession
(
*
sub
,
False
,
p_sys
->
rtsp
->
sendSetupCommand
(
*
sub
,
default_live555_callback
,
False
,
toBool
(
b_rtsp_tcp
),
toBool
(
b_rtsp_tcp
),
toBool
(
p_sys
->
b_force_mcast
&&
!
b_rtsp_tcp
)
)
)
toBool
(
p_sys
->
b_force_mcast
&&
!
b_rtsp_tcp
)
);
if
(
!
wait_Live555_response
(
p_demux
)
)
{
{
/* if we get an unsupported transport error, toggle TCP
/* if we get an unsupported transport error, toggle TCP
* use and try again */
* use and try again */
if
(
!
strstr
(
p_sys
->
env
->
getResultMsg
(),
if
(
p_sys
->
i_live555_ret
==
461
)
"461 Unsupported Transport"
)
p_sys
->
rtsp
->
sendSetupCommand
(
*
sub
,
default_live555_callback
,
False
,
||
!
p_sys
->
rtsp
->
setupMediaSubsession
(
*
sub
,
False
,
toBool
(
b_rtsp_tcp
),
False
);
toBool
(
b_rtsp_tcp
),
False
)
)
if
(
p_sys
->
i_live555_ret
!=
461
||
!
wait_Live555_response
(
p_demux
)
)
{
{
msg_Err
(
p_demux
,
"SETUP of'%s/%s' failed %s"
,
msg_Err
(
p_demux
,
"SETUP of'%s/%s' failed %s"
,
sub
->
mediumName
(),
sub
->
codecName
(),
sub
->
mediumName
(),
sub
->
codecName
(),
...
@@ -1058,7 +1103,9 @@ static int Play( demux_t *p_demux )
...
@@ -1058,7 +1103,9 @@ static int Play( demux_t *p_demux )
if
(
p_sys
->
rtsp
)
if
(
p_sys
->
rtsp
)
{
{
/* The PLAY */
/* The PLAY */
if
(
!
p_sys
->
rtsp
->
playMediaSession
(
*
p_sys
->
ms
,
p_sys
->
i_npt_start
,
-
1
,
1
)
)
p_sys
->
rtsp
->
sendPlayCommand
(
*
p_sys
->
ms
,
default_live555_callback
,
p_sys
->
i_npt_start
,
-
1
,
1
);
if
(
!
wait_Live555_response
(
p_demux
)
)
{
{
msg_Err
(
p_demux
,
"RTSP PLAY failed %s"
,
p_sys
->
env
->
getResultMsg
()
);
msg_Err
(
p_demux
,
"RTSP PLAY failed %s"
,
p_sys
->
env
->
getResultMsg
()
);
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
...
@@ -1120,7 +1167,7 @@ static int Demux( demux_t *p_demux )
...
@@ -1120,7 +1167,7 @@ static int Demux( demux_t *p_demux )
if
(
p_sys
->
b_timeout_call
&&
p_sys
->
rtsp
&&
p_sys
->
ms
)
if
(
p_sys
->
b_timeout_call
&&
p_sys
->
rtsp
&&
p_sys
->
ms
)
{
{
char
*
psz_bye
=
NULL
;
char
*
psz_bye
=
NULL
;
p_sys
->
rtsp
->
getMediaSessionParameter
(
*
p_sys
->
ms
,
NULL
,
psz_bye
);
p_sys
->
rtsp
->
sendGetParameterCommand
(
*
p_sys
->
ms
,
NULL
,
psz_bye
);
p_sys
->
b_timeout_call
=
false
;
p_sys
->
b_timeout_call
=
false
;
}
}
...
@@ -1293,13 +1340,18 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
...
@@ -1293,13 +1340,18 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
return
VLC_SUCCESS
;
return
VLC_SUCCESS
;
}
}
if
(
!
p_sys
->
rtsp
->
pauseMediaSession
(
*
p_sys
->
ms
)
)
p_sys
->
rtsp
->
sendPauseCommand
(
*
p_sys
->
ms
,
default_live555_callback
);
if
(
!
wait_Live555_response
(
p_demux
)
)
{
{
msg_Err
(
p_demux
,
"PAUSE before seek failed %s"
,
msg_Err
(
p_demux
,
"PAUSE before seek failed %s"
,
p_sys
->
env
->
getResultMsg
()
);
p_sys
->
env
->
getResultMsg
()
);
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
}
}
if
(
!
p_sys
->
rtsp
->
playMediaSession
(
*
p_sys
->
ms
,
time
,
-
1
,
1
)
)
p_sys
->
rtsp
->
sendPlayCommand
(
*
p_sys
->
ms
,
default_live555_callback
,
time
,
-
1
,
1
);
if
(
!
wait_Live555_response
(
p_demux
)
)
{
{
msg_Err
(
p_demux
,
"seek PLAY failed %s"
,
msg_Err
(
p_demux
,
"seek PLAY failed %s"
,
p_sys
->
env
->
getResultMsg
()
);
p_sys
->
env
->
getResultMsg
()
);
...
@@ -1389,7 +1441,9 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
...
@@ -1389,7 +1441,9 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
/* Passing -1 for the start and end time will mean liveMedia won't
/* Passing -1 for the start and end time will mean liveMedia won't
* create a Range: section for the RTSP message. The server should
* create a Range: section for the RTSP message. The server should
* pick up from the current position */
* pick up from the current position */
if
(
!
p_sys
->
rtsp
->
playMediaSession
(
*
p_sys
->
ms
,
-
1
,
-
1
,
f_scale
)
)
p_sys
->
rtsp
->
sendPlayCommand
(
*
p_sys
->
ms
,
default_live555_callback
,
-
1
,
-
1
,
f_scale
);
if
(
!
wait_Live555_response
(
p_demux
)
)
{
{
msg_Err
(
p_demux
,
"PLAY with Scale %0.2f failed %s"
,
f_scale
,
msg_Err
(
p_demux
,
"PLAY with Scale %0.2f failed %s"
,
f_scale
,
p_sys
->
env
->
getResultMsg
()
);
p_sys
->
env
->
getResultMsg
()
);
...
@@ -1421,12 +1475,16 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
...
@@ -1421,12 +1475,16 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
if
(
b_pause
==
p_sys
->
b_paused
)
if
(
b_pause
==
p_sys
->
b_paused
)
return
VLC_SUCCESS
;
return
VLC_SUCCESS
;
if
(
(
b_pause
&&
!
p_sys
->
rtsp
->
pauseMediaSession
(
*
p_sys
->
ms
)
)
||
if
(
b_pause
)
(
!
b_pause
&&
!
p_sys
->
rtsp
->
playMediaSession
(
*
p_sys
->
ms
,
p_sys
->
rtsp
->
sendPauseCommand
(
*
p_sys
->
ms
,
default_live555_callback
);
p_sys
->
f_seek_request
,
-
1.0
f
,
p_sys
->
ms
->
scale
()
)
)
)
else
p_sys
->
rtsp
->
sendPlayCommand
(
*
p_sys
->
ms
,
default_live555_callback
,
p_sys
->
f_seek_request
,
-
1.0
f
,
p_sys
->
ms
->
scale
()
);
if
(
!
wait_Live555_response
(
p_demux
)
)
{
{
msg_Err
(
p_demux
,
"PLAY or PAUSE failed %s"
,
p_sys
->
env
->
getResultMsg
()
);
msg_Err
(
p_demux
,
"PLAY or PAUSE failed %s"
,
p_sys
->
env
->
getResultMsg
()
);
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
}
}
p_sys
->
f_seek_request
=
-
1
;
p_sys
->
f_seek_request
=
-
1
;
p_sys
->
b_paused
=
b_pause
;
p_sys
->
b_paused
=
b_pause
;
...
@@ -1511,7 +1569,7 @@ static int RollOverTcp( demux_t *p_demux )
...
@@ -1511,7 +1569,7 @@ static int RollOverTcp( demux_t *p_demux )
if
(
p_sys
->
i_track
)
free
(
p_sys
->
track
);
if
(
p_sys
->
i_track
)
free
(
p_sys
->
track
);
if
(
p_sys
->
p_out_asf
)
stream_Delete
(
p_sys
->
p_out_asf
);
if
(
p_sys
->
p_out_asf
)
stream_Delete
(
p_sys
->
p_out_asf
);
p_sys
->
rtsp
->
teardownMediaSession
(
*
p_sys
->
ms
);
p_sys
->
rtsp
->
sendTeardownCommand
(
*
p_sys
->
ms
,
NULL
);
Medium
::
close
(
p_sys
->
ms
);
Medium
::
close
(
p_sys
->
ms
);
RTSPClient
::
close
(
p_sys
->
rtsp
);
RTSPClient
::
close
(
p_sys
->
rtsp
);
...
@@ -1887,7 +1945,7 @@ static void* TimeoutPrevention( void *p_data )
...
@@ -1887,7 +1945,7 @@ static void* TimeoutPrevention( void *p_data )
char
*
psz_bye
=
NULL
;
char
*
psz_bye
=
NULL
;
int
canc
=
vlc_savecancel
();
int
canc
=
vlc_savecancel
();
p_timeout
->
p_sys
->
rtsp
->
getMediaSessionParameter
(
*
p_timeout
->
p_sys
->
ms
,
NULL
,
psz_bye
);
p_timeout
->
p_sys
->
rtsp
->
sendGetParameterCommand
(
*
p_timeout
->
p_sys
->
ms
,
NULL
,
psz_bye
);
vlc_restorecancel
(
canc
);
vlc_restorecancel
(
canc
);
}
}
p_timeout
->
p_sys
->
b_timeout_call
=
!
p_timeout
->
b_handle_keep_alive
;
p_timeout
->
p_sys
->
b_timeout_call
=
!
p_timeout
->
b_handle_keep_alive
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment