blob: 8b2a919739c15f23d1765a57eedadc6dc49fad6f [file] [log] [blame]
// Copyright 2013 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 MEDIA_CAST_CAST_CONFIG_H_
#define MEDIA_CAST_CAST_CONFIG_H_
#include <stddef.h>
#include <stdint.h>
#include <string>
#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "base/memory/unsafe_shared_memory_region.h"
#include "base/single_thread_task_runner.h"
#include "base/time/time.h"
namespace media {
class VideoEncodeAccelerator;
namespace cast {
enum Codec {
CODEC_UNKNOWN,
CODEC_AUDIO_OPUS,
CODEC_AUDIO_PCM16,
CODEC_AUDIO_AAC,
CODEC_AUDIO_REMOTE,
CODEC_VIDEO_FAKE,
CODEC_VIDEO_VP8,
CODEC_VIDEO_H264,
CODEC_VIDEO_REMOTE,
CODEC_VIDEO_VP9,
CODEC_VIDEO_AV1,
CODEC_LAST = CODEC_VIDEO_AV1
};
// Describes the content being transported over RTP streams.
enum class RtpPayloadType {
UNKNOWN = -1,
// Cast Streaming will encode raw audio frames using one of its available
// codec implementations, and transport encoded data in the RTP stream.
FIRST = 96,
AUDIO_OPUS = 96,
AUDIO_AAC = 97,
AUDIO_PCM16 = 98,
// Audio frame data is not modified, and should be transported reliably and
// in-sequence. No assumptions about the data can be made.
REMOTE_AUDIO = 99,
AUDIO_LAST = REMOTE_AUDIO,
// Cast Streaming will encode raw video frames using one of its available
// codec implementations, and transport encoded data in the RTP stream.
VIDEO_VP8 = 100,
VIDEO_H264 = 101,
// Video frame data is not modified, and should be transported reliably and
// in-sequence. No assumptions about the data can be made.
REMOTE_VIDEO = 102,
VIDEO_VP9 = 103,
VIDEO_AV1 = 104,
LAST = VIDEO_AV1
};
// TODO(miu): Eliminate these after moving "default config" into the top-level
// media/cast directory. http://crbug.com/530839
enum SuggestedDefaults {
// Audio encoder bitrate. Zero means "auto," which asks the encoder to select
// a bitrate that dynamically adjusts to the content. Otherwise, a constant
// bitrate is used.
kDefaultAudioEncoderBitrate = 0,
// Suggested default audio sampling rate.
kDefaultAudioSamplingRate = 48000,
// RTP timebase for media remoting RTP streams.
kRemotingRtpTimebase = 90000,
// Suggested default maximum video frame rate.
kDefaultMaxFrameRate = 30,
// End-to-end latency in milliseconds.
//
// DO NOT USE THIS (400 ms is proven as ideal for general-purpose use).
//
// TODO(miu): Change to 400, and confirm nothing has broken in later change.
// http://crbug.com/530839
kDefaultRtpMaxDelayMs = 100,
// Suggested minimum and maximum video bitrates for general-purpose use (up to
// 1080p, 30 FPS).
kDefaultMinVideoBitrate = 300000,
kDefaultMaxVideoBitrate = 5000000,
// Minimum and Maximum VP8 quantizer in default configuration.
kDefaultMaxQp = 63,
kDefaultMinQp = 4,
kDefaultMaxCpuSaverQp = 25,
// Number of video buffers in default configuration (applies only to certain
// external codecs).
kDefaultNumberOfVideoBuffers = 1,
};
// These parameters are only for video encoders.
struct VideoCodecParams {
VideoCodecParams();
VideoCodecParams(const VideoCodecParams& other);
~VideoCodecParams();
int max_qp;
int min_qp;
// The maximum |min_quantizer| set to the encoder when CPU is constrained.
// This is a trade-off between higher resolution with lower encoding quality
// and lower resolution with higher encoding quality. The set value indicates
// the maximum quantizer that the encoder might produce better quality video
// at this resolution than lowering resolution with similar CPU usage and
// smaller quantizer. The set value has to be between |min_qp| and |max_qp|.
// Suggested value range: [4, 30]. It is only used by software VP8 codec.
int max_cpu_saver_qp;
// This field is used differently by various encoders.
//
// It defaults to 1.
//
// For VP8, this field is ignored.
//
// For H.264 on Mac or iOS, it controls the max number of frames the encoder
// may hold before emitting a frame. A larger window may allow higher encoding
// efficiency at the cost of latency and memory. Set to 0 to let the encoder
// choose a suitable value for the platform and other encoding settings.
int max_number_of_video_buffers_used;
int number_of_encode_threads;
};
struct FrameSenderConfig {
FrameSenderConfig();
FrameSenderConfig(const FrameSenderConfig& other);
~FrameSenderConfig();
// The sender's SSRC identifier.
uint32_t sender_ssrc;
// The receiver's SSRC identifier.
uint32_t receiver_ssrc;
// The total amount of time between a frame's capture/recording on the sender
// and its playback on the receiver (i.e., shown to a user). This should be
// set to a value large enough to give the system sufficient time to encode,
// transmit/retransmit, receive, decode, and render; given its run-time
// environment (sender/receiver hardware performance, network conditions,
// etc.).
base::TimeDelta min_playout_delay;
base::TimeDelta max_playout_delay;
// Starting playout delay when streaming animated content.
base::TimeDelta animated_playout_delay;
// RTP payload type enum: Specifies the type/encoding of frame data.
RtpPayloadType rtp_payload_type;
// If true, use an external HW encoder rather than the built-in
// software-based one.
bool use_external_encoder;
// RTP timebase: The number of RTP units advanced per one second. For audio,
// this is the sampling rate. For video, by convention, this is 90 kHz.
int rtp_timebase;
// Number of channels. For audio, this is normally 2. For video, this must
// be 1 as Cast does not have support for stereoscopic video.
int channels;
// For now, only fixed bitrate is used for audio encoding. So for audio,
// |max_bitrate| is used, and the other two will be overriden if they are not
// equal to |max_bitrate|.
int max_bitrate;
int min_bitrate;
int start_bitrate;
double max_frame_rate;
// Codec used for the compression of signal data.
Codec codec;
// The AES crypto key and initialization vector. Each of these strings
// contains the data in binary form, of size kAesKeySize. If they are empty
// strings, crypto is not being used.
std::string aes_key;
std::string aes_iv_mask;
// These are codec specific parameters for video streams only.
VideoCodecParams video_codec_params;
};
// TODO(miu): Naming and minor type changes are badly needed in a later CL.
struct FrameReceiverConfig {
FrameReceiverConfig();
FrameReceiverConfig(const FrameReceiverConfig& other);
~FrameReceiverConfig();
// The receiver's SSRC identifier.
uint32_t receiver_ssrc;
// The sender's SSRC identifier.
uint32_t sender_ssrc;
// The total amount of time between a frame's capture/recording on the sender
// and its playback on the receiver (i.e., shown to a user). This is fixed as
// a value large enough to give the system sufficient time to encode,
// transmit/retransmit, receive, decode, and render; given its run-time
// environment (sender/receiver hardware performance, network conditions,
// etc.).
int rtp_max_delay_ms; // TODO(miu): Change to TimeDelta target_playout_delay.
// RTP payload type enum: Specifies the type/encoding of frame data.
RtpPayloadType rtp_payload_type;
// RTP timebase: The number of RTP units advanced per one second. For audio,
// this is the sampling rate. For video, by convention, this is 90 kHz.
int rtp_timebase;
// Number of channels. For audio, this is normally 2. For video, this must
// be 1 as Cast does not have support for stereoscopic video.
int channels;
// The target frame rate. For audio, this is normally 100 (i.e., frames have
// a duration of 10ms each). For video, this is normally 30, but any frame
// rate is supported.
double target_frame_rate;
// Codec used for the compression of signal data.
// TODO(miu): Merge the AudioCodec and VideoCodec enums into one so this union
// is not necessary.
Codec codec;
// The AES crypto key and initialization vector. Each of these strings
// contains the data in binary form, of size kAesKeySize. If they are empty
// strings, crypto is not being used.
std::string aes_key;
std::string aes_iv_mask;
};
typedef base::OnceCallback<void(scoped_refptr<base::SingleThreadTaskRunner>,
std::unique_ptr<media::VideoEncodeAccelerator>)>
ReceiveVideoEncodeAcceleratorCallback;
typedef base::RepeatingCallback<void(ReceiveVideoEncodeAcceleratorCallback)>
CreateVideoEncodeAcceleratorCallback;
typedef base::OnceCallback<void(base::UnsafeSharedMemoryRegion)>
ReceiveVideoEncodeMemoryCallback;
} // namespace cast
} // namespace media
#endif // MEDIA_CAST_CAST_CONFIG_H_