blob: 6cd48520881ac08ae4a4358028c928d499620465 [file] [log] [blame]
/*
* This file is part of Wireless Display Software for Linux OS
*
* Copyright (C) 2014 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
#include "desktop_media_manager.h"
#include "mirac-glib-logging.hpp"
#include <cassert>
DesktopMediaManager::DesktopMediaManager(const std::string& hostname)
: hostname_(hostname),
format_() {
}
void DesktopMediaManager::Play() {
assert(gst_pipeline_);
gst_pipeline_->SetState(GST_STATE_PLAYING);
}
void DesktopMediaManager::Pause() {
assert(gst_pipeline_);
gst_pipeline_->SetState(GST_STATE_PAUSED);
}
void DesktopMediaManager::Teardown() {
if (gst_pipeline_)
gst_pipeline_->SetState(GST_STATE_READY);
}
bool DesktopMediaManager::IsPaused() const {
return (gst_pipeline_->GetState() != GST_STATE_PLAYING);
}
std::string DesktopMediaManager::GetSessionId() const {
return "abcdefg123456";
}
wds::SessionType DesktopMediaManager::GetSessionType() const {
return wds::VideoSession;
}
void DesktopMediaManager::SetSinkRtpPorts(int port1, int port2) {
sink_port1_ = port1;
sink_port2_ = port2;
gst_pipeline_.reset(new MiracGstTestSource(WFD_DESKTOP, hostname_, port1));
gst_pipeline_->SetState(GST_STATE_READY);
}
std::pair<int, int> DesktopMediaManager::GetSinkRtpPorts() const {
return std::pair<int, int>(sink_port1_, sink_port2_);
}
int DesktopMediaManager::GetLocalRtpPort() const {
return gst_pipeline_->UdpSourcePort();
}
namespace {
std::vector<wds::H264VideoCodec> GetH264VideoCodecs() {
static std::vector<wds::H264VideoCodec> codecs;
if (codecs.empty()) {
wds::RateAndResolutionsBitmap cea_rr;
wds::RateAndResolutionsBitmap vesa_rr;
wds::RateAndResolutionsBitmap hh_rr;
wds::RateAndResolution i;
// declare that we support all resolutions, CHP and level 4.2
// gstreamer should handle all of it :)
for (i = wds::CEA640x480p60; i <= wds::CEA1920x1080p24; ++i)
cea_rr.set(i);
for (i = wds::VESA800x600p30; i <= wds::VESA1920x1200p30; ++i)
vesa_rr.set(i);
for (i = wds::HH800x480p30; i <= wds::HH848x480p60; ++i)
hh_rr.set(i);
wds::H264VideoCodec codec(wds::CHP, wds::k4_2, cea_rr, vesa_rr, hh_rr);
codecs.push_back(codec);
}
return codecs;
}
}
bool DesktopMediaManager::InitOptimalVideoFormat(
const wds::NativeVideoFormat& sink_native_format,
const std::vector<wds::H264VideoCodec>& sink_supported_codecs) {
format_ = wds::FindOptimalVideoFormat(sink_native_format,
GetH264VideoCodecs(),
sink_supported_codecs);
return true;
}
wds::H264VideoFormat DesktopMediaManager::GetOptimalVideoFormat() const {
return format_;
}
bool DesktopMediaManager::InitOptimalAudioFormat(const std::vector<wds::AudioCodec>& sink_codecs) {
for (const auto& codec : sink_codecs) {
if (codec.format == wds::AAC && codec.modes.test(wds::AAC_48K_16B_2CH))
return true;
}
return false;
}
wds::AudioCodec DesktopMediaManager::GetOptimalAudioFormat() const {
wds::AudioModes audio_modes;
audio_modes.set(wds::AAC_48K_16B_2CH);
return wds::AudioCodec(wds::AAC, audio_modes, 0);
}
void DesktopMediaManager::SendIDRPicture() {
WDS_WARNING("Unimplemented IDR picture request");
}