/* * 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 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 DesktopMediaManager::GetSinkRtpPorts() const { return std::pair(sink_port1_, sink_port2_); } int DesktopMediaManager::GetLocalRtpPort() const { return gst_pipeline_->UdpSourcePort(); } namespace { std::vector GetH264VideoCodecs() { static std::vector 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& 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& 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"); }