Thu, 15 Jan 2015 15:55:04 +0100
Back out 97036ab72558 which inappropriately compared turds to third parties.
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set sw=2 ts=8 et tw=80 : */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "RtspControllerParent.h"
8 #include "RtspController.h"
9 #include "nsIAuthPromptProvider.h"
10 #include "nsThreadUtils.h"
11 #include "nsProxyRelease.h"
12 #include "mozilla/ipc/InputStreamUtils.h"
13 #include "mozilla/ipc/URIUtils.h"
14 #include "mozilla/unused.h"
15 #include "nsNetUtil.h"
16 #include "prlog.h"
18 #include <sys/types.h>
19 #include <sys/socket.h>
21 PRLogModuleInfo* gRtspLog;
22 #undef LOG
23 #define LOG(args) PR_LOG(gRtspLog, PR_LOG_DEBUG, args)
25 #define SEND_DISCONNECT_IF_ERROR(rv) \
26 if (NS_FAILED(rv) && mIPCOpen && mTotalTracks > 0ul) { \
27 for (uint32_t i = 0; i < mTotalTracks; i++) { \
28 unused << SendOnDisconnected(i, rv); \
29 } \
30 }
32 using namespace mozilla::ipc;
34 namespace mozilla {
35 namespace net {
37 void
38 RtspControllerParent::Destroy()
39 {
40 // If we're being destroyed on a non-main thread, we AddRef again and use a
41 // proxy to release the RtspControllerParent on the main thread, where the
42 // RtspControllerParent is deleted. This ensures we only delete the
43 // RtspControllerParent on the main thread.
44 if (!NS_IsMainThread()) {
45 nsCOMPtr<nsIThread> mainThread = do_GetMainThread();
46 NS_ENSURE_TRUE_VOID(mainThread);
47 nsRefPtr<RtspControllerParent> doomed(this);
48 if (NS_FAILED(NS_ProxyRelease(mainThread,
49 static_cast<nsIStreamingProtocolListener*>(doomed), true))) {
50 NS_WARNING("Failed to proxy release to main thread!");
51 }
52 } else {
53 delete this;
54 }
55 }
57 NS_IMPL_ADDREF(RtspControllerParent)
58 NS_IMPL_RELEASE_WITH_DESTROY(RtspControllerParent, Destroy())
59 NS_IMPL_QUERY_INTERFACE(RtspControllerParent,
60 nsIInterfaceRequestor,
61 nsIStreamingProtocolListener)
63 RtspControllerParent::RtspControllerParent()
64 : mIPCOpen(true)
65 , mTotalTracks(0)
66 {
67 #if defined(PR_LOGGING)
68 if (!gRtspLog)
69 gRtspLog = PR_NewLogModule("nsRtsp");
70 #endif
71 }
73 RtspControllerParent::~RtspControllerParent()
74 {
75 }
77 void
78 RtspControllerParent::ActorDestroy(ActorDestroyReason why)
79 {
80 LOG(("RtspControllerParent::ActorDestroy()"));
81 mIPCOpen = false;
83 NS_ENSURE_TRUE_VOID(mController);
84 if (mController) {
85 mController->Stop();
86 mController = nullptr;
87 }
88 }
90 bool
91 RtspControllerParent::RecvAsyncOpen(const URIParams& aURI)
92 {
93 LOG(("RtspControllerParent::RecvAsyncOpen()"));
95 mURI = DeserializeURI(aURI);
97 mController = new RtspController(nullptr);
98 mController->Init(mURI);
99 nsresult rv = mController->AsyncOpen(this);
100 if (NS_SUCCEEDED(rv)) return true;
102 mController = nullptr;
103 return SendAsyncOpenFailed(rv);
104 }
106 bool
107 RtspControllerParent::RecvPlay()
108 {
109 LOG(("RtspControllerParent::RecvPlay()"));
110 NS_ENSURE_TRUE(mController, true);
112 nsresult rv = mController->Play();
113 SEND_DISCONNECT_IF_ERROR(rv)
114 return true;
115 }
117 bool
118 RtspControllerParent::RecvPause()
119 {
120 LOG(("RtspControllerParent::RecvPause()"));
121 NS_ENSURE_TRUE(mController, true);
123 nsresult rv = mController->Pause();
124 SEND_DISCONNECT_IF_ERROR(rv)
125 return true;
126 }
128 bool
129 RtspControllerParent::RecvResume()
130 {
131 LOG(("RtspControllerParent::RecvResume()"));
132 NS_ENSURE_TRUE(mController, true);
134 nsresult rv = mController->Resume();
135 SEND_DISCONNECT_IF_ERROR(rv)
136 return true;
137 }
139 bool
140 RtspControllerParent::RecvSuspend()
141 {
142 LOG(("RtspControllerParent::RecvSuspend()"));
143 NS_ENSURE_TRUE(mController, true);
145 nsresult rv = mController->Suspend();
146 SEND_DISCONNECT_IF_ERROR(rv)
147 return true;
148 }
150 bool
151 RtspControllerParent::RecvSeek(const uint64_t& offset)
152 {
153 LOG(("RtspControllerParent::RecvSeek()"));
154 NS_ENSURE_TRUE(mController, true);
156 nsresult rv = mController->Seek(offset);
157 SEND_DISCONNECT_IF_ERROR(rv)
158 return true;
159 }
161 bool
162 RtspControllerParent::RecvStop()
163 {
164 LOG(("RtspControllerParent::RecvStop()"));
165 NS_ENSURE_TRUE(mController, true);
167 nsresult rv = mController->Stop();
168 NS_ENSURE_SUCCESS(rv, true);
169 return true;
170 }
172 NS_IMETHODIMP
173 RtspControllerParent::OnMediaDataAvailable(uint8_t index,
174 const nsACString & data,
175 uint32_t length,
176 uint32_t offset,
177 nsIStreamingProtocolMetaData *meta)
178 {
179 NS_ENSURE_ARG_POINTER(meta);
180 uint32_t int32Value;
181 uint64_t int64Value;
183 nsresult rv = meta->GetTimeStamp(&int64Value);
184 NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
186 LOG(("RtspControllerParent:: OnMediaDataAvailable %d:%d time %lld",
187 index, length, int64Value));
189 // Serialize meta data.
190 nsCString name;
191 name.AssignLiteral("TIMESTAMP");
192 InfallibleTArray<RtspMetadataParam> metaData;
193 metaData.AppendElement(RtspMetadataParam(name, int64Value));
195 name.AssignLiteral("FRAMETYPE");
196 rv = meta->GetFrameType(&int32Value);
197 NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
198 metaData.AppendElement(RtspMetadataParam(name, int32Value));
200 nsCString stream;
201 stream.Assign(data);
202 if (!mIPCOpen ||
203 !SendOnMediaDataAvailable(index, stream, length, offset, metaData)) {
204 return NS_ERROR_FAILURE;
205 }
206 return NS_OK;
207 }
209 NS_IMETHODIMP
210 RtspControllerParent::OnConnected(uint8_t index,
211 nsIStreamingProtocolMetaData *meta)
212 {
213 NS_ENSURE_ARG_POINTER(meta);
214 uint32_t int32Value;
215 uint64_t int64Value;
217 LOG(("RtspControllerParent:: OnConnected"));
218 // Serialize meta data.
219 InfallibleTArray<RtspMetadataParam> metaData;
220 nsCString name;
221 name.AssignLiteral("TRACKS");
222 nsresult rv = meta->GetTotalTracks(&mTotalTracks);
223 NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
224 metaData.AppendElement(RtspMetadataParam(name, mTotalTracks));
226 name.AssignLiteral("MIMETYPE");
227 nsCString mimeType;
228 rv = meta->GetMimeType(mimeType);
229 NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
230 metaData.AppendElement(RtspMetadataParam(name, mimeType));
232 name.AssignLiteral("WIDTH");
233 rv = meta->GetWidth(&int32Value);
234 NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
235 metaData.AppendElement(RtspMetadataParam(name, int32Value));
237 name.AssignLiteral("HEIGHT");
238 rv = meta->GetHeight(&int32Value);
239 NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
240 metaData.AppendElement(RtspMetadataParam(name, int32Value));
242 name.AssignLiteral("DURATION");
243 rv = meta->GetDuration(&int64Value);
244 NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
245 metaData.AppendElement(RtspMetadataParam(name, int64Value));
247 name.AssignLiteral("SAMPLERATE");
248 rv = meta->GetSampleRate(&int32Value);
249 NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
250 metaData.AppendElement(RtspMetadataParam(name, int32Value));
252 name.AssignLiteral("TIMESTAMP");
253 rv = meta->GetTimeStamp(&int64Value);
254 NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
255 metaData.AppendElement(RtspMetadataParam(name, int64Value));
257 name.AssignLiteral("CHANNELCOUNT");
258 rv = meta->GetChannelCount(&int32Value);
259 NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
260 metaData.AppendElement(RtspMetadataParam(name, int32Value));
262 nsCString esds;
263 rv = meta->GetEsdsData(esds);
264 NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
265 name.AssignLiteral("ESDS");
266 metaData.AppendElement(RtspMetadataParam(name, esds));
268 nsCString avcc;
269 rv = meta->GetAvccData(avcc);
270 NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
271 name.AssignLiteral("AVCC");
272 metaData.AppendElement(RtspMetadataParam(name, avcc));
274 if (!mIPCOpen || !SendOnConnected(index, metaData)) {
275 return NS_ERROR_FAILURE;
276 }
278 return NS_OK;
279 }
281 NS_IMETHODIMP
282 RtspControllerParent::OnDisconnected(uint8_t index,
283 nsresult reason)
284 {
285 LOG(("RtspControllerParent::OnDisconnected() for track %d reason = 0x%x", index, reason));
286 if (!mIPCOpen || !SendOnDisconnected(index, reason)) {
287 return NS_ERROR_FAILURE;
288 }
289 if (mController) {
290 mController = nullptr;
291 }
292 return NS_OK;
293 }
295 NS_IMETHODIMP
296 RtspControllerParent::GetInterface(const nsIID & iid, void **result)
297 {
298 LOG(("RtspControllerParent::GetInterface()"));
299 return QueryInterface(iid, result);
300 }
302 } // namespace net
303 } // namespace mozilla