blob: 056f19fff8806308808db59fca7d1f5214d7896f [file] [log] [blame]
// Copyright 2020 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 "fuchsia/cast_streaming/config_conversions.h"
#include "base/notreached.h"
#include "media/base/media_util.h"
namespace cast_streaming {
openscreen::cast::AudioCaptureConfig AudioDecoderConfigToAudioCaptureConfig(
const media::AudioDecoderConfig& audio_config) {
openscreen::cast::AudioCaptureConfig audio_capture_config;
switch (audio_config.codec()) {
case media::AudioCodec::kCodecAAC:
audio_capture_config.codec = openscreen::cast::AudioCodec::kAac;
break;
case media::AudioCodec::kCodecOpus:
audio_capture_config.codec = openscreen::cast::AudioCodec::kOpus;
break;
default:
NOTREACHED();
}
audio_capture_config.channels =
media::ChannelLayoutToChannelCount(audio_config.channel_layout());
audio_capture_config.sample_rate = audio_config.samples_per_second();
return audio_capture_config;
}
openscreen::cast::VideoCaptureConfig VideoDecoderConfigToVideoCaptureConfig(
const media::VideoDecoderConfig& video_config) {
openscreen::cast::VideoCaptureConfig video_capture_config;
switch (video_config.codec()) {
case media::VideoCodec::kCodecH264:
video_capture_config.codec = openscreen::cast::VideoCodec::kH264;
break;
case media::VideoCodec::kCodecVP8:
video_capture_config.codec = openscreen::cast::VideoCodec::kVp8;
break;
default:
NOTREACHED();
}
video_capture_config.resolutions.push_back(
{video_config.visible_rect().width(),
video_config.visible_rect().height()});
return video_capture_config;
}
media::AudioDecoderConfig AudioCaptureConfigToAudioDecoderConfig(
const openscreen::cast::AudioCaptureConfig& audio_capture_config) {
// Gather data for the audio decoder config.
media::AudioCodec media_audio_codec = media::AudioCodec::kUnknownAudioCodec;
switch (audio_capture_config.codec) {
case openscreen::cast::AudioCodec::kAac:
media_audio_codec = media::AudioCodec::kCodecAAC;
break;
case openscreen::cast::AudioCodec::kOpus:
media_audio_codec = media::AudioCodec::kCodecOpus;
break;
default:
NOTREACHED();
break;
}
return media::AudioDecoderConfig(
media_audio_codec, media::SampleFormat::kSampleFormatF32,
media::GuessChannelLayout(audio_capture_config.channels),
audio_capture_config.sample_rate /* samples_per_second */,
media::EmptyExtraData(), media::EncryptionScheme::kUnencrypted);
}
media::VideoDecoderConfig VideoCaptureConfigToVideoDecoderConfig(
const openscreen::cast::VideoCaptureConfig& video_capture_config) {
// Gather data for the video decoder config.
uint32_t video_width = video_capture_config.resolutions[0].width;
uint32_t video_height = video_capture_config.resolutions[0].height;
gfx::Size video_size(video_width, video_height);
gfx::Rect video_rect(video_width, video_height);
media::VideoCodec media_video_codec = media::VideoCodec::kUnknownVideoCodec;
media::VideoCodecProfile video_codec_profile =
media::VideoCodecProfile::VIDEO_CODEC_PROFILE_UNKNOWN;
switch (video_capture_config.codec) {
case openscreen::cast::VideoCodec::kH264:
media_video_codec = media::VideoCodec::kCodecH264;
video_codec_profile = media::VideoCodecProfile::H264PROFILE_BASELINE;
break;
case openscreen::cast::VideoCodec::kVp8:
media_video_codec = media::VideoCodec::kCodecVP8;
video_codec_profile = media::VideoCodecProfile::VP8PROFILE_MIN;
break;
case openscreen::cast::VideoCodec::kHevc:
case openscreen::cast::VideoCodec::kVp9:
default:
NOTREACHED();
break;
}
return media::VideoDecoderConfig(
media_video_codec, video_codec_profile,
media::VideoDecoderConfig::AlphaMode::kIsOpaque, media::VideoColorSpace(),
media::VideoTransformation(), video_size, video_rect, video_size,
media::EmptyExtraData(), media::EncryptionScheme::kUnencrypted);
}
} // namespace cast_streaming