| 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 |
| |