// 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 CHROME_RENDERER_MEDIA_CAST_RTP_STREAM_H_
#define CHROME_RENDERER_MEDIA_CAST_RTP_STREAM_H_
#include <string>
#include <vector>
#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
class CastAudioSink;
class CastSession;
class CastVideoSink;
// A key value pair structure for codec specific parameters.
struct CastCodecSpecificParams {
std::string key;
std::string value;
CastCodecSpecificParams();
~CastCodecSpecificParams();
};
// Defines the basic properties of a payload supported by cast transport.
struct CastRtpPayloadParams {
// RTP specific field that identifies the content type.
int payload_type;
// RTP specific field to identify a stream.
int ssrc;
// Update frequency of payload sample.
int clock_rate;
// Maximum bitrate.
int max_bitrate;
// Minimum bitrate.
int min_bitrate;
// Number of audio channels.
int channels;
// Width and height of the video content.
int width;
int height;
// Name of the codec used.
std::string codec_name;
// List of codec specific parameters.
std::vector<CastCodecSpecificParams> codec_specific_params;
CastRtpPayloadParams();
~CastRtpPayloadParams();
};
// Defines the capabilities of the transport.
struct CastRtpCaps {
// Defines a list of supported payloads.
std::vector<CastRtpPayloadParams> payloads;
// Names of supported RTCP features.
std::vector<std::string> rtcp_features;
// Names of supported FEC (Forward Error Correction) mechanisms.
std::vector<std::string> fec_mechanisms;
CastRtpCaps();
~CastRtpCaps();
};
typedef CastRtpCaps CastRtpParams;
// This object represents a RTP stream that encodes and optionally
// encrypt audio or video data from a WebMediaStreamTrack.
// Note that this object does not actually output packets. It allows
// configuration of encoding and RTP parameters and control such a logical
// stream.
class CastRtpStream {
public:
CastRtpStream(const blink::WebMediaStreamTrack& track,
const scoped_refptr<CastSession>& session);
~CastRtpStream();
// Return capabilities currently supported by this transport.
CastRtpCaps GetCaps();
// Return parameters set to this transport.
CastRtpParams GetParams();
// Begin encoding of media stream and then submit the encoded streams
// to underlying transport.
void Start(const CastRtpParams& params);
// Stop encoding.
void Stop();
private:
// Return true if this track is an audio track. Return false if this
// track is a video track.
bool IsAudio() const;
blink::WebMediaStreamTrack track_;
const scoped_refptr<CastSession> cast_session_;
scoped_ptr<CastAudioSink> audio_sink_;
scoped_ptr<CastVideoSink> video_sink_;
CastRtpParams params_;
DISALLOW_COPY_AND_ASSIGN(CastRtpStream);
};
#endif // CHROME_RENDERER_MEDIA_CAST_RTP_STREAM_H_