Mercurial > mplayer.hg
annotate libmpdemux/demux_rtp.cpp @ 7600:4ec0a7228b81
new ac/vc/afm/vfm/ao/vo options
author | jonas |
---|---|
date | Sat, 05 Oct 2002 15:18:25 +0000 |
parents | 0a936b10b3d8 |
children | b10d6345f2a6 |
rev | line source |
---|---|
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
1 extern "C" { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
2 #include "demux_rtp.h" |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
3 #include "stheader.h" |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
4 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
5 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
6 #include "BasicUsageEnvironment.hh" |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
7 #include "liveMedia.hh" |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
8 #include <unistd.h> |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
9 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
10 ////////// Routines (with C-linkage) that interface between "mplayer" |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
11 ////////// and the "LIVE.COM Streaming Media" libraries: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
12 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
13 extern "C" stream_t* stream_open_sdp(int fd, off_t fileSize, |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
14 int* file_format) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
15 *file_format = DEMUXER_TYPE_RTP; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
16 stream_t* newStream = NULL; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
17 do { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
18 char* sdpDescription = (char*)malloc(fileSize+1); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
19 if (sdpDescription == NULL) break; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
20 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
21 ssize_t numBytesRead = read(fd, sdpDescription, fileSize); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
22 if (numBytesRead != fileSize) break; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
23 sdpDescription[fileSize] = '\0'; // to be safe |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
24 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
25 newStream = (stream_t*)calloc(sizeof (stream_t), 1); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
26 if (newStream == NULL) break; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
27 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
28 // Store the SDP description in the 'priv' field, for later use: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
29 newStream->priv = sdpDescription; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
30 } while (0); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
31 return newStream; |
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 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
34 extern "C" int _rtsp_streaming_seek(int /*fd*/, off_t /*pos*/, |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
35 streaming_ctrl_t* /*streaming_ctrl*/) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
36 return -1; // For now, we don't handle RTSP stream seeking |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
37 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
38 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
39 extern "C" int rtsp_streaming_start(stream_t* stream) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
40 stream->streaming_ctrl->streaming_seek = _rtsp_streaming_seek; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
41 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
42 return 0; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
43 } |
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 // A data structure representing a buffer being read: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
46 class ReadBufferQueue; // forward |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
47 class ReadBuffer { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
48 public: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
49 ReadBuffer(ReadBufferQueue* ourQueue, demux_packet_t* dp); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
50 virtual ~ReadBuffer(); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
51 Boolean enqueue(); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
52 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
53 demux_packet_t* dp() const { return fDP; } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
54 ReadBufferQueue* ourQueue() { return fOurQueue; } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
55 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
56 ReadBuffer* next; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
57 private: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
58 demux_packet_t* fDP; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
59 ReadBufferQueue* fOurQueue; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
60 }; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
61 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
62 class ReadBufferQueue { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
63 public: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
64 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
|
65 char const* tag); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
66 virtual ~ReadBufferQueue(); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
67 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
68 ReadBuffer* dequeue(); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
69 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
70 FramedSource* readSource() const { return fReadSource; } |
7534 | 71 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
|
72 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
|
73 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
|
74 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
75 ReadBuffer* head; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
76 ReadBuffer* tail; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
77 char blockingFlag; // used to implement synchronous reads |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
78 unsigned counter; // used for debugging |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
79 private: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
80 FramedSource* fReadSource; |
7534 | 81 RTPSource* fRTPSource; |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
82 demuxer_t* fOurDemuxer; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
83 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
|
84 }; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
85 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
86 // 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
|
87 // reclaim it: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
88 typedef struct RTPState { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
89 char const* sdpDescription; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
90 RTSPClient* rtspClient; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
91 MediaSession* mediaSession; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
92 ReadBufferQueue* audioBufferQueue; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
93 ReadBufferQueue* videoBufferQueue; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
94 int isMPEG; // TRUE for MPEG audio, video, or transport streams |
7534 | 95 struct timeval firstSyncTime; |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
96 }; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
97 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
98 extern "C" void demux_open_rtp(demuxer_t* demuxer) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
99 do { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
100 TaskScheduler* scheduler = BasicTaskScheduler::createNew(); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
101 if (scheduler == NULL) break; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
102 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
|
103 if (env == NULL) break; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
104 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
105 RTSPClient* rtspClient = NULL; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
106 int isMPEG = 0; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
107 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
108 // 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
|
109 // via a SDP description: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
110 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
|
111 if (sdpDescription == NULL) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
112 // We weren't given a SDP description directly, so assume that |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
113 // we were give a RTSP URL |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
114 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
|
115 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
116 extern int verbose; |
7143
fdfc10c2e2d2
- Tell the RTSP client code to use the string "mplayer" in RTSP
arpi
parents:
7008
diff
changeset
|
117 rtspClient = RTSPClient::createNew(*env, verbose, "mplayer"); |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
118 if (rtspClient == NULL) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
119 fprintf(stderr, "Failed to create RTSP client: %s\n", |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
120 env->getResultMsg()); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
121 break; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
122 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
123 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
124 sdpDescription = rtspClient->describeURL(url); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
125 if (sdpDescription == NULL) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
126 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
|
127 url, env->getResultMsg()); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
128 break; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
129 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
130 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
131 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
132 // 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
|
133 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
|
134 if (mediaSession == NULL) break; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
135 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
136 // 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
|
137 MediaSubsessionIterator iter(*mediaSession); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
138 MediaSubsession* subsession; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
139 MediaSubsession* audioSubsession = NULL; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
140 MediaSubsession* videoSubsession = NULL; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
141 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
|
142 // 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
|
143 if (strcmp(subsession->mediumName(), "audio") == 0) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
144 audioSubsession = subsession; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
145 } else if (strcmp(subsession->mediumName(), "video") == 0) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
146 videoSubsession = subsession; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
147 } else { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
148 continue; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
149 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
150 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
151 if (!subsession->initiate()) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
152 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
|
153 } else { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
154 fprintf(stderr, "Initiated \"%s/%s\" RTP subsession\n", subsession->mediumName(), subsession->codecName()); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
155 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
156 if (rtspClient != NULL) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
157 // Issue RTSP "SETUP" and "PLAY" commands on the chosen subsession: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
158 if (!rtspClient->setupMediaSubsession(*subsession)) break; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
159 if (!rtspClient->playMediaSubsession(*subsession)) break; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
160 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
161 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
162 // Now that the subsession is ready to be read, do additional |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
163 // mplayer-specific initialization on it: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
164 if (subsession == videoSubsession) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
165 // Create a dummy video stream header |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
166 // to make the main mplayer code happy: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
167 sh_video_t* sh_video = new_sh_video(demuxer,0); |
7008
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
168 BITMAPINFOHEADER* bih |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
169 = (BITMAPINFOHEADER*)calloc(1,sizeof(BITMAPINFOHEADER)); |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
170 bih->biSize = sizeof(BITMAPINFOHEADER); |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
171 sh_video->bih = bih; |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
172 demux_stream_t* d_video = demuxer->video; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
173 d_video->sh = sh_video; sh_video->ds = d_video; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
174 |
7008
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
175 // Map known video MIME types to the BITMAPINFOHEADER parameters |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
176 // that this program uses. (Note that not all types need all |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
177 // of the parameters to be set.) |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
178 if (strcmp(subsession->codecName(), "MPV") == 0 || |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
179 strcmp(subsession->codecName(), "MP1S") == 0 || |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
180 strcmp(subsession->codecName(), "MP2T") == 0) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
181 isMPEG = 1; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
182 } else if (strcmp(subsession->codecName(), "H263") == 0 || |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
183 strcmp(subsession->codecName(), "H263-1998") == 0) { |
7008
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
184 bih->biCompression = sh_video->format |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
185 = mmioFOURCC('H','2','6','3'); |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
186 } else if (strcmp(subsession->codecName(), "H261") == 0) { |
7008
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
187 bih->biCompression = sh_video->format |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
188 = mmioFOURCC('H','2','6','1'); |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
189 } else { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
190 fprintf(stderr, |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
191 "Unknown mplayer format code for MIME type \"video/%s\"\n", |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
192 subsession->codecName()); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
193 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
194 } else if (subsession == audioSubsession) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
195 // Create a dummy audio stream header |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
196 // to make the main mplayer code happy: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
197 sh_audio_t* sh_audio = new_sh_audio(demuxer,0); |
7008
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
198 WAVEFORMATEX* wf = (WAVEFORMATEX*)calloc(1,sizeof(WAVEFORMATEX)); |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
199 sh_audio->wf = wf; |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
200 demux_stream_t* d_audio = demuxer->audio; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
201 d_audio->sh = sh_audio; sh_audio->ds = d_audio; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
202 |
7008
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
203 // Map known audio MIME types to the WAVEFORMATEX parameters |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
204 // that this program uses. (Note that not all types need all |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
205 // of the parameters to be set.) |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
206 wf->nSamplesPerSec |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
207 = subsession->rtpSource()->timestampFrequency(); // by default |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
208 if (strcmp(subsession->codecName(), "MPA") == 0 || |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
209 strcmp(subsession->codecName(), "MPA-ROBUST") == 0 || |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
210 strcmp(subsession->codecName(), "X-MP3-DRAFT-00") == 0) { |
7008
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
211 wf->wFormatTag = sh_audio->format = 0x55; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
212 // Note: 0x55 is for layer III, but should work for I,II also |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
213 wf->nSamplesPerSec = 0; // sample rate is deduced from the data |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
214 } else if (strcmp(subsession->codecName(), "AC3") == 0) { |
7008
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
215 wf->wFormatTag = sh_audio->format = 0x2000; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
216 wf->nSamplesPerSec = 0; // sample rate is deduced from the data |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
217 } else if (strcmp(subsession->codecName(), "PCMU") == 0) { |
7008
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
218 wf->wFormatTag = sh_audio->format = 0x7; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
219 wf->nChannels = 1; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
220 wf->nAvgBytesPerSec = 8000; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
221 wf->nBlockAlign = 1; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
222 wf->wBitsPerSample = 8; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
223 wf->cbSize = 0; |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
224 } else if (strcmp(subsession->codecName(), "PCMA") == 0) { |
7008
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
225 wf->wFormatTag = sh_audio->format = 0x6; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
226 wf->nChannels = 1; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
227 wf->nAvgBytesPerSec = 8000; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
228 wf->nBlockAlign = 1; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
229 wf->wBitsPerSample = 8; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
230 wf->cbSize = 0; |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
231 } else if (strcmp(subsession->codecName(), "GSM") == 0) { |
7008
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
232 wf->wFormatTag = sh_audio->format = 0x31; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
233 wf->nChannels = 1; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
234 wf->nAvgBytesPerSec = 1650; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
235 wf->nBlockAlign = 33; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
236 wf->wBitsPerSample = 16; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
237 wf->cbSize = 0; |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
238 } else { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
239 fprintf(stderr, |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
240 "Unknown mplayer format code for MIME type \"audio/%s\"\n", |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
241 subsession->codecName()); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
242 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
243 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
244 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
245 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
246 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
247 // Hack: Create a 'RTPState' structure containing the state that |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
248 // we just created, and store it 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
|
249 RTPState* rtpState = new RTPState; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
250 rtpState->sdpDescription = sdpDescription; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
251 rtpState->rtspClient = rtspClient; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
252 rtpState->mediaSession = mediaSession; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
253 rtpState->audioBufferQueue |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
254 = new ReadBufferQueue(audioSubsession, demuxer, "audio"); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
255 rtpState->videoBufferQueue |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
256 = new ReadBufferQueue(videoSubsession, demuxer, "video"); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
257 rtpState->isMPEG = isMPEG; |
7534 | 258 rtpState->firstSyncTime.tv_sec = rtpState->firstSyncTime.tv_usec = 0; |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
259 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
260 demuxer->priv = rtpState; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
261 } while (0); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
262 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
263 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
264 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
|
265 // 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
|
266 RTPState* rtpState = (RTPState*)(demuxer->priv); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
267 return rtpState->isMPEG; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
268 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
269 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
270 static Boolean deliverBufferIfAvailable(ReadBufferQueue* bufferQueue, |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
271 demux_stream_t* ds); // forward |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
272 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
273 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
|
274 // 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
|
275 // 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
|
276 // 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
|
277 // immediately available. |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
278 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
279 // Begin by finding the buffer queue that we want to read from: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
280 // (Get this from the RTP state, which we stored in |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
281 // 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
|
282 RTPState* rtpState = (RTPState*)(demuxer->priv); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
283 ReadBufferQueue* bufferQueue = NULL; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
284 if (ds == demuxer->video) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
285 bufferQueue = rtpState->videoBufferQueue; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
286 } else if (ds == demuxer->audio) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
287 bufferQueue = rtpState->audioBufferQueue; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
288 } else { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
289 fprintf(stderr, "demux_rtp_fill_buffer: internal error: unknown stream\n"); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
290 return 0; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
291 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
292 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
293 if (bufferQueue == NULL || bufferQueue->readSource() == NULL) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
294 fprintf(stderr, "demux_rtp_fill_buffer failed: no appropriate RTP subsession has been set up\n"); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
295 return 0; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
296 } |
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 // Check whether there's a full buffer to deliver to the client: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
299 bufferQueue->blockingFlag = 0; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
300 while (!deliverBufferIfAvailable(bufferQueue, ds)) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
301 // Because we weren't able to deliver a buffer to the client immediately, |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
302 // block myself until one comes available: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
303 TaskScheduler& scheduler |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
304 = bufferQueue->readSource()->envir().taskScheduler(); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
305 scheduler.blockMyself(&bufferQueue->blockingFlag); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
306 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
307 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
308 if (demuxer->stream->eof) return 0; // source stream has closed down |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
309 return 1; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
310 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
311 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
312 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
|
313 // 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
|
314 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
315 // 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
|
316 RTPState* rtpState = (RTPState*)(demuxer->priv); |
7143
fdfc10c2e2d2
- Tell the RTSP client code to use the string "mplayer" in RTSP
arpi
parents:
7008
diff
changeset
|
317 if (rtpState == NULL) return; |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
318 UsageEnvironment* env = NULL; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
319 TaskScheduler* scheduler = NULL; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
320 if (rtpState->mediaSession != NULL) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
321 env = &(rtpState->mediaSession->envir()); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
322 scheduler = &(env->taskScheduler()); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
323 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
324 Medium::close(rtpState->mediaSession); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
325 Medium::close(rtpState->rtspClient); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
326 delete rtpState->audioBufferQueue; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
327 delete rtpState->videoBufferQueue; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
328 delete rtpState->sdpDescription; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
329 delete rtpState; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
330 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
331 delete env; delete scheduler; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
332 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
333 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
334 ////////// 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
|
335 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
336 static void scheduleNewBufferRead(ReadBufferQueue* bufferQueue); // forward |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
337 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
338 static Boolean deliverBufferIfAvailable(ReadBufferQueue* bufferQueue, |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
339 demux_stream_t* ds) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
340 Boolean deliveredBuffer = False; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
341 ReadBuffer* readBuffer = bufferQueue->dequeue(); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
342 if (readBuffer != NULL) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
343 // Append the packet to the reader's DS stream: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
344 ds_add_packet(ds, readBuffer->dp()); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
345 deliveredBuffer = True; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
346 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
347 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
348 // Arrange to read a new packet into this queue: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
349 scheduleNewBufferRead(bufferQueue); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
350 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
351 return deliveredBuffer; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
352 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
353 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
354 static void afterReading(void* clientData, unsigned frameSize, |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
355 struct timeval presentationTime); // forward |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
356 static void onSourceClosure(void* clientData); // forward |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
357 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
358 static void scheduleNewBufferRead(ReadBufferQueue* bufferQueue) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
359 if (bufferQueue->readSource()->isCurrentlyAwaitingData()) return; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
360 // a read from this source is already in progress |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
361 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
362 // Allocate a new packet buffer, and arrange to read into it: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
363 unsigned const bufferSize = 30000; // >= the largest conceivable RTP packet |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
364 demux_packet_t* dp = new_demux_packet(bufferSize); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
365 if (dp == NULL) return; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
366 ReadBuffer* readBuffer = new ReadBuffer(bufferQueue, dp); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
367 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
368 // Schedule the read operation: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
369 bufferQueue->readSource()->getNextFrame(dp->buffer, bufferSize, |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
370 afterReading, readBuffer, |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
371 onSourceClosure, readBuffer); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
372 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
373 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
374 static void afterReading(void* clientData, unsigned frameSize, |
7534 | 375 struct timeval presentationTime) { |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
376 ReadBuffer* readBuffer = (ReadBuffer*)clientData; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
377 ReadBufferQueue* bufferQueue = readBuffer->ourQueue(); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
378 demuxer_t* demuxer = bufferQueue->ourDemuxer(); |
7534 | 379 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
|
380 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
381 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
|
382 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
383 demux_packet_t* dp = readBuffer->dp(); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
384 dp->len = frameSize; |
7534 | 385 |
386 // Set the packet's presentation time stamp, depending on whether or | |
387 // not our RTP source's timestamps have been synchronized yet: | |
388 { | |
389 Boolean hasBeenSynchronized | |
390 = bufferQueue->rtpSource()->hasBeenSynchronizedUsingRTCP(); | |
391 if (hasBeenSynchronized) { | |
392 struct timeval* fst = &(rtpState->firstSyncTime); // abbrev | |
393 if (fst->tv_sec == 0 && fst->tv_usec == 0) { | |
394 *fst = presentationTime; | |
395 } | |
396 | |
397 // For the "pts" field, use the time differential from the first | |
398 // synchronized time, rather than absolute time, in order to avoid | |
399 // round-off errors when converting to a float: | |
400 dp->pts = presentationTime.tv_sec - fst->tv_sec | |
401 + (presentationTime.tv_usec - fst->tv_usec)/1000000.0; | |
402 } else { | |
403 dp->pts = 0.0; | |
404 } | |
405 } | |
406 | |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
407 dp->pos = demuxer->filepos; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
408 demuxer->filepos += frameSize; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
409 if (!readBuffer->enqueue()) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
410 // The queue is full, so discard the buffer: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
411 delete readBuffer; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
412 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
413 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
414 // Signal any pending 'blockMyself()' call on this queue: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
415 bufferQueue->blockingFlag = ~0; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
416 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
417 // Finally, arrange to do another read, if appropriate |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
418 scheduleNewBufferRead(bufferQueue); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
419 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
420 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
421 static void onSourceClosure(void* clientData) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
422 ReadBuffer* readBuffer = (ReadBuffer*)clientData; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
423 ReadBufferQueue* bufferQueue = readBuffer->ourQueue(); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
424 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
|
425 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
426 demuxer->stream->eof = 1; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
427 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
428 // Signal any pending 'blockMyself()' call on this queue: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
429 bufferQueue->blockingFlag = ~0; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
430 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
431 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
432 ////////// "ReadBuffer" and "ReadBufferQueue" implementation: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
433 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
434 #define MAX_QUEUE_SIZE 5 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
435 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
436 ReadBuffer::ReadBuffer(ReadBufferQueue* ourQueue, demux_packet_t* dp) |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
437 : next(NULL), fDP(dp), fOurQueue(ourQueue) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
438 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
439 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
440 Boolean ReadBuffer::enqueue() { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
441 if (fOurQueue->counter >= MAX_QUEUE_SIZE) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
442 // This queue is full. Clear out an old entry from it, so that |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
443 // this new one will fit: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
444 while (fOurQueue->counter >= MAX_QUEUE_SIZE) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
445 delete fOurQueue->dequeue(); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
446 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
447 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
448 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
449 // Add ourselves to the tail of our queue: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
450 if (fOurQueue->tail == NULL) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
451 fOurQueue->head = this; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
452 } else { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
453 fOurQueue->tail->next = this; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
454 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
455 fOurQueue->tail = this; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
456 ++fOurQueue->counter; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
457 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
458 return True; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
459 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
460 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
461 ReadBuffer::~ReadBuffer() { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
462 free_demux_packet(fDP); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
463 delete next; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
464 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
465 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
466 ReadBufferQueue::ReadBufferQueue(MediaSubsession* subsession, |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
467 demuxer_t* demuxer, char const* tag) |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
468 : head(NULL), tail(NULL), counter(0), |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
469 fReadSource(subsession == NULL ? NULL : subsession->readSource()), |
7534 | 470 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
|
471 fOurDemuxer(demuxer), fTag(strdup(tag)) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
472 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
473 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
474 ReadBufferQueue::~ReadBufferQueue() { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
475 delete head; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
476 delete fTag; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
477 } |
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 ReadBuffer* ReadBufferQueue::dequeue() { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
480 ReadBuffer* readBuffer = head; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
481 if (readBuffer != NULL) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
482 head = readBuffer->next; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
483 if (head == NULL) tail = NULL; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
484 --counter; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
485 readBuffer->next = NULL; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
486 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
487 return readBuffer; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
488 } |