Mercurial > mplayer.hg
annotate libmpdemux/demux_rtp.cpp @ 7460:fdf31bb0450f
New option for mplayer: -dumpmicrodvdsub
author | kmkaplan |
---|---|
date | Sat, 21 Sep 2002 17:23:46 +0000 |
parents | fdfc10c2e2d2 |
children | 0a936b10b3d8 |
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; } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
71 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
|
72 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
|
73 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
74 ReadBuffer* head; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
75 ReadBuffer* tail; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
76 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
|
77 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
|
78 private: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
79 FramedSource* fReadSource; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
80 demuxer_t* fOurDemuxer; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
81 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
|
82 }; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
83 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
84 // 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
|
85 // reclaim it: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
86 typedef struct RTPState { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
87 char const* sdpDescription; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
88 RTSPClient* rtspClient; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
89 MediaSession* mediaSession; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
90 ReadBufferQueue* audioBufferQueue; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
91 ReadBufferQueue* videoBufferQueue; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
92 int isMPEG; // TRUE for MPEG audio, video, or transport streams |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
93 }; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
94 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
95 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
|
96 do { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
97 TaskScheduler* scheduler = BasicTaskScheduler::createNew(); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
98 if (scheduler == NULL) break; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
99 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
|
100 if (env == NULL) break; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
101 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
102 RTSPClient* rtspClient = NULL; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
103 int isMPEG = 0; |
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 // 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
|
106 // via a SDP description: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
107 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
|
108 if (sdpDescription == NULL) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
109 // 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
|
110 // 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
|
111 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
|
112 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
113 extern int verbose; |
7143
fdfc10c2e2d2
- Tell the RTSP client code to use the string "mplayer" in RTSP
arpi
parents:
7008
diff
changeset
|
114 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
|
115 if (rtspClient == NULL) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
116 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
|
117 env->getResultMsg()); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
118 break; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
119 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
120 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
121 sdpDescription = rtspClient->describeURL(url); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
122 if (sdpDescription == NULL) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
123 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
|
124 url, env->getResultMsg()); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
125 break; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
126 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
127 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
128 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
129 // 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
|
130 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
|
131 if (mediaSession == NULL) break; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
132 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
133 // 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
|
134 MediaSubsessionIterator iter(*mediaSession); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
135 MediaSubsession* subsession; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
136 MediaSubsession* audioSubsession = NULL; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
137 MediaSubsession* videoSubsession = NULL; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
138 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
|
139 // 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
|
140 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
|
141 audioSubsession = subsession; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
142 } 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
|
143 videoSubsession = subsession; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
144 } else { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
145 continue; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
146 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
147 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
148 if (!subsession->initiate()) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
149 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
|
150 } else { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
151 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
|
152 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
153 if (rtspClient != NULL) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
154 // 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
|
155 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
|
156 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
|
157 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
158 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
159 // 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
|
160 // 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
|
161 if (subsession == videoSubsession) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
162 // 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
|
163 // 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
|
164 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
|
165 BITMAPINFOHEADER* bih |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
166 = (BITMAPINFOHEADER*)calloc(1,sizeof(BITMAPINFOHEADER)); |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
167 bih->biSize = sizeof(BITMAPINFOHEADER); |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
168 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
|
169 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
|
170 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
|
171 |
7008
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
172 // 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
|
173 // 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
|
174 // 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
|
175 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
|
176 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
|
177 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
|
178 isMPEG = 1; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
179 } 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
|
180 strcmp(subsession->codecName(), "H263-1998") == 0) { |
7008
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
181 bih->biCompression = sh_video->format |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
182 = 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
|
183 } else if (strcmp(subsession->codecName(), "H261") == 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','1'); |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
186 } else { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
187 fprintf(stderr, |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
188 "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
|
189 subsession->codecName()); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
190 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
191 } else if (subsession == audioSubsession) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
192 // 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
|
193 // 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
|
194 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
|
195 WAVEFORMATEX* wf = (WAVEFORMATEX*)calloc(1,sizeof(WAVEFORMATEX)); |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
196 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
|
197 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
|
198 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
|
199 |
7008
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
200 // 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
|
201 // 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
|
202 // of the parameters to be set.) |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
203 wf->nSamplesPerSec |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
204 = 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
|
205 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
|
206 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
|
207 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
|
208 wf->wFormatTag = sh_audio->format = 0x55; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
209 // 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
|
210 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
|
211 } else if (strcmp(subsession->codecName(), "AC3") == 0) { |
7008
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
212 wf->wFormatTag = sh_audio->format = 0x2000; |
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(), "PCMU") == 0) { |
7008
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
215 wf->wFormatTag = sh_audio->format = 0x7; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
216 wf->nChannels = 1; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
217 wf->nAvgBytesPerSec = 8000; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
218 wf->nBlockAlign = 1; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
219 wf->wBitsPerSample = 8; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
220 wf->cbSize = 0; |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
221 } else if (strcmp(subsession->codecName(), "PCMA") == 0) { |
7008
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
222 wf->wFormatTag = sh_audio->format = 0x6; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
223 wf->nChannels = 1; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
224 wf->nAvgBytesPerSec = 8000; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
225 wf->nBlockAlign = 1; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
226 wf->wBitsPerSample = 8; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
227 wf->cbSize = 0; |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
228 } else if (strcmp(subsession->codecName(), "GSM") == 0) { |
7008
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
229 wf->wFormatTag = sh_audio->format = 0x31; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
230 wf->nChannels = 1; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
231 wf->nAvgBytesPerSec = 1650; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
232 wf->nBlockAlign = 33; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
233 wf->wBitsPerSample = 16; |
2af81c9ed167
- Create and set up a "BITMAPINFOHEADER" and "WAVEFORMATEX" structure for
arpi
parents:
6910
diff
changeset
|
234 wf->cbSize = 0; |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
235 } else { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
236 fprintf(stderr, |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
237 "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
|
238 subsession->codecName()); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
239 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
240 } |
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 } |
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 // 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
|
245 // 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
|
246 RTPState* rtpState = new RTPState; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
247 rtpState->sdpDescription = sdpDescription; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
248 rtpState->rtspClient = rtspClient; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
249 rtpState->mediaSession = mediaSession; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
250 rtpState->audioBufferQueue |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
251 = 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
|
252 rtpState->videoBufferQueue |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
253 = 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
|
254 rtpState->isMPEG = isMPEG; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
255 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
256 demuxer->priv = rtpState; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
257 } while (0); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
258 } |
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 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
|
261 // 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
|
262 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
|
263 return rtpState->isMPEG; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
264 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
265 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
266 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
|
267 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
|
268 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
269 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
|
270 // 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
|
271 // 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
|
272 // 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
|
273 // immediately available. |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
274 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
275 // 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
|
276 // (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
|
277 // 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
|
278 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
|
279 ReadBufferQueue* bufferQueue = NULL; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
280 if (ds == demuxer->video) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
281 bufferQueue = rtpState->videoBufferQueue; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
282 } 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
|
283 bufferQueue = rtpState->audioBufferQueue; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
284 } else { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
285 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
|
286 return 0; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
287 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
288 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
289 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
|
290 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
|
291 return 0; |
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 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
294 // 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
|
295 bufferQueue->blockingFlag = 0; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
296 while (!deliverBufferIfAvailable(bufferQueue, ds)) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
297 // 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
|
298 // 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
|
299 TaskScheduler& scheduler |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
300 = bufferQueue->readSource()->envir().taskScheduler(); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
301 scheduler.blockMyself(&bufferQueue->blockingFlag); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
302 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
303 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
304 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
|
305 return 1; |
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 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
|
309 // 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
|
310 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
311 // 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
|
312 RTPState* rtpState = (RTPState*)(demuxer->priv); |
7143
fdfc10c2e2d2
- Tell the RTSP client code to use the string "mplayer" in RTSP
arpi
parents:
7008
diff
changeset
|
313 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
|
314 UsageEnvironment* env = NULL; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
315 TaskScheduler* scheduler = NULL; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
316 if (rtpState->mediaSession != NULL) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
317 env = &(rtpState->mediaSession->envir()); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
318 scheduler = &(env->taskScheduler()); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
319 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
320 Medium::close(rtpState->mediaSession); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
321 Medium::close(rtpState->rtspClient); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
322 delete rtpState->audioBufferQueue; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
323 delete rtpState->videoBufferQueue; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
324 delete rtpState->sdpDescription; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
325 delete rtpState; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
326 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
327 delete env; delete scheduler; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
328 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
329 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
330 ////////// 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
|
331 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
332 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
|
333 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
334 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
|
335 demux_stream_t* ds) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
336 Boolean deliveredBuffer = False; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
337 ReadBuffer* readBuffer = bufferQueue->dequeue(); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
338 if (readBuffer != NULL) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
339 // 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
|
340 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
|
341 deliveredBuffer = True; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
342 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
343 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
344 // 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
|
345 scheduleNewBufferRead(bufferQueue); |
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 return deliveredBuffer; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
348 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
349 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
350 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
|
351 struct timeval presentationTime); // forward |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
352 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
|
353 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
354 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
|
355 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
|
356 // 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
|
357 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
358 // 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
|
359 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
|
360 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
|
361 if (dp == NULL) return; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
362 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
|
363 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
364 // Schedule the read operation: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
365 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
|
366 afterReading, readBuffer, |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
367 onSourceClosure, readBuffer); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
368 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
369 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
370 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
|
371 struct timeval /*presentationTime*/) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
372 ReadBuffer* readBuffer = (ReadBuffer*)clientData; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
373 ReadBufferQueue* bufferQueue = readBuffer->ourQueue(); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
374 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
|
375 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
376 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
|
377 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
378 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
|
379 dp->len = frameSize; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
380 dp->pts = 0; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
381 dp->pos = demuxer->filepos; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
382 demuxer->filepos += frameSize; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
383 if (!readBuffer->enqueue()) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
384 // 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
|
385 delete readBuffer; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
386 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
387 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
388 // 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
|
389 bufferQueue->blockingFlag = ~0; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
390 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
391 // 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
|
392 scheduleNewBufferRead(bufferQueue); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
393 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
394 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
395 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
|
396 ReadBuffer* readBuffer = (ReadBuffer*)clientData; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
397 ReadBufferQueue* bufferQueue = readBuffer->ourQueue(); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
398 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
|
399 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
400 demuxer->stream->eof = 1; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
401 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
402 // 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
|
403 bufferQueue->blockingFlag = ~0; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
404 } |
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 ////////// "ReadBuffer" and "ReadBufferQueue" implementation: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
407 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
408 #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
|
409 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
410 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
|
411 : 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
|
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 Boolean ReadBuffer::enqueue() { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
415 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
|
416 // 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
|
417 // 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
|
418 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
|
419 delete fOurQueue->dequeue(); |
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 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
422 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
423 // 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
|
424 if (fOurQueue->tail == NULL) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
425 fOurQueue->head = this; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
426 } else { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
427 fOurQueue->tail->next = this; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
428 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
429 fOurQueue->tail = this; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
430 ++fOurQueue->counter; |
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 return True; |
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 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
435 ReadBuffer::~ReadBuffer() { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
436 free_demux_packet(fDP); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
437 delete next; |
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 ReadBufferQueue::ReadBufferQueue(MediaSubsession* subsession, |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
441 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
|
442 : 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
|
443 fReadSource(subsession == NULL ? NULL : subsession->readSource()), |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
444 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
|
445 } |
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 ReadBufferQueue::~ReadBufferQueue() { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
448 delete head; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
449 delete fTag; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
450 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
451 |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
452 ReadBuffer* ReadBufferQueue::dequeue() { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
453 ReadBuffer* readBuffer = head; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
454 if (readBuffer != NULL) { |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
455 head = readBuffer->next; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
456 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
|
457 --counter; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
458 readBuffer->next = NULL; |
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 return readBuffer; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
diff
changeset
|
461 } |