1f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/*
2f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * libjingle
34a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch * Copyright 2004--2010, Google Inc.
4f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *
5f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Redistribution and use in source and binary forms, with or without
6f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * modification, are permitted provided that the following conditions are met:
7f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *
8f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *  1. Redistributions of source code must retain the above copyright notice,
9f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *     this list of conditions and the following disclaimer.
10f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *  2. Redistributions in binary form must reproduce the above copyright notice,
11f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *     this list of conditions and the following disclaimer in the documentation
12f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *     and/or other materials provided with the distribution.
13f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *  3. The name of the author may not be used to endorse or promote products
14f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *     derived from this software without specific prior written permission.
15f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *
16f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */
27f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
28f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifndef TALK_SESSION_PHONE_MEDIACHANNEL_H_
29f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define TALK_SESSION_PHONE_MEDIACHANNEL_H_
30f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include <string>
32f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <vector>
33f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
34f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/basictypes.h"
35f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/sigslot.h"
36f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/socket.h"
37f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/session/phone/codec.h"
38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// TODO: re-evaluate this include
39f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/session/phone/audiomonitor.h"
40f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace talk_base {
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass Buffer;
43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
45f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochnamespace flute {
46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass MagicCamVideoRenderer;
47f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
48f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
49f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochnamespace cricket {
50f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst size_t kMinRtpPacketLen = 12;
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst size_t kMinRtcpPacketLen = 4;
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst size_t kMaxRtpPacketLen = 2048;
54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
55f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochenum VoiceMediaChannelOptions {
56f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  OPT_CONFERENCE = 0x10000,   // tune the audio stream for conference mode
57f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  OPT_ENERGYLEVEL = 0x20000,  // include the energy level in RTP packets, as
58f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch                              // defined in https://datatracker.ietf.org/drafts/
59f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch                              // draft-lennox-avt-rtp-audio-level-exthdr/
60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
61f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch};
62f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
63f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochenum VideoMediaChannelOptions {
64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  OPT_INTERPOLATE = 0x10000   // Increase the output framerate by 2x by
65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                              // interpolating frames
66f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch};
67f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
68f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass MediaChannel : public sigslot::has_slots<> {
69f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public:
70f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  class NetworkInterface {
71f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch   public:
72f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    enum SocketType { ST_RTP, ST_RTCP };
73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    virtual bool SendPacket(talk_base::Buffer* packet) = 0;
74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    virtual bool SendRtcp(talk_base::Buffer* packet) = 0;
75f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    virtual int SetOption(SocketType type, talk_base::Socket::Option opt,
76f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch                          int option) = 0;
77f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    virtual ~NetworkInterface() {}
78f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  };
79f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
80f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  MediaChannel() : network_interface_(NULL) {}
81f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual ~MediaChannel() {}
82f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
83f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Gets/sets the abstract inteface class for sending RTP/RTCP data.
84f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  NetworkInterface *network_interface() { return network_interface_; }
85f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual void SetInterface(NetworkInterface *iface) {
86f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    network_interface_ = iface;
87f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  }
88f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
89f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Called when a RTP packet is received.
90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnPacketReceived(talk_base::Buffer* packet) = 0;
91f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Called when a RTCP packet is received.
92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnRtcpReceived(talk_base::Buffer* packet) = 0;
93f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Sets the SSRC to be used for outgoing data.
94f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual void SetSendSsrc(uint32 id) = 0;
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Set the CNAME of RTCP
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool SetRtcpCName(const std::string& cname) = 0;
97f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Mutes the channel.
98f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool Mute(bool on) = 0;
99f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
100f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool SetRtpExtensionHeaders(bool enable_all) { return true; }
1014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual bool SetSendBandwidth(bool autobw, int bps) = 0;
102f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool SetOptions(int options) = 0;
103f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
104f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch protected:
105f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  NetworkInterface *network_interface_;
106f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch};
107f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
108f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochenum SendFlags {
109f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  SEND_NOTHING,
110f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  SEND_RINGBACKTONE,
111f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  SEND_MICROPHONE
112f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch};
113f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstruct VoiceSenderInfo {
115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  uint32 ssrc;
116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int bytes_sent;
117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int packets_sent;
118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int packets_lost;
119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  float fraction_lost;
120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int ext_seqnum;
121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int rtt_ms;
122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int jitter_ms;
123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int audio_level;
124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstruct VoiceReceiverInfo {
127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  uint32 ssrc;
128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int bytes_rcvd;
129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int packets_rcvd;
130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int packets_lost;
131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  float fraction_lost;
132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int ext_seqnum;
133dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int jitter_ms;
134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int audio_level;
135f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch};
136f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstruct VideoSenderInfo {
138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  uint32 ssrc;
139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int bytes_sent;
140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int packets_sent;
141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int packets_cached;
142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int packets_lost;
143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  float fraction_lost;
144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int firs_rcvd;
145dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int nacks_rcvd;
146dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int rtt_ms;
147dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int frame_width;
148dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int frame_height;
149dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int framerate_input;
150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int framerate_sent;
1514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch};
1524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstruct VideoReceiverInfo {
154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  uint32 ssrc;
155dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int bytes_rcvd;
156dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // vector<int> layer_bytes_rcvd;
157dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int packets_rcvd;
158dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int packets_lost;
159dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int packets_concealed;
160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  float fraction_lost;
161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int firs_sent;
162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int nacks_sent;
163dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int frame_width;
164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int frame_height;
165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int framerate_rcvd;
166dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int framerate_decoded;
167dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int framerate_output;
168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
170dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstruct VoiceMediaInfo {
171dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void Clear() {
172dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    senders.clear();
173dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    receivers.clear();
174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
175dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::vector<VoiceSenderInfo> senders;
176dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::vector<VoiceReceiverInfo> receivers;
177dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
178dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
179dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstruct VideoMediaInfo {
180dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void Clear() {
181dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    senders.clear();
182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    receivers.clear();
183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
184dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::vector<VideoSenderInfo> senders;
185dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::vector<VideoReceiverInfo> receivers;
1864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch};
187f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
188f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass VoiceMediaChannel : public MediaChannel {
189f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public:
190dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  enum Error {
191dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_NONE = 0,                       // No error.
192dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_OTHER,                          // Other errors.
193dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_REC_DEVICE_OPEN_FAILED = 100,   // Could not open mic.
194dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_REC_DEVICE_MUTED,               // Mic was muted by OS.
195dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_REC_DEVICE_SILENT,              // No background noise picked up.
196dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_REC_DEVICE_SATURATION,          // Mic input is clipping.
197dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_REC_DEVICE_REMOVED,             // Mic was removed while active.
198dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_REC_RUNTIME_ERROR,              // Processing is encountering errors.
199dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_REC_SRTP_ERROR,                 // Generic SRTP failure.
200dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_PLAY_DEVICE_OPEN_FAILED = 200,  // Could not open playout.
201dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_PLAY_DEVICE_MUTED,              // Playout muted by OS.
202dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_PLAY_DEVICE_REMOVED,            // Playout removed while active.
203dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_PLAY_RUNTIME_ERROR,             // Errors in voice processing.
204dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_PLAY_SRTP_ERROR,                // Generic SRTP failure.
205dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_PLAY_SRTP_AUTH_FAILED,          // Failed to authenticate packets.
206dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  };
207dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
208f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  VoiceMediaChannel() {}
209f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual ~VoiceMediaChannel() {}
210f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Sets the codecs/payload types to be used for incoming media.
2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool SetRecvCodecs(const std::vector<AudioCodec>& codecs) = 0;
212f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Sets the codecs/payload types to be used for outgoing media.
2133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool SetSendCodecs(const std::vector<AudioCodec>& codecs) = 0;
214f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Starts or stops playout of received audio.
215f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool SetPlayout(bool playout) = 0;
216f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Starts or stops sending (and potentially capture) of local audio.
217f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool SetSend(SendFlags flag) = 0;
218f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Adds a new receive-only stream with the specified SSRC.
219f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool AddStream(uint32 ssrc) = 0;
220f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Removes a stream added with AddStream.
221f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool RemoveStream(uint32 ssrc) = 0;
222f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Gets current energy levels for all incoming streams.
223f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool GetActiveStreams(AudioInfo::StreamList* actives) = 0;
224f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Get the current energy level for the outgoing stream.
225f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual int GetOutputLevel() = 0;
226f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Specifies a ringback tone to be played during call setup.
227f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual void SetRingbackTone(const char *buf, int len) = 0;
228f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Plays or stops the aforementioned ringback tone
229f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool PlayRingbackTone(bool play, bool loop) = 0;
230f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Sends a out-of-band DTMF signal using the specified event.
231f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool PressDTMF(int event, bool playout) = 0;
232f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Gets quality stats for the channel.
233f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool GetStats(VoiceMediaInfo* info) = 0;
234dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Gets last reported error for this media channel.
235dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void GetLastMediaError(uint32* ssrc,
236dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                 VoiceMediaChannel::Error* error) {
237dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ASSERT(error != NULL);
238dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    *error = ERROR_NONE;
239dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
240dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
241dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Signal errors from MediaChannel.  Arguments are:
242dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  //     ssrc(uint32), and error(VoiceMediaChannel::Error).
243dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  sigslot::signal2<uint32, VoiceMediaChannel::Error> SignalMediaError;
244f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch};
245f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
2463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Represents a YUV420 (a.k.a. I420) video frame.
247f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass VideoFrame {
248f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  friend class flute::MagicCamVideoRenderer;
249f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
250f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public:
251f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  VideoFrame() : rendered_(false) {}
252f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
253f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual ~VideoFrame() {}
254f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
255f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual size_t GetWidth() const = 0;
256f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual size_t GetHeight() const = 0;
257f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual const uint8 *GetYPlane() const = 0;
258f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual const uint8 *GetUPlane() const = 0;
259f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual const uint8 *GetVPlane() const = 0;
260f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual uint8 *GetYPlane() = 0;
261f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual uint8 *GetUPlane() = 0;
262f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual uint8 *GetVPlane() = 0;
263f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual int32 GetYPitch() const = 0;
264f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual int32 GetUPitch() const = 0;
265f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual int32 GetVPitch() const = 0;
266f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
267f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // For retrieving the aspect ratio of each pixel. Usually this is 1x1, but
268f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // the aspect_ratio_idc parameter of H.264 can specify non-square pixels.
269f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual size_t GetPixelWidth() const = 0;
270f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual size_t GetPixelHeight() const = 0;
271f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
272731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO: Add a fourcc format here and probably combine VideoFrame
2733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // with CapturedFrame.
2743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual int64 GetElapsedTime() const = 0;
2753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual int64 GetTimeStamp() const = 0;
2763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void SetElapsedTime(int64 elapsed_time) = 0;
2773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void SetTimeStamp(int64 time_stamp) = 0;
2783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Make a copy of the frame. The frame buffer itself may not be copied,
2804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // in which case both the current and new VideoFrame will share a single
2814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // reference-counted frame buffer.
2824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual VideoFrame *Copy() const = 0;
2834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
284f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Writes the frame into the given frame buffer, provided that it is of
285f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // sufficient size. Returns the frame's actual size, regardless of whether
286f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // it was written or not (like snprintf). If there is insufficient space,
287f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // nothing is written.
288f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual size_t CopyToBuffer(uint8 *buffer, size_t size) const = 0;
289f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
290dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Converts the I420 data to RGB of a certain type such as ARGB and ABGR.
291f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Returns the frame's actual size, regardless of whether it was written or
292f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // not (like snprintf). Parameters size and pitch_rgb are in units of bytes.
293f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // If there is insufficient space, nothing is written.
294f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual size_t ConvertToRgbBuffer(uint32 to_fourcc, uint8 *buffer,
295f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch                                    size_t size, size_t pitch_rgb) const = 0;
296f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
297f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Writes the frame into the given planes, stretched to the given width and
2983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // height. The parameter "interpolate" controls whether to interpolate or just
2993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // take the nearest-point. The parameter "crop" controls whether to crop this
3003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // frame to the aspect ratio of the given dimensions before stretching.
301f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual void StretchToPlanes(uint8 *y, uint8 *u, uint8 *v,
302f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch                               int32 pitchY, int32 pitchU, int32 pitchV,
303f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch                               size_t width, size_t height,
3043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                               bool interpolate, bool crop) const = 0;
305f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
3063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Writes the frame into the given frame buffer, stretched to the given width
3073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // and height, provided that it is of sufficient size. Returns the frame's
3083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // actual size, regardless of whether it was written or not (like snprintf).
3093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // If there is insufficient space, nothing is written. The parameter
310f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // "interpolate" controls whether to interpolate or just take the
3113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // nearest-point. The parameter "crop" controls whether to crop this frame to
3123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // the aspect ratio of the given dimensions before stretching.
313f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual size_t StretchToBuffer(size_t w, size_t h, uint8 *buffer, size_t size,
3143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                 bool interpolate, bool crop) const = 0;
315f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
316f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Writes the frame into the target VideoFrame, stretched to the size of that
3173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // frame. The parameter "interpolate" controls whether to interpolate or just
3183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // take the nearest-point. The parameter "crop" controls whether to crop this
3193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // frame to the aspect ratio of the target frame before stretching.
3203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void StretchToFrame(VideoFrame *target, bool interpolate,
3213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              bool crop) const = 0;
322f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
323f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Stretches the frame to the given size, creating a new VideoFrame object to
3243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // hold it. The parameter "interpolate" controls whether to interpolate or
3253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // just take the nearest-point. The parameter "crop" controls whether to crop
3263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // this frame to the aspect ratio of the given dimensions before stretching.
3273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual VideoFrame *Stretch(size_t w, size_t h, bool interpolate,
3283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              bool crop) const = 0;
329f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
330f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Size of an I420 image of given dimensions when stored as a frame buffer.
331f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  static size_t SizeOf(size_t w, size_t h) {
3324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    return w * h + ((w + 1) / 2) * ((h + 1) / 2) * 2;
333f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  }
334f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
335f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch protected:
336f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // The frame needs to be rendered to magiccam only once.
337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO: Remove this flag once magiccam rendering is fully replaced
338f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // by client3d rendering.
339f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  mutable bool rendered_;
340f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch};
341f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
342f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// Simple subclass for use in mocks.
343f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass NullVideoFrame : public VideoFrame {
344f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public:
345f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual size_t GetWidth() const { return 0; }
346f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual size_t GetHeight() const { return 0; }
347f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual const uint8 *GetYPlane() const { return NULL; }
348f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual const uint8 *GetUPlane() const { return NULL; }
349f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual const uint8 *GetVPlane() const { return NULL; }
350f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual uint8 *GetYPlane() { return NULL; }
351f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual uint8 *GetUPlane() { return NULL; }
352f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual uint8 *GetVPlane() { return NULL; }
353f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual int32 GetYPitch() const { return 0; }
354f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual int32 GetUPitch() const { return 0; }
355f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual int32 GetVPitch() const { return 0; }
356f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
357f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual size_t GetPixelWidth() const { return 1; }
358f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual size_t GetPixelHeight() const { return 1; }
3593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual int64 GetElapsedTime() const { return 0; }
3603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual int64 GetTimeStamp() const { return 0; }
3613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void SetElapsedTime(int64 elapsed_time) {}
3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void SetTimeStamp(int64 time_stamp) {}
363f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
3644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual VideoFrame *Copy() const {
3654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    return NULL;
3664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
3674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
368f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual size_t CopyToBuffer(uint8 *buffer, size_t size) const {
369f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    return 0;
370f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  }
371f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
372f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual size_t ConvertToRgbBuffer(uint32 to_fourcc, uint8 *buffer,
373f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch                                    size_t size, size_t pitch_rgb) const {
374f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    return 0;
375f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  }
376f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
377f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual void StretchToPlanes(uint8 *y, uint8 *u, uint8 *v,
378f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch                               int32 pitchY, int32 pitchU, int32 pitchV,
379f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch                               size_t width, size_t height,
3803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                               bool interpolate, bool crop) const {
381f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  }
382f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
383f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual size_t StretchToBuffer(size_t w, size_t h, uint8 *buffer, size_t size,
3843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                 bool interpolate, bool crop) const {
385f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    return 0;
386f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  }
387f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
3883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void StretchToFrame(VideoFrame *target, bool interpolate,
3893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              bool crop) const {
390f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  }
391f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual VideoFrame *Stretch(size_t w, size_t h, bool interpolate,
3933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              bool crop) const {
394f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    return NULL;
395f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  }
396f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch};
397f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
3983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Abstract interface for rendering VideoFrames.
399f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass VideoRenderer {
400f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public:
401f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual ~VideoRenderer() {}
402f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Called when the video has changed size.
403f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool SetSize(int width, int height, int reserved) = 0;
404f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Called when a new frame is available for display.
405f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool RenderFrame(const VideoFrame *frame) = 0;
406f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch};
407f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
4083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Simple implementation for use in tests.
4093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass NullVideoRenderer : public VideoRenderer {
4103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool SetSize(int width, int height, int reserved) {
4113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return true;
4123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
4133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Called when a new frame is available for display.
4143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool RenderFrame(const VideoFrame *frame) {
4153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return true;
4163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
4173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
4183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
419f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass VideoMediaChannel : public MediaChannel {
420f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public:
421dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  enum Error {
422dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_NONE = 0,                       // No error.
423dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_OTHER,                          // Other errors.
424dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_REC_DEVICE_OPEN_FAILED = 100,   // Could not open camera.
425dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_REC_DEVICE_NO_DEVICE,           // No camera.
426dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_REC_DEVICE_IN_USE,              // Device is in already use.
427dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_REC_DEVICE_REMOVED,             // Device is removed.
428dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_REC_SRTP_ERROR,                 // Generic sender SRTP failure.
429dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_PLAY_SRTP_ERROR = 200,          // Generic receiver SRTP failure.
430dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ERROR_PLAY_SRTP_AUTH_FAILED,          // Failed to authenticate packets.
431dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  };
432dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
433f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  VideoMediaChannel() { renderer_ = NULL; }
434f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual ~VideoMediaChannel() {}
435f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Sets the codecs/payload types to be used for incoming media.
436f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool SetRecvCodecs(const std::vector<VideoCodec> &codecs) = 0;
437f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Sets the codecs/payload types to be used for outgoing media.
438f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool SetSendCodecs(const std::vector<VideoCodec> &codecs) = 0;
439f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Starts or stops playout of received video.
440f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool SetRender(bool render) = 0;
441f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Starts or stops transmission (and potentially capture) of local video.
442f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool SetSend(bool send) = 0;
443f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Adds a new receive-only stream with the specified SSRC.
444f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool AddStream(uint32 ssrc, uint32 voice_ssrc) = 0;
445f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Removes a stream added with AddStream.
446f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool RemoveStream(uint32 ssrc) = 0;
447f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Sets the renderer object to be used for the specified stream.
448f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // If SSRC is 0, the renderer is used for the 'default' stream.
449f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool SetRenderer(uint32 ssrc, VideoRenderer* renderer) = 0;
450f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  // Gets quality stats for the channel.
451f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  virtual bool GetStats(VideoMediaInfo* info) = 0;
4524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Send an intra frame to the receivers.
4544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual bool SendIntraFrame() = 0;
4554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Reuqest each of the remote senders to send an intra frame.
4564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual bool RequestIntraFrame() = 0;
4574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
458dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  sigslot::signal2<uint32, Error> SignalMediaError;
4594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
460f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch protected:
461f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  VideoRenderer *renderer_;
462f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch};
463f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
464f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}  // namespace cricket
465f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
466f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif  // TALK_SESSION_PHONE_MEDIACHANNEL_H_
467