0002-mpdemux-live555-async-interface.patch
4.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
From d3195ea13f4a9aae546ff996e53681349a1a3cdb Mon Sep 17 00:00:00 2001
From: sherpya <sherpya@netfarm.it>
Date: Fri, 14 Jun 2013 05:25:38 +0200
Subject: [PATCH 25/27] mpdemux: live555 async interface
From: https://raw.github.com/sherpya/mplayer-be/master/patches/mp/0025-mpdemux-live555-async-interface.patch
Adjust live555 interface code for modern versions of live555.
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
---
libmpdemux/demux_rtp.cpp | 51 ++++++++++++++++++++++++++++++++----------------
2 files changed, 35 insertions(+), 22 deletions(-)
diff --git a/libmpdemux/demux_rtp.cpp b/libmpdemux/demux_rtp.cpp
index ad7a7f1..05d06e0 100644
--- a/libmpdemux/demux_rtp.cpp
+++ b/libmpdemux/demux_rtp.cpp
@@ -19,8 +19,6 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#define RTSPCLIENT_SYNCHRONOUS_INTERFACE 1
-
extern "C" {
// on MinGW, we must include windows.h before the things it conflicts
#ifdef __MINGW32__ // with. they are each protected from
@@ -94,15 +92,6 @@ struct RTPState {
extern "C" char* network_username;
extern "C" char* network_password;
-static char* openURL_rtsp(RTSPClient* client, char const* url) {
- // If we were given a user name (and optional password), then use them:
- if (network_username != NULL) {
- char const* password = network_password == NULL ? "" : network_password;
- return client->describeWithPassword(url, network_username, password);
- } else {
- return client->describeURL(url);
- }
-}
static char* openURL_sip(SIPClient* client, char const* url) {
// If we were given a user name (and optional password), then use them:
@@ -118,6 +107,19 @@ static char* openURL_sip(SIPClient* client, char const* url) {
extern AVCodecContext *avcctx;
#endif
+static char fWatchVariableForSyncInterface;
+static char* fResultString;
+static int fResultCode;
+
+static void responseHandlerForSyncInterface(RTSPClient* rtspClient, int responseCode, char* responseString) {
+ // Set result values:
+ fResultCode = responseCode;
+ fResultString = responseString;
+
+ // Signal a break from the event loop (thereby returning from the blocking command):
+ fWatchVariableForSyncInterface = ~0;
+}
+
extern "C" int audio_id, video_id, dvdsub_id;
extern "C" demuxer_t* demux_open_rtp(demuxer_t* demuxer) {
Boolean success = False;
@@ -146,13 +148,19 @@ extern "C" demuxer_t* demux_open_rtp(demuxer_t* demuxer) {
rtsp_transport_http = demuxer->stream->streaming_ctrl->url->port;
rtsp_transport_tcp = 1;
}
- rtspClient = RTSPClient::createNew(*env, verbose, "MPlayer", rtsp_transport_http);
+ rtspClient = RTSPClient::createNew(*env, url, verbose, "MPlayer", rtsp_transport_http);
if (rtspClient == NULL) {
fprintf(stderr, "Failed to create RTSP client: %s\n",
env->getResultMsg());
break;
}
- sdpDescription = openURL_rtsp(rtspClient, url);
+ fWatchVariableForSyncInterface = 0;
+ rtspClient->sendDescribeCommand(responseHandlerForSyncInterface);
+ env->taskScheduler().doEventLoop(&fWatchVariableForSyncInterface);
+ if (fResultCode == 0)
+ sdpDescription = fResultString;
+ else
+ delete[] fResultString;
} else { // SIP
unsigned char desiredAudioType = 0; // PCMU (use 3 for GSM)
sipClient = SIPClient::createNew(*env, desiredAudioType, NULL,
@@ -236,8 +244,12 @@ extern "C" demuxer_t* demux_open_rtp(demuxer_t* demuxer) {
if (rtspClient != NULL) {
// Issue a RTSP "SETUP" command on the chosen subsession:
- if (!rtspClient->setupMediaSubsession(*subsession, False,
- rtsp_transport_tcp)) break;
+ fWatchVariableForSyncInterface = 0;
+ rtspClient->sendSetupCommand(*subsession, responseHandlerForSyncInterface, False, rtsp_transport_tcp);
+ env->taskScheduler().doEventLoop(&fWatchVariableForSyncInterface);
+ delete[] fResultString;
+ if (fResultCode != 0) break;
+
if (!strcmp(subsession->mediumName(), "audio"))
audiofound = 1;
if (!strcmp(subsession->mediumName(), "video"))
@@ -248,7 +260,11 @@ extern "C" demuxer_t* demux_open_rtp(demuxer_t* demuxer) {
if (rtspClient != NULL) {
// Issue a RTSP aggregate "PLAY" command on the whole session:
- if (!rtspClient->playMediaSession(*mediaSession)) break;
+ fWatchVariableForSyncInterface = 0;
+ rtspClient->sendPlayCommand(*mediaSession, responseHandlerForSyncInterface);
+ env->taskScheduler().doEventLoop(&fWatchVariableForSyncInterface);
+ delete[] fResultString;
+ if (fResultCode != 0) break;
} else if (sipClient != NULL) {
sipClient->sendACK(); // to start the stream flowing
}
@@ -637,7 +653,8 @@ static void teardownRTSPorSIPSession(RTPState* rtpState) {
MediaSession* mediaSession = rtpState->mediaSession;
if (mediaSession == NULL) return;
if (rtpState->rtspClient != NULL) {
- rtpState->rtspClient->teardownMediaSession(*mediaSession);
+ fWatchVariableForSyncInterface = 0;
+ rtpState->rtspClient->sendTeardownCommand(*mediaSession, NULL);
} else if (rtpState->sipClient != NULL) {
rtpState->sipClient->sendBYE();
}
--
1.8.5.2