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