You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
3.6 KiB
100 lines
3.6 KiB
// Copyright 2019 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "cast/standalone_receiver/streaming_playback_controller.h"
|
|
|
|
#include <string>
|
|
|
|
#if defined(CAST_STANDALONE_RECEIVER_HAVE_EXTERNAL_LIBS)
|
|
#include "cast/standalone_receiver/sdl_audio_player.h"
|
|
#include "cast/standalone_receiver/sdl_glue.h"
|
|
#include "cast/standalone_receiver/sdl_video_player.h"
|
|
#else
|
|
#include "cast/standalone_receiver/dummy_player.h"
|
|
#endif // defined(CAST_STANDALONE_RECEIVER_HAVE_EXTERNAL_LIBS)
|
|
|
|
#include "util/trace_logging.h"
|
|
|
|
namespace openscreen {
|
|
namespace cast {
|
|
|
|
#if defined(CAST_STANDALONE_RECEIVER_HAVE_EXTERNAL_LIBS)
|
|
StreamingPlaybackController::StreamingPlaybackController(
|
|
TaskRunner* task_runner,
|
|
StreamingPlaybackController::Client* client)
|
|
: task_runner_(task_runner),
|
|
client_(client),
|
|
sdl_event_loop_(task_runner_, [this] {
|
|
client_->OnPlaybackError(this,
|
|
Error{Error::Code::kOperationCancelled,
|
|
std::string("SDL event loop closed.")});
|
|
}) {
|
|
OSP_DCHECK(task_runner_ != nullptr);
|
|
OSP_DCHECK(client_ != nullptr);
|
|
constexpr int kDefaultWindowWidth = 1280;
|
|
constexpr int kDefaultWindowHeight = 720;
|
|
window_ = MakeUniqueSDLWindow(
|
|
"Cast Streaming Receiver Demo",
|
|
SDL_WINDOWPOS_UNDEFINED /* initial X position */,
|
|
SDL_WINDOWPOS_UNDEFINED /* initial Y position */, kDefaultWindowWidth,
|
|
kDefaultWindowHeight, SDL_WINDOW_RESIZABLE);
|
|
OSP_CHECK(window_) << "Failed to create SDL window: " << SDL_GetError();
|
|
renderer_ = MakeUniqueSDLRenderer(window_.get(), -1, 0);
|
|
OSP_CHECK(renderer_) << "Failed to create SDL renderer: " << SDL_GetError();
|
|
}
|
|
#else
|
|
StreamingPlaybackController::StreamingPlaybackController(
|
|
TaskRunner* task_runner,
|
|
StreamingPlaybackController::Client* client)
|
|
: task_runner_(task_runner), client_(client) {
|
|
OSP_DCHECK(task_runner_ != nullptr);
|
|
OSP_DCHECK(client_ != nullptr);
|
|
}
|
|
#endif // defined(CAST_STANDALONE_RECEIVER_HAVE_EXTERNAL_LIBS)
|
|
|
|
void StreamingPlaybackController::OnMirroringNegotiated(
|
|
const ReceiverSession* session,
|
|
ReceiverSession::ConfiguredReceivers receivers) {
|
|
TRACE_DEFAULT_SCOPED(TraceCategory::kStandaloneReceiver);
|
|
#if defined(CAST_STANDALONE_RECEIVER_HAVE_EXTERNAL_LIBS)
|
|
if (receivers.audio_receiver) {
|
|
audio_player_ = std::make_unique<SDLAudioPlayer>(
|
|
&Clock::now, task_runner_, receivers.audio_receiver,
|
|
receivers.audio_config.codec, [this] {
|
|
client_->OnPlaybackError(this, audio_player_->error_status());
|
|
});
|
|
}
|
|
if (receivers.video_receiver) {
|
|
video_player_ = std::make_unique<SDLVideoPlayer>(
|
|
&Clock::now, task_runner_, receivers.video_receiver,
|
|
receivers.video_config.codec, renderer_.get(), [this] {
|
|
client_->OnPlaybackError(this, video_player_->error_status());
|
|
});
|
|
}
|
|
#else
|
|
if (receivers.audio_receiver) {
|
|
audio_player_ = std::make_unique<DummyPlayer>(receivers.audio_receiver);
|
|
}
|
|
|
|
if (receivers.video_receiver) {
|
|
video_player_ = std::make_unique<DummyPlayer>(receivers.video_receiver);
|
|
}
|
|
#endif // defined(CAST_STANDALONE_RECEIVER_HAVE_EXTERNAL_LIBS)
|
|
}
|
|
|
|
void StreamingPlaybackController::OnReceiversDestroying(
|
|
const ReceiverSession* session,
|
|
ReceiversDestroyingReason reason) {
|
|
audio_player_.reset();
|
|
video_player_.reset();
|
|
}
|
|
|
|
void StreamingPlaybackController::OnError(const ReceiverSession* session,
|
|
Error error) {
|
|
client_->OnPlaybackError(this, error);
|
|
}
|
|
|
|
} // namespace cast
|
|
} // namespace openscreen
|