annotate libmpdemux/demux_rtp.cpp @ 32527:babddccb9312

use x264_picture_init. this currently has no effect, but it always should have been done this way, and it will be required for some future x264 version.
author lorenm
date Wed, 10 Nov 2010 08:32:54 +0000
parents 4cd07921bec2
children db1b1a1ecba8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
29238
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 27776
diff changeset
1 /*
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 27776
diff changeset
2 * routines (with C-linkage) that interface between MPlayer
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 27776
diff changeset
3 * and the "LIVE555 Streaming Media" libraries
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 27776
diff changeset
4 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 27776
diff changeset
5 * This file is part of MPlayer.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 27776
diff changeset
6 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 27776
diff changeset
7 * MPlayer is free software; you can redistribute it and/or modify
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 27776
diff changeset
8 * it under the terms of the GNU General Public License as published by
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 27776
diff changeset
9 * the Free Software Foundation; either version 2 of the License, or
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 27776
diff changeset
10 * (at your option) any later version.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 27776
diff changeset
11 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 27776
diff changeset
12 * MPlayer is distributed in the hope that it will be useful,
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 27776
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 27776
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 27776
diff changeset
15 * GNU General Public License for more details.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 27776
diff changeset
16 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 27776
diff changeset
17 * You should have received a copy of the GNU General Public License along
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 27776
diff changeset
18 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 27776
diff changeset
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 27776
diff changeset
20 */
9250
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
21
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
22 extern "C" {
12531
834e7844ab3b MinGW compilation fix from a patch by Joey Parrish, approved by Sascha
diego
parents: 12521
diff changeset
23 // on MinGW, we must include windows.h before the things it conflicts
834e7844ab3b MinGW compilation fix from a patch by Joey Parrish, approved by Sascha
diego
parents: 12521
diff changeset
24 #ifdef __MINGW32__ // with. they are each protected from
834e7844ab3b MinGW compilation fix from a patch by Joey Parrish, approved by Sascha
diego
parents: 12521
diff changeset
25 #include <windows.h> // windows.h, but not the other way around.
834e7844ab3b MinGW compilation fix from a patch by Joey Parrish, approved by Sascha
diego
parents: 12521
diff changeset
26 #endif
31483
a295c59e1a48 Move rtsp_port extern declaration to demuxer.h.
diego
parents: 31281
diff changeset
27 #include "demuxer.h"
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
28 #include "demux_rtp.h"
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
29 #include "stheader.h"
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
30 }
9250
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
31 #include "demux_rtp_internal.h"
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
32
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
33 #include "BasicUsageEnvironment.hh"
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
34 #include "liveMedia.hh"
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
35 #include "GroupsockHelper.hh"
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
36 #include <unistd.h>
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
37
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
38 // A data structure representing input data for each stream:
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
39 class ReadBufferQueue {
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
40 public:
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
41 ReadBufferQueue(MediaSubsession* subsession, demuxer_t* demuxer,
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
42 char const* tag);
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
43 virtual ~ReadBufferQueue();
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
44
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
45 FramedSource* readSource() const { return fReadSource; }
7534
0a936b10b3d8 passthrough timestamps to demuxer
arpi
parents: 7143
diff changeset
46 RTPSource* rtpSource() const { return fRTPSource; }
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
47 demuxer_t* ourDemuxer() const { return fOurDemuxer; }
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
48 char const* tag() const { return fTag; }
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
49
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
50 char blockingFlag; // used to implement synchronous reads
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
51
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
52 // For A/V synchronization:
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
53 Boolean prevPacketWasSynchronized;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
54 float prevPacketPTS;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
55 ReadBufferQueue** otherQueue;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
56
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
57 // The 'queue' actually consists of just a single "demux_packet_t"
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
58 // (because the underlying OS does the actual queueing/buffering):
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
59 demux_packet_t* dp;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
60
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
61 // However, we sometimes inspect buffers before delivering them.
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
62 // For this, we maintain a queue of pending buffers:
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
63 void savePendingBuffer(demux_packet_t* dp);
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
64 demux_packet_t* getPendingBuffer();
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
65
22852
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
66 // For H264 over rtsp using AVParser, the next packet has to be saved
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
67 demux_packet_t* nextpacket;
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
68
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
69 private:
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
70 demux_packet_t* pendingDPHead;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
71 demux_packet_t* pendingDPTail;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
72
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
73 FramedSource* fReadSource;
7534
0a936b10b3d8 passthrough timestamps to demuxer
arpi
parents: 7143
diff changeset
74 RTPSource* fRTPSource;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
75 demuxer_t* fOurDemuxer;
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
76 char const* fTag; // used for debugging
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
77 };
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
78
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
79 // A structure of RTP-specific state, kept so that we can cleanly
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
80 // reclaim it:
32086
048d9fffd740 Remove pointless typedef keyword from struct RTPState declaration; fixes:
diego
parents: 31483
diff changeset
81 struct RTPState {
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
82 char const* sdpDescription;
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
83 RTSPClient* rtspClient;
10054
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
84 SIPClient* sipClient;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
85 MediaSession* mediaSession;
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
86 ReadBufferQueue* audioBufferQueue;
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
87 ReadBufferQueue* videoBufferQueue;
9250
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
88 unsigned flags;
7534
0a936b10b3d8 passthrough timestamps to demuxer
arpi
parents: 7143
diff changeset
89 struct timeval firstSyncTime;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
90 };
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
91
9904
afbbf103a662 Access-controlled RTSP sessions can now be played, if the user uses the
rsf
parents: 9786
diff changeset
92 extern "C" char* network_username;
afbbf103a662 Access-controlled RTSP sessions can now be played, if the user uses the
rsf
parents: 9786
diff changeset
93 extern "C" char* network_password;
10054
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
94 static char* openURL_rtsp(RTSPClient* client, char const* url) {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
95 // If we were given a user name (and optional password), then use them:
10054
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
96 if (network_username != NULL) {
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
97 char const* password = network_password == NULL ? "" : network_password;
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
98 return client->describeWithPassword(url, network_username, password);
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
99 } else {
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
100 return client->describeURL(url);
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
101 }
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
102 }
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
103
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
104 static char* openURL_sip(SIPClient* client, char const* url) {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
105 // If we were given a user name (and optional password), then use them:
10054
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
106 if (network_username != NULL) {
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
107 char const* password = network_password == NULL ? "" : network_password;
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
108 return client->inviteWithPassword(url, network_username, password);
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
109 } else {
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
110 return client->invite(url);
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
111 }
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
112 }
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
113
29280
99063eff7512 Unify over rtsp_transport_tcp as var to hold the -rtsp-stream-over-tcp flag and make sure libnemesi only builds are fine
lu_zero
parents: 29263
diff changeset
114 #ifdef CONFIG_LIBNEMESI
99063eff7512 Unify over rtsp_transport_tcp as var to hold the -rtsp-stream-over-tcp flag and make sure libnemesi only builds are fine
lu_zero
parents: 29263
diff changeset
115 extern int rtsp_transport_tcp;
31281
cc43f6d8bb6b Support RTSP/RTP over HTTP via LIVE555.
cehoyos
parents: 30644
diff changeset
116 extern int rtsp_transport_http;
29280
99063eff7512 Unify over rtsp_transport_tcp as var to hold the -rtsp-stream-over-tcp flag and make sure libnemesi only builds are fine
lu_zero
parents: 29263
diff changeset
117 #else
99063eff7512 Unify over rtsp_transport_tcp as var to hold the -rtsp-stream-over-tcp flag and make sure libnemesi only builds are fine
lu_zero
parents: 29263
diff changeset
118 int rtsp_transport_tcp = 0;
31281
cc43f6d8bb6b Support RTSP/RTP over HTTP via LIVE555.
cehoyos
parents: 30644
diff changeset
119 int rtsp_transport_http = 0;
29280
99063eff7512 Unify over rtsp_transport_tcp as var to hold the -rtsp-stream-over-tcp flag and make sure libnemesi only builds are fine
lu_zero
parents: 29263
diff changeset
120 #endif
99063eff7512 Unify over rtsp_transport_tcp as var to hold the -rtsp-stream-over-tcp flag and make sure libnemesi only builds are fine
lu_zero
parents: 29263
diff changeset
121
32208
4cd07921bec2 Rename preprocessor directives: CONFIG_LIBAVCODEC --> CONFIG_FFMPEG
diego
parents: 32086
diff changeset
122 #ifdef CONFIG_FFMPEG
29453
3a154fb8f85c Make *avcctx AVCodecContext instead of void.
cehoyos
parents: 29451
diff changeset
123 extern AVCodecContext *avcctx;
3a154fb8f85c Make *avcctx AVCodecContext instead of void.
cehoyos
parents: 29451
diff changeset
124 #endif
7664
b10d6345f2a6 Added support for RTSP stream over TCP.
bertrand
parents: 7534
diff changeset
125
12521
27ed4672c619 Added "audio_id", "video_id", "dvdsub_id" to the call to "demux_open()".
rsf
parents: 12043
diff changeset
126 extern "C" int audio_id, video_id, dvdsub_id;
11984
94e1953fbe8e Added support for multiplexed audio+video RTP streams.
rsf
parents: 11755
diff changeset
127 extern "C" demuxer_t* demux_open_rtp(demuxer_t* demuxer) {
12043
8d45dcfc016f Fixed a bug that was accidentally introduced by the addition of MPEG Transport
rsf
parents: 12007
diff changeset
128 Boolean success = False;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
129 do {
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
130 TaskScheduler* scheduler = BasicTaskScheduler::createNew();
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
131 if (scheduler == NULL) break;
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
132 UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler);
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
133 if (env == NULL) break;
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
134
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
135 RTSPClient* rtspClient = NULL;
10054
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
136 SIPClient* sipClient = NULL;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
137
9457
ea1c0a4520bf Repairing breakage to RTP streaming. Patch by Ross Finlayson <finlayson@live.com>
bertrand
parents: 9370
diff changeset
138 if (demuxer == NULL || demuxer->stream == NULL) break; // shouldn't happen
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
139 demuxer->stream->eof = 0; // just in case
9457
ea1c0a4520bf Repairing breakage to RTP streaming. Patch by Ross Finlayson <finlayson@live.com>
bertrand
parents: 9370
diff changeset
140
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
141 // Look at the stream's 'priv' field to see if we were initiated
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
142 // via a SDP description:
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
143 char* sdpDescription = (char*)(demuxer->stream->priv);
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
144 if (sdpDescription == NULL) {
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
145 // We weren't given a SDP description directly, so assume that
10054
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
146 // we were given a RTSP or SIP URL:
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
147 char const* protocol = demuxer->stream->streaming_ctrl->url->protocol;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
148 char const* url = demuxer->stream->streaming_ctrl->url->url;
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
149 extern int verbose;
10054
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
150 if (strcmp(protocol, "rtsp") == 0) {
31281
cc43f6d8bb6b Support RTSP/RTP over HTTP via LIVE555.
cehoyos
parents: 30644
diff changeset
151 if (rtsp_transport_http == 1) {
cc43f6d8bb6b Support RTSP/RTP over HTTP via LIVE555.
cehoyos
parents: 30644
diff changeset
152 rtsp_transport_http = demuxer->stream->streaming_ctrl->url->port;
cc43f6d8bb6b Support RTSP/RTP over HTTP via LIVE555.
cehoyos
parents: 30644
diff changeset
153 rtsp_transport_tcp = 1;
cc43f6d8bb6b Support RTSP/RTP over HTTP via LIVE555.
cehoyos
parents: 30644
diff changeset
154 }
cc43f6d8bb6b Support RTSP/RTP over HTTP via LIVE555.
cehoyos
parents: 30644
diff changeset
155 rtspClient = RTSPClient::createNew(*env, verbose, "MPlayer", rtsp_transport_http);
10054
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
156 if (rtspClient == NULL) {
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
157 fprintf(stderr, "Failed to create RTSP client: %s\n",
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
158 env->getResultMsg());
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
159 break;
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
160 }
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
161 sdpDescription = openURL_rtsp(rtspClient, url);
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
162 } else { // SIP
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
163 unsigned char desiredAudioType = 0; // PCMU (use 3 for GSM)
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
164 sipClient = SIPClient::createNew(*env, desiredAudioType, NULL,
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
165 verbose, "MPlayer");
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
166 if (sipClient == NULL) {
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
167 fprintf(stderr, "Failed to create SIP client: %s\n",
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
168 env->getResultMsg());
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
169 break;
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
170 }
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
171 sipClient->setClientStartPortNum(8000);
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
172 sdpDescription = openURL_sip(sipClient, url);
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
173 }
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
174
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
175 if (sdpDescription == NULL) {
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
176 fprintf(stderr, "Failed to get a SDP description from URL \"%s\": %s\n",
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
177 url, env->getResultMsg());
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
178 break;
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
179 }
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
180 }
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
181
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
182 // Now that we have a SDP description, create a MediaSession from it:
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
183 MediaSession* mediaSession = MediaSession::createNew(*env, sdpDescription);
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
184 if (mediaSession == NULL) break;
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
185
9250
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
186
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
187 // Create a 'RTPState' structure containing the state that we just created,
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
188 // and store it in the demuxer's 'priv' field, for future reference:
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
189 RTPState* rtpState = new RTPState;
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
190 rtpState->sdpDescription = sdpDescription;
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
191 rtpState->rtspClient = rtspClient;
10054
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
192 rtpState->sipClient = sipClient;
9250
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
193 rtpState->mediaSession = mediaSession;
9370
88bd19564b64 Motion-JPEG RTP streams can now be played. Some MPEG-4 ES video RTP
arpi
parents: 9250
diff changeset
194 rtpState->audioBufferQueue = rtpState->videoBufferQueue = NULL;
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
195 rtpState->flags = 0;
9250
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
196 rtpState->firstSyncTime.tv_sec = rtpState->firstSyncTime.tv_usec = 0;
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
197 demuxer->priv = rtpState;
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
198
25237
963cd0542cec Fix playback of streams with more than one video track (only one supported).
cehoyos
parents: 24598
diff changeset
199 int audiofound = 0, videofound = 0;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
200 // Create RTP receivers (sources) for each subsession:
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
201 MediaSubsessionIterator iter(*mediaSession);
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
202 MediaSubsession* subsession;
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
203 unsigned desiredReceiveBufferSize;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
204 while ((subsession = iter.next()) != NULL) {
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
205 // Ignore any subsession that's not audio or video:
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
206 if (strcmp(subsession->mediumName(), "audio") == 0) {
24598
5411b440eb24 Fix playback of streams with more than one audio track (only one supported).
cehoyos
parents: 23569
diff changeset
207 if (audiofound) {
5411b440eb24 Fix playback of streams with more than one audio track (only one supported).
cehoyos
parents: 23569
diff changeset
208 fprintf(stderr, "Additional subsession \"audio/%s\" skipped\n", subsession->codecName());
5411b440eb24 Fix playback of streams with more than one audio track (only one supported).
cehoyos
parents: 23569
diff changeset
209 continue;
5411b440eb24 Fix playback of streams with more than one audio track (only one supported).
cehoyos
parents: 23569
diff changeset
210 }
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
211 desiredReceiveBufferSize = 100000;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
212 } else if (strcmp(subsession->mediumName(), "video") == 0) {
25237
963cd0542cec Fix playback of streams with more than one video track (only one supported).
cehoyos
parents: 24598
diff changeset
213 if (videofound) {
963cd0542cec Fix playback of streams with more than one video track (only one supported).
cehoyos
parents: 24598
diff changeset
214 fprintf(stderr, "Additional subsession \"video/%s\" skipped\n", subsession->codecName());
963cd0542cec Fix playback of streams with more than one video track (only one supported).
cehoyos
parents: 24598
diff changeset
215 continue;
963cd0542cec Fix playback of streams with more than one video track (only one supported).
cehoyos
parents: 24598
diff changeset
216 }
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
217 desiredReceiveBufferSize = 2000000;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
218 } else {
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
219 continue;
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
220 }
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
221
17650
d6e575c86bb8 Allows the LIVE555 library to forces the client's port to be used
bertrand
parents: 16572
diff changeset
222 if (rtsp_port)
d6e575c86bb8 Allows the LIVE555 library to forces the client's port to be used
bertrand
parents: 16572
diff changeset
223 subsession->setClientPortNum (rtsp_port);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
224
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
225 if (!subsession->initiate()) {
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
226 fprintf(stderr, "Failed to initiate \"%s/%s\" RTP subsession: %s\n", subsession->mediumName(), subsession->codecName(), env->getResultMsg());
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
227 } else {
17650
d6e575c86bb8 Allows the LIVE555 library to forces the client's port to be used
bertrand
parents: 16572
diff changeset
228 fprintf(stderr, "Initiated \"%s/%s\" RTP subsession on port %d\n", subsession->mediumName(), subsession->codecName(), subsession->clientPortNum());
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
229
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
230 // Set the OS's socket receive buffer sufficiently large to avoid
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
231 // incoming packets getting dropped between successive reads from this
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
232 // subsession's demuxer. Depending on the bitrate(s) that you expect,
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
233 // you may wish to tweak the "desiredReceiveBufferSize" values above.
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
234 int rtpSocketNum = subsession->rtpSource()->RTPgs()->socketNum();
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
235 int receiveBufferSize
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
236 = increaseReceiveBufferTo(*env, rtpSocketNum,
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
237 desiredReceiveBufferSize);
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
238 if (verbose > 0) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
239 fprintf(stderr, "Increased %s socket receive buffer to %d bytes \n",
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
240 subsession->mediumName(), receiveBufferSize);
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
241 }
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
242
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
243 if (rtspClient != NULL) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
244 // Issue a RTSP "SETUP" command on the chosen subsession:
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
245 if (!rtspClient->setupMediaSubsession(*subsession, False,
29280
99063eff7512 Unify over rtsp_transport_tcp as var to hold the -rtsp-stream-over-tcp flag and make sure libnemesi only builds are fine
lu_zero
parents: 29263
diff changeset
246 rtsp_transport_tcp)) break;
24598
5411b440eb24 Fix playback of streams with more than one audio track (only one supported).
cehoyos
parents: 23569
diff changeset
247 if (!strcmp(subsession->mediumName(), "audio"))
5411b440eb24 Fix playback of streams with more than one audio track (only one supported).
cehoyos
parents: 23569
diff changeset
248 audiofound = 1;
25237
963cd0542cec Fix playback of streams with more than one video track (only one supported).
cehoyos
parents: 24598
diff changeset
249 if (!strcmp(subsession->mediumName(), "video"))
963cd0542cec Fix playback of streams with more than one video track (only one supported).
cehoyos
parents: 24598
diff changeset
250 videofound = 1;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
251 }
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
252 }
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
253 }
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
254
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
255 if (rtspClient != NULL) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
256 // Issue a RTSP aggregate "PLAY" command on the whole session:
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
257 if (!rtspClient->playMediaSession(*mediaSession)) break;
10054
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
258 } else if (sipClient != NULL) {
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
259 sipClient->sendACK(); // to start the stream flowing
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
260 }
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
261
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
262 // Now that the session is ready to be read, do additional
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
263 // MPlayer codec-specific initialization on each subsession:
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
264 iter.reset();
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
265 while ((subsession = iter.next()) != NULL) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
266 if (subsession->readSource() == NULL) continue; // not reading this
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
267
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
268 unsigned flags = 0;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
269 if (strcmp(subsession->mediumName(), "audio") == 0) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
270 rtpState->audioBufferQueue
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
271 = new ReadBufferQueue(subsession, demuxer, "audio");
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
272 rtpState->audioBufferQueue->otherQueue = &(rtpState->videoBufferQueue);
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
273 rtpCodecInitialize_audio(demuxer, subsession, flags);
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
274 } else if (strcmp(subsession->mediumName(), "video") == 0) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
275 rtpState->videoBufferQueue
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
276 = new ReadBufferQueue(subsession, demuxer, "video");
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
277 rtpState->videoBufferQueue->otherQueue = &(rtpState->audioBufferQueue);
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
278 rtpCodecInitialize_video(demuxer, subsession, flags);
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
279 }
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
280 rtpState->flags |= flags;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
281 }
12043
8d45dcfc016f Fixed a bug that was accidentally introduced by the addition of MPEG Transport
rsf
parents: 12007
diff changeset
282 success = True;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
283 } while (0);
12043
8d45dcfc016f Fixed a bug that was accidentally introduced by the addition of MPEG Transport
rsf
parents: 12007
diff changeset
284 if (!success) return NULL; // an error occurred
11984
94e1953fbe8e Added support for multiplexed audio+video RTP streams.
rsf
parents: 11755
diff changeset
285
94e1953fbe8e Added support for multiplexed audio+video RTP streams.
rsf
parents: 11755
diff changeset
286 // Hack: If audio and video are demuxed together on a single RTP stream,
94e1953fbe8e Added support for multiplexed audio+video RTP streams.
rsf
parents: 11755
diff changeset
287 // then create a new "demuxer_t" structure to allow the higher-level
94e1953fbe8e Added support for multiplexed audio+video RTP streams.
rsf
parents: 11755
diff changeset
288 // code to recognize this:
94e1953fbe8e Added support for multiplexed audio+video RTP streams.
rsf
parents: 11755
diff changeset
289 if (demux_is_multiplexed_rtp_stream(demuxer)) {
94e1953fbe8e Added support for multiplexed audio+video RTP streams.
rsf
parents: 11755
diff changeset
290 stream_t* s = new_ds_stream(demuxer->video);
12521
27ed4672c619 Added "audio_id", "video_id", "dvdsub_id" to the call to "demux_open()".
rsf
parents: 12043
diff changeset
291 demuxer_t* od = demux_open(s, DEMUXER_TYPE_UNKNOWN,
27ed4672c619 Added "audio_id", "video_id", "dvdsub_id" to the call to "demux_open()".
rsf
parents: 12043
diff changeset
292 audio_id, video_id, dvdsub_id, NULL);
11984
94e1953fbe8e Added support for multiplexed audio+video RTP streams.
rsf
parents: 11755
diff changeset
293 demuxer = new_demuxers_demuxer(od, od, od);
94e1953fbe8e Added support for multiplexed audio+video RTP streams.
rsf
parents: 11755
diff changeset
294 }
94e1953fbe8e Added support for multiplexed audio+video RTP streams.
rsf
parents: 11755
diff changeset
295
94e1953fbe8e Added support for multiplexed audio+video RTP streams.
rsf
parents: 11755
diff changeset
296 return demuxer;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
297 }
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
298
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
299 extern "C" int demux_is_mpeg_rtp_stream(demuxer_t* demuxer) {
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
300 // Get the RTP state that was stored in the demuxer's 'priv' field:
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
301 RTPState* rtpState = (RTPState*)(demuxer->priv);
9250
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
302
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
303 return (rtpState->flags&RTPSTATE_IS_MPEG12_VIDEO) != 0;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
304 }
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
305
10477
c34185f47b62 Added support for checking whether a RTP demuxer contains combined audio_video data.
rsf
parents: 10054
diff changeset
306 extern "C" int demux_is_multiplexed_rtp_stream(demuxer_t* demuxer) {
c34185f47b62 Added support for checking whether a RTP demuxer contains combined audio_video data.
rsf
parents: 10054
diff changeset
307 // Get the RTP state that was stored in the demuxer's 'priv' field:
c34185f47b62 Added support for checking whether a RTP demuxer contains combined audio_video data.
rsf
parents: 10054
diff changeset
308 RTPState* rtpState = (RTPState*)(demuxer->priv);
c34185f47b62 Added support for checking whether a RTP demuxer contains combined audio_video data.
rsf
parents: 10054
diff changeset
309
c34185f47b62 Added support for checking whether a RTP demuxer contains combined audio_video data.
rsf
parents: 10054
diff changeset
310 return (rtpState->flags&RTPSTATE_IS_MULTIPLEXED) != 0;
c34185f47b62 Added support for checking whether a RTP demuxer contains combined audio_video data.
rsf
parents: 10054
diff changeset
311 }
c34185f47b62 Added support for checking whether a RTP demuxer contains combined audio_video data.
rsf
parents: 10054
diff changeset
312
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
313 static demux_packet_t* getBuffer(demuxer_t* demuxer, demux_stream_t* ds,
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
314 Boolean mustGetNewData,
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
315 float& ptsBehind); // forward
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
316
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
317 extern "C" int demux_rtp_fill_buffer(demuxer_t* demuxer, demux_stream_t* ds) {
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
318 // Get a filled-in "demux_packet" from the RTP source, and deliver it.
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
319 // Note that this is called as a synchronous read operation, so it needs
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
320 // to block in the (hopefully infrequent) case where no packet is
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
321 // immediately available.
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
322
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
323 while (1) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
324 float ptsBehind;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
325 demux_packet_t* dp = getBuffer(demuxer, ds, False, ptsBehind); // blocking
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
326 if (dp == NULL) return 0;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
327
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
328 if (demuxer->stream->eof) return 0; // source stream has closed down
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
329
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
330 // Before using this packet, check to make sure that its presentation
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
331 // time is not far behind the other stream (if any). If it is,
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
332 // then we discard this packet, and get another instead. (The rest of
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
333 // MPlayer doesn't always do a good job of synchronizing when the
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
334 // audio and video streams get this far apart.)
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
335 // (We don't do this when streaming over TCP, because then the audio and
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
336 // video streams are interleaved.)
12007
b41cc72bb8ad We now allow for the possibility of the RTCP audio/video synchronization being
rsf
parents: 11984
diff changeset
337 // (Also, if the stream is *excessively* far behind, then we allow
b41cc72bb8ad We now allow for the possibility of the RTCP audio/video synchronization being
rsf
parents: 11984
diff changeset
338 // the packet, because in this case it probably means that there was
b41cc72bb8ad We now allow for the possibility of the RTCP audio/video synchronization being
rsf
parents: 11984
diff changeset
339 // an error in the source's timestamp synchronization.)
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
340 const float ptsBehindThreshold = 1.0; // seconds
12007
b41cc72bb8ad We now allow for the possibility of the RTCP audio/video synchronization being
rsf
parents: 11984
diff changeset
341 const float ptsBehindLimit = 60.0; // seconds
b41cc72bb8ad We now allow for the possibility of the RTCP audio/video synchronization being
rsf
parents: 11984
diff changeset
342 if (ptsBehind < ptsBehindThreshold ||
b41cc72bb8ad We now allow for the possibility of the RTCP audio/video synchronization being
rsf
parents: 11984
diff changeset
343 ptsBehind > ptsBehindLimit ||
29280
99063eff7512 Unify over rtsp_transport_tcp as var to hold the -rtsp-stream-over-tcp flag and make sure libnemesi only builds are fine
lu_zero
parents: 29263
diff changeset
344 rtsp_transport_tcp) { // packet's OK
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
345 ds_add_packet(ds, dp);
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
346 break;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
347 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
348
9786
177a3393057c Added some optional debugging printfs (disabled by default)
rsf
parents: 9565
diff changeset
349 #ifdef DEBUG_PRINT_DISCARDED_PACKETS
177a3393057c Added some optional debugging printfs (disabled by default)
rsf
parents: 9565
diff changeset
350 RTPState* rtpState = (RTPState*)(demuxer->priv);
177a3393057c Added some optional debugging printfs (disabled by default)
rsf
parents: 9565
diff changeset
351 ReadBufferQueue* bufferQueue = ds == demuxer->video ? rtpState->videoBufferQueue : rtpState->audioBufferQueue;
177a3393057c Added some optional debugging printfs (disabled by default)
rsf
parents: 9565
diff changeset
352 fprintf(stderr, "Discarding %s packet (%fs behind)\n", bufferQueue->tag(), ptsBehind);
177a3393057c Added some optional debugging printfs (disabled by default)
rsf
parents: 9565
diff changeset
353 #endif
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
354 free_demux_packet(dp); // give back this packet, and get another one
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
355 }
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
356
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
357 return 1;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
358 }
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
359
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
360 Boolean awaitRTPPacket(demuxer_t* demuxer, demux_stream_t* ds,
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
361 unsigned char*& packetData, unsigned& packetDataLen,
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
362 float& pts) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
363 // Similar to "demux_rtp_fill_buffer()", except that the "demux_packet"
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
364 // is not delivered to the "demux_stream".
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
365 float ptsBehind;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
366 demux_packet_t* dp = getBuffer(demuxer, ds, True, ptsBehind); // blocking
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
367 if (dp == NULL) return False;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
368
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
369 packetData = dp->buffer;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
370 packetDataLen = dp->len;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
371 pts = dp->pts;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
372
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
373 return True;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
374 }
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
375
10054
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
376 static void teardownRTSPorSIPSession(RTPState* rtpState); // forward
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
377
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
378 extern "C" void demux_close_rtp(demuxer_t* demuxer) {
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
379 // Reclaim all RTP-related state:
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
380
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
381 // Get the RTP state that was stored in the demuxer's 'priv' field:
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
382 RTPState* rtpState = (RTPState*)(demuxer->priv);
7143
fdfc10c2e2d2 - Tell the RTSP client code to use the string "mplayer" in RTSP
arpi
parents: 7008
diff changeset
383 if (rtpState == NULL) return;
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
384
10054
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
385 teardownRTSPorSIPSession(rtpState);
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
386
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
387 UsageEnvironment* env = NULL;
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
388 TaskScheduler* scheduler = NULL;
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
389 if (rtpState->mediaSession != NULL) {
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
390 env = &(rtpState->mediaSession->envir());
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
391 scheduler = &(env->taskScheduler());
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
392 }
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
393 Medium::close(rtpState->mediaSession);
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
394 Medium::close(rtpState->rtspClient);
10054
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
395 Medium::close(rtpState->sipClient);
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
396 delete rtpState->audioBufferQueue;
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
397 delete rtpState->videoBufferQueue;
29585
a17d4f8040f1 free(), delete and delete[] are all different and can't just be used at random,
reimar
parents: 29460
diff changeset
398 delete[] rtpState->sdpDescription;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
399 delete rtpState;
32208
4cd07921bec2 Rename preprocessor directives: CONFIG_LIBAVCODEC --> CONFIG_FFMPEG
diego
parents: 32086
diff changeset
400 #ifdef CONFIG_FFMPEG
29460
d9be78936c0c Fix possible double-free.
cehoyos
parents: 29453
diff changeset
401 av_freep(&avcctx);
29451
6aca83f5ba73 Fix a crash when playing some H264 over rtsp streams: Do pass an
cehoyos
parents: 29280
diff changeset
402 #endif
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
403
12866
332f24a1dd5c Updated to conform to a small change in the LIVE.COM API.
rsf
parents: 12531
diff changeset
404 env->reclaim(); delete scheduler;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
405 }
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
406
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
407 ////////// Extra routines that help implement the above interface functions:
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
408
27776
ef0b0f9291a2 increase the max RTP packet size to 5MB as modern Elphel
attila
parents: 27341
diff changeset
409 #define MAX_RTP_FRAME_SIZE 5000000
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
410 // >= the largest conceivable frame composed from one or more RTP packets
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
411
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
412 static void afterReading(void* clientData, unsigned frameSize,
11755
a79a318585ce Changed to conform to recent changes to the "LIVE.COM Streaming Media" code.
rsf
parents: 10937
diff changeset
413 unsigned /*numTruncatedBytes*/,
a79a318585ce Changed to conform to recent changes to the "LIVE.COM Streaming Media" code.
rsf
parents: 10937
diff changeset
414 struct timeval presentationTime,
a79a318585ce Changed to conform to recent changes to the "LIVE.COM Streaming Media" code.
rsf
parents: 10937
diff changeset
415 unsigned /*durationInMicroseconds*/) {
22463
979b2aa16e80 support for AMR; it works inserting in the first byte of the demux_packet
nicodvb
parents: 22454
diff changeset
416 int headersize = 0;
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
417 if (frameSize >= MAX_RTP_FRAME_SIZE) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
418 fprintf(stderr, "Saw an input frame too large (>=%d). Increase MAX_RTP_FRAME_SIZE in \"demux_rtp.cpp\".\n",
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
419 MAX_RTP_FRAME_SIZE);
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
420 }
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
421 ReadBufferQueue* bufferQueue = (ReadBufferQueue*)clientData;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
422 demuxer_t* demuxer = bufferQueue->ourDemuxer();
7534
0a936b10b3d8 passthrough timestamps to demuxer
arpi
parents: 7143
diff changeset
423 RTPState* rtpState = (RTPState*)(demuxer->priv);
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
424
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
425 if (frameSize > 0) demuxer->stream->eof = 0;
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
426
22851
e878a71cb27f Cosmetics: Move variable declaration and initialization up.
cehoyos
parents: 22759
diff changeset
427 demux_packet_t* dp = bufferQueue->dp;
e878a71cb27f Cosmetics: Move variable declaration and initialization up.
cehoyos
parents: 22759
diff changeset
428
22463
979b2aa16e80 support for AMR; it works inserting in the first byte of the demux_packet
nicodvb
parents: 22454
diff changeset
429 if (bufferQueue->readSource()->isAMRAudioSource())
979b2aa16e80 support for AMR; it works inserting in the first byte of the demux_packet
nicodvb
parents: 22454
diff changeset
430 headersize = 1;
22852
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
431 else if (bufferQueue == rtpState->videoBufferQueue &&
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
432 ((sh_video_t*)demuxer->video->sh)->format == mmioFOURCC('H','2','6','4')) {
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
433 dp->buffer[0]=0x00;
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
434 dp->buffer[1]=0x00;
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
435 dp->buffer[2]=0x01;
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
436 headersize = 3;
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
437 }
22463
979b2aa16e80 support for AMR; it works inserting in the first byte of the demux_packet
nicodvb
parents: 22454
diff changeset
438
979b2aa16e80 support for AMR; it works inserting in the first byte of the demux_packet
nicodvb
parents: 22454
diff changeset
439 resize_demux_packet(dp, frameSize + headersize);
7534
0a936b10b3d8 passthrough timestamps to demuxer
arpi
parents: 7143
diff changeset
440
0a936b10b3d8 passthrough timestamps to demuxer
arpi
parents: 7143
diff changeset
441 // Set the packet's presentation time stamp, depending on whether or
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
442 // not our RTP source's timestamps have been synchronized yet:
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
443 Boolean hasBeenSynchronized
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
444 = bufferQueue->rtpSource()->hasBeenSynchronizedUsingRTCP();
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
445 if (hasBeenSynchronized) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
446 if (verbose > 0 && !bufferQueue->prevPacketWasSynchronized) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
447 fprintf(stderr, "%s stream has been synchronized using RTCP \n",
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
448 bufferQueue->tag());
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
449 }
7534
0a936b10b3d8 passthrough timestamps to demuxer
arpi
parents: 7143
diff changeset
450
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
451 struct timeval* fst = &(rtpState->firstSyncTime); // abbrev
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
452 if (fst->tv_sec == 0 && fst->tv_usec == 0) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
453 *fst = presentationTime;
7534
0a936b10b3d8 passthrough timestamps to demuxer
arpi
parents: 7143
diff changeset
454 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
455
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
456 // For the "pts" field, use the time differential from the first
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
457 // synchronized time, rather than absolute time, in order to avoid
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
458 // round-off errors when converting to a float:
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
459 dp->pts = presentationTime.tv_sec - fst->tv_sec
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
460 + (presentationTime.tv_usec - fst->tv_usec)/1000000.0;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
461 bufferQueue->prevPacketPTS = dp->pts;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
462 } else {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
463 if (verbose > 0 && bufferQueue->prevPacketWasSynchronized) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
464 fprintf(stderr, "%s stream is no longer RTCP-synchronized \n",
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
465 bufferQueue->tag());
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
466 }
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
467
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
468 // use the previous packet's "pts" once again:
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
469 dp->pts = bufferQueue->prevPacketPTS;
7534
0a936b10b3d8 passthrough timestamps to demuxer
arpi
parents: 7143
diff changeset
470 }
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
471 bufferQueue->prevPacketWasSynchronized = hasBeenSynchronized;
7534
0a936b10b3d8 passthrough timestamps to demuxer
arpi
parents: 7143
diff changeset
472
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
473 dp->pos = demuxer->filepos;
22759
e6135bdf4f8a Fix filepos calculation
cehoyos
parents: 22519
diff changeset
474 demuxer->filepos += frameSize + headersize;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
475
9250
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
476 // Signal any pending 'doEventLoop()' call on this queue:
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
477 bufferQueue->blockingFlag = ~0;
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
478 }
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
479
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
480 static void onSourceClosure(void* clientData) {
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
481 ReadBufferQueue* bufferQueue = (ReadBufferQueue*)clientData;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
482 demuxer_t* demuxer = bufferQueue->ourDemuxer();
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
483
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
484 demuxer->stream->eof = 1;
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
485
9250
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
486 // Signal any pending 'doEventLoop()' call on this queue:
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
487 bufferQueue->blockingFlag = ~0;
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
488 }
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
489
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
490 static demux_packet_t* getBuffer(demuxer_t* demuxer, demux_stream_t* ds,
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
491 Boolean mustGetNewData,
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
492 float& ptsBehind) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
493 // Begin by finding the buffer queue that we want to read from:
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
494 // (Get this from the RTP state, which we stored in
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
495 // the demuxer's 'priv' field)
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
496 RTPState* rtpState = (RTPState*)(demuxer->priv);
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
497 ReadBufferQueue* bufferQueue = NULL;
22519
5f3a0a712afb cosmetics: renamed variable amr as headersize, more meaningful; patch by Carl Eugen Hoyos
nicodvb
parents: 22463
diff changeset
498 int headersize = 0;
23554
046d7b14d7f1 Stop playing at eof or if no data arrives for ten seconds.
cehoyos
parents: 23224
diff changeset
499 TaskToken task;
046d7b14d7f1 Stop playing at eof or if no data arrives for ten seconds.
cehoyos
parents: 23224
diff changeset
500
046d7b14d7f1 Stop playing at eof or if no data arrives for ten seconds.
cehoyos
parents: 23224
diff changeset
501 if (demuxer->stream->eof) return NULL;
046d7b14d7f1 Stop playing at eof or if no data arrives for ten seconds.
cehoyos
parents: 23224
diff changeset
502
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
503 if (ds == demuxer->video) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
504 bufferQueue = rtpState->videoBufferQueue;
22852
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
505 if (((sh_video_t*)ds->sh)->format == mmioFOURCC('H','2','6','4'))
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
506 headersize = 3;
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
507 } else if (ds == demuxer->audio) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
508 bufferQueue = rtpState->audioBufferQueue;
22463
979b2aa16e80 support for AMR; it works inserting in the first byte of the demux_packet
nicodvb
parents: 22454
diff changeset
509 if (bufferQueue->readSource()->isAMRAudioSource())
22519
5f3a0a712afb cosmetics: renamed variable amr as headersize, more meaningful; patch by Carl Eugen Hoyos
nicodvb
parents: 22463
diff changeset
510 headersize = 1;
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
511 } else {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
512 fprintf(stderr, "(demux_rtp)getBuffer: internal error: unknown stream\n");
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
513 return NULL;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
514 }
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
515
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
516 if (bufferQueue == NULL || bufferQueue->readSource() == NULL) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
517 fprintf(stderr, "(demux_rtp)getBuffer failed: no appropriate RTP subsession has been set up\n");
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
518 return NULL;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
519 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
520
23555
2237e232cc15 Silence three warnings.
cehoyos
parents: 23554
diff changeset
521 demux_packet_t* dp = NULL;
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
522 if (!mustGetNewData) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
523 // Check whether we have a previously-saved buffer that we can use:
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
524 dp = bufferQueue->getPendingBuffer();
9911
fa45d335a43b Fixed a bug that could sometimes cause the first video packet in a RTP stream
rsf
parents: 9904
diff changeset
525 if (dp != NULL) {
fa45d335a43b Fixed a bug that could sometimes cause the first video packet in a RTP stream
rsf
parents: 9904
diff changeset
526 ptsBehind = 0.0; // so that we always accept this data
fa45d335a43b Fixed a bug that could sometimes cause the first video packet in a RTP stream
rsf
parents: 9904
diff changeset
527 return dp;
fa45d335a43b Fixed a bug that could sometimes cause the first video packet in a RTP stream
rsf
parents: 9904
diff changeset
528 }
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
529 }
9250
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
530
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
531 // Allocate a new packet buffer, and arrange to read into it:
22852
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
532 if (!bufferQueue->nextpacket) {
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
533 dp = new_demux_packet(MAX_RTP_FRAME_SIZE);
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
534 bufferQueue->dp = dp;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
535 if (dp == NULL) return NULL;
22852
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
536 }
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
537
32208
4cd07921bec2 Rename preprocessor directives: CONFIG_LIBAVCODEC --> CONFIG_FFMPEG
diego
parents: 32086
diff changeset
538 #ifdef CONFIG_FFMPEG
22852
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
539 extern AVCodecParserContext * h264parserctx;
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
540 int consumed, poutbuf_size = 1;
23224
f2631612f28b Fix compilation after FFmpeg r8921
cehoyos
parents: 22893
diff changeset
541 const uint8_t *poutbuf = NULL;
23555
2237e232cc15 Silence three warnings.
cehoyos
parents: 23554
diff changeset
542 float lastpts = 0.0;
22852
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
543
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
544 do {
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
545 if (!bufferQueue->nextpacket) {
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
546 #endif
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
547 // Schedule the read operation:
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
548 bufferQueue->blockingFlag = 0;
22519
5f3a0a712afb cosmetics: renamed variable amr as headersize, more meaningful; patch by Carl Eugen Hoyos
nicodvb
parents: 22463
diff changeset
549 bufferQueue->readSource()->getNextFrame(&dp->buffer[headersize], MAX_RTP_FRAME_SIZE - headersize,
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
550 afterReading, bufferQueue,
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
551 onSourceClosure, bufferQueue);
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
552 // Block ourselves until data becomes available:
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
553 TaskScheduler& scheduler
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
554 = bufferQueue->readSource()->envir().taskScheduler();
23569
ba3868fbe12c Simplify network timeout calculation.
cehoyos
parents: 23555
diff changeset
555 int delay = 10000000;
ba3868fbe12c Simplify network timeout calculation.
cehoyos
parents: 23555
diff changeset
556 if (bufferQueue->prevPacketPTS * 1.05 > rtpState->mediaSession->playEndTime())
ba3868fbe12c Simplify network timeout calculation.
cehoyos
parents: 23555
diff changeset
557 delay /= 10;
23554
046d7b14d7f1 Stop playing at eof or if no data arrives for ten seconds.
cehoyos
parents: 23224
diff changeset
558 task = scheduler.scheduleDelayedTask(delay, onSourceClosure, bufferQueue);
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
559 scheduler.doEventLoop(&bufferQueue->blockingFlag);
23554
046d7b14d7f1 Stop playing at eof or if no data arrives for ten seconds.
cehoyos
parents: 23224
diff changeset
560 scheduler.unscheduleDelayedTask(task);
046d7b14d7f1 Stop playing at eof or if no data arrives for ten seconds.
cehoyos
parents: 23224
diff changeset
561 if (demuxer->stream->eof) {
046d7b14d7f1 Stop playing at eof or if no data arrives for ten seconds.
cehoyos
parents: 23224
diff changeset
562 free_demux_packet(dp);
046d7b14d7f1 Stop playing at eof or if no data arrives for ten seconds.
cehoyos
parents: 23224
diff changeset
563 return NULL;
046d7b14d7f1 Stop playing at eof or if no data arrives for ten seconds.
cehoyos
parents: 23224
diff changeset
564 }
9250
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
565
22519
5f3a0a712afb cosmetics: renamed variable amr as headersize, more meaningful; patch by Carl Eugen Hoyos
nicodvb
parents: 22463
diff changeset
566 if (headersize == 1) // amr
22463
979b2aa16e80 support for AMR; it works inserting in the first byte of the demux_packet
nicodvb
parents: 22454
diff changeset
567 dp->buffer[0] =
979b2aa16e80 support for AMR; it works inserting in the first byte of the demux_packet
nicodvb
parents: 22454
diff changeset
568 ((AMRAudioSource*)bufferQueue->readSource())->lastFrameHeader();
32208
4cd07921bec2 Rename preprocessor directives: CONFIG_LIBAVCODEC --> CONFIG_FFMPEG
diego
parents: 32086
diff changeset
569 #ifdef CONFIG_FFMPEG
22852
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
570 } else {
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
571 bufferQueue->dp = dp = bufferQueue->nextpacket;
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
572 bufferQueue->nextpacket = NULL;
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
573 }
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
574 if (headersize == 3 && h264parserctx) { // h264
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
575 consumed = h264parserctx->parser->parser_parse(h264parserctx,
29453
3a154fb8f85c Make *avcctx AVCodecContext instead of void.
cehoyos
parents: 29451
diff changeset
576 avcctx,
22852
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
577 &poutbuf, &poutbuf_size,
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
578 dp->buffer, dp->len);
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
579
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
580 if (!consumed && !poutbuf_size)
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
581 return NULL;
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
582
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
583 if (!poutbuf_size) {
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
584 lastpts=dp->pts;
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
585 free_demux_packet(dp);
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
586 bufferQueue->dp = dp = new_demux_packet(MAX_RTP_FRAME_SIZE);
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
587 } else {
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
588 bufferQueue->nextpacket = dp;
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
589 bufferQueue->dp = dp = new_demux_packet(poutbuf_size);
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
590 memcpy(dp->buffer, poutbuf, poutbuf_size);
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
591 dp->pts=lastpts;
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
592 }
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
593 }
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
594 } while (!poutbuf_size);
d7f4da5e9ee4 Support h264 over rtsp
cehoyos
parents: 22851
diff changeset
595 #endif
22463
979b2aa16e80 support for AMR; it works inserting in the first byte of the demux_packet
nicodvb
parents: 22454
diff changeset
596
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
597 // Set the "ptsBehind" result parameter:
10937
384f6a88a31d Changed the criteria for when to drop RTP packets whose timestamp is too far
rsf
parents: 10477
diff changeset
598 if (bufferQueue->prevPacketPTS != 0.0
384f6a88a31d Changed the criteria for when to drop RTP packets whose timestamp is too far
rsf
parents: 10477
diff changeset
599 && bufferQueue->prevPacketWasSynchronized
384f6a88a31d Changed the criteria for when to drop RTP packets whose timestamp is too far
rsf
parents: 10477
diff changeset
600 && *(bufferQueue->otherQueue) != NULL
384f6a88a31d Changed the criteria for when to drop RTP packets whose timestamp is too far
rsf
parents: 10477
diff changeset
601 && (*(bufferQueue->otherQueue))->prevPacketPTS != 0.0
384f6a88a31d Changed the criteria for when to drop RTP packets whose timestamp is too far
rsf
parents: 10477
diff changeset
602 && (*(bufferQueue->otherQueue))->prevPacketWasSynchronized) {
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
603 ptsBehind = (*(bufferQueue->otherQueue))->prevPacketPTS
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
604 - bufferQueue->prevPacketPTS;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
605 } else {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
606 ptsBehind = 0.0;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
607 }
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
608
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
609 if (mustGetNewData) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
610 // Save this buffer for future reads:
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
611 bufferQueue->savePendingBuffer(dp);
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
612 }
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
613
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
614 return dp;
9250
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
615 }
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
616
10054
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
617 static void teardownRTSPorSIPSession(RTPState* rtpState) {
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
618 MediaSession* mediaSession = rtpState->mediaSession;
10054
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
619 if (mediaSession == NULL) return;
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
620 if (rtpState->rtspClient != NULL) {
22893
777031848801 Use teardownMediaSession() instead of teardownMediaSubsession()
cehoyos
parents: 22852
diff changeset
621 rtpState->rtspClient->teardownMediaSession(*mediaSession);
10054
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
622 } else if (rtpState->sipClient != NULL) {
1342075f81f0 Added SIP (IP telephony) client support. (This was already supported in the
rsf
parents: 9911
diff changeset
623 rtpState->sipClient->sendBYE();
9250
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
624 }
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
625 }
bb490ffeebf5 Restruct by Ross Finlayson <finlayson@live.com>
bertrand
parents: 8987
diff changeset
626
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
627 ////////// "ReadBuffer" and "ReadBufferQueue" implementation:
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
628
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
629 ReadBufferQueue::ReadBufferQueue(MediaSubsession* subsession,
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
630 demuxer_t* demuxer, char const* tag)
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
631 : prevPacketWasSynchronized(False), prevPacketPTS(0.0), otherQueue(NULL),
23555
2237e232cc15 Silence three warnings.
cehoyos
parents: 23554
diff changeset
632 dp(NULL), nextpacket(NULL),
2237e232cc15 Silence three warnings.
cehoyos
parents: 23554
diff changeset
633 pendingDPHead(NULL), pendingDPTail(NULL),
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
634 fReadSource(subsession == NULL ? NULL : subsession->readSource()),
7534
0a936b10b3d8 passthrough timestamps to demuxer
arpi
parents: 7143
diff changeset
635 fRTPSource(subsession == NULL ? NULL : subsession->rtpSource()),
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
636 fOurDemuxer(demuxer), fTag(strdup(tag)) {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
637 }
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
638
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
639 ReadBufferQueue::~ReadBufferQueue() {
29585
a17d4f8040f1 free(), delete and delete[] are all different and can't just be used at random,
reimar
parents: 29460
diff changeset
640 free((void *)fTag);
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
641
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
642 // Free any pending buffers (that never got delivered):
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
643 demux_packet_t* dp = pendingDPHead;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
644 while (dp != NULL) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
645 demux_packet_t* dpNext = dp->next;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
646 dp->next = NULL;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
647 free_demux_packet(dp);
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
648 dp = dpNext;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
649 }
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
650 }
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
651
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
652 void ReadBufferQueue::savePendingBuffer(demux_packet_t* dp) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
653 // Keep this buffer around, until MPlayer asks for it later:
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
654 if (pendingDPTail == NULL) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
655 pendingDPHead = pendingDPTail = dp;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
656 } else {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
657 pendingDPTail->next = dp;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
658 pendingDPTail = dp;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
659 }
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
660 dp->next = NULL;
6910
1a747aee653b applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff changeset
661 }
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
662
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
663 demux_packet_t* ReadBufferQueue::getPendingBuffer() {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
664 demux_packet_t* dp = pendingDPHead;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
665 if (dp != NULL) {
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
666 pendingDPHead = dp->next;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
667 if (pendingDPHead == NULL) pendingDPTail = NULL;
9565
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
668
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
669 dp->next = NULL;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
670 }
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
671
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
672 return dp;
e74916774667 Improved RTP packet buffering, by relying on the underlying OS's UDP
rsf
parents: 9457
diff changeset
673 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15585
diff changeset
674
30644
390c8d36d463 Drop weird and unnecessary _s/_st suffixes from demuxer struct names.
diego
parents: 29585
diff changeset
675 static int demux_rtp_control(struct demuxer *demuxer, int cmd, void *arg) {
22355
20be7be45f47 implementation of DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS; patch by the usual Hoyos
nicodvb
parents: 22353
diff changeset
676 double endpts = ((RTPState*)demuxer->priv)->mediaSession->playEndTime();
20be7be45f47 implementation of DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS; patch by the usual Hoyos
nicodvb
parents: 22353
diff changeset
677
20be7be45f47 implementation of DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS; patch by the usual Hoyos
nicodvb
parents: 22353
diff changeset
678 switch(cmd) {
20be7be45f47 implementation of DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS; patch by the usual Hoyos
nicodvb
parents: 22353
diff changeset
679 case DEMUXER_CTRL_GET_TIME_LENGTH:
20be7be45f47 implementation of DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS; patch by the usual Hoyos
nicodvb
parents: 22353
diff changeset
680 if (endpts <= 0)
20be7be45f47 implementation of DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS; patch by the usual Hoyos
nicodvb
parents: 22353
diff changeset
681 return DEMUXER_CTRL_DONTKNOW;
20be7be45f47 implementation of DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS; patch by the usual Hoyos
nicodvb
parents: 22353
diff changeset
682 *((double *)arg) = endpts;
20be7be45f47 implementation of DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS; patch by the usual Hoyos
nicodvb
parents: 22353
diff changeset
683 return DEMUXER_CTRL_OK;
20be7be45f47 implementation of DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS; patch by the usual Hoyos
nicodvb
parents: 22353
diff changeset
684
20be7be45f47 implementation of DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS; patch by the usual Hoyos
nicodvb
parents: 22353
diff changeset
685 case DEMUXER_CTRL_GET_PERCENT_POS:
20be7be45f47 implementation of DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS; patch by the usual Hoyos
nicodvb
parents: 22353
diff changeset
686 if (endpts <= 0)
20be7be45f47 implementation of DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS; patch by the usual Hoyos
nicodvb
parents: 22353
diff changeset
687 return DEMUXER_CTRL_DONTKNOW;
20be7be45f47 implementation of DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS; patch by the usual Hoyos
nicodvb
parents: 22353
diff changeset
688 *((int *)arg) = (int)(((RTPState*)demuxer->priv)->videoBufferQueue->prevPacketPTS*100/endpts);
20be7be45f47 implementation of DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS; patch by the usual Hoyos
nicodvb
parents: 22353
diff changeset
689 return DEMUXER_CTRL_OK;
20be7be45f47 implementation of DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS; patch by the usual Hoyos
nicodvb
parents: 22353
diff changeset
690
20be7be45f47 implementation of DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS; patch by the usual Hoyos
nicodvb
parents: 22353
diff changeset
691 default:
20be7be45f47 implementation of DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS; patch by the usual Hoyos
nicodvb
parents: 22353
diff changeset
692 return DEMUXER_CTRL_NOTIMPL;
20be7be45f47 implementation of DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS; patch by the usual Hoyos
nicodvb
parents: 22353
diff changeset
693 }
20be7be45f47 implementation of DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS; patch by the usual Hoyos
nicodvb
parents: 22353
diff changeset
694 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15585
diff changeset
695
6b86089c2edd Demuxer modularization
rtognimp
parents: 15585
diff changeset
696 demuxer_desc_t demuxer_desc_rtp = {
16572
56a5f69e9b35 "LIVE.COM Streaming Media" is now called "LIVE555 Streaming Media".
rsf
parents: 16175
diff changeset
697 "LIVE555 RTP demuxer",
25270
f2a95277b9cf Rename demuxer tags to clarify
lu_zero
parents: 25237
diff changeset
698 "live555",
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15585
diff changeset
699 "",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15585
diff changeset
700 "Ross Finlayson",
16572
56a5f69e9b35 "LIVE.COM Streaming Media" is now called "LIVE555 Streaming Media".
rsf
parents: 16175
diff changeset
701 "requires LIVE555 Streaming Media library",
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15585
diff changeset
702 DEMUXER_TYPE_RTP,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15585
diff changeset
703 0, // no autodetect
6b86089c2edd Demuxer modularization
rtognimp
parents: 15585
diff changeset
704 NULL,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15585
diff changeset
705 demux_rtp_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15585
diff changeset
706 demux_open_rtp,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15585
diff changeset
707 demux_close_rtp,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15585
diff changeset
708 NULL,
22355
20be7be45f47 implementation of DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS; patch by the usual Hoyos
nicodvb
parents: 22353
diff changeset
709 demux_rtp_control
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15585
diff changeset
710 };