blob: e247059abaa3b47c47162dcc7f16e552b278a31a [file] [log] [blame]
// Copyright 2022 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.
#ifndef COMPONENTS_CAST_STREAMING_PUBLIC_DEMUXER_STREAM_TRAITS_H_
#define COMPONENTS_CAST_STREAMING_PUBLIC_DEMUXER_STREAM_TRAITS_H_
#include <type_traits>
namespace cast_streaming {
// Helper class to wrap all type deductions needed for demuxer stream support in
// the cast streaming component.
//
// |TMojoReceiverType| is the mojom interface used for requesting data buffers.
// Currently expected to be either AudioBufferRequester or VideoBufferRequester.
template <typename TMojoApiType>
class DemuxerStreamTraits {
private:
// Helper class to extract a function parameter type.
template <typename TFunctorType>
struct ArgumentExtractor;
template <typename R, typename Arg>
struct ArgumentExtractor<R(Arg)> {
typedef Arg type;
};
public:
// Deduce the response type to a TMojoReceiverType::GetBuffer() call. Either
// GetAudioBufferResponse or GetVideoBufferResponse.
typedef typename ArgumentExtractor<
typename TMojoApiType::GetBufferCallback::RunType>::type
GetBufferResponseType;
// Deduce the StreamInfo type used in the union GetBufferResponseType. Either
// AudioStreamInfo or VideoStreamInfo.
typedef typename std::remove_reference<
decltype(std::declval<typename GetBufferResponseType::element_type>()
.get_stream_info())>::type StreamInfoType;
// Deduce the Config type associated with this Mojo API. Either
// media::AudioDecoderConfig or media::VideoDecoderConfig.
typedef decltype(StreamInfoType::element_type::decoder_config) ConfigType;
};
} // namespace cast_streaming
#endif // COMPONENTS_CAST_STREAMING_PUBLIC_DEMUXER_STREAM_TRAITS_H_