10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file.
40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#ifndef CONTENT_RENDERER_MEDIA_WEBRTC_WEBRTC_MEDIA_STREAM_ADAPTER_H_
60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#define CONTENT_RENDERER_MEDIA_WEBRTC_WEBRTC_MEDIA_STREAM_ADAPTER_H_
70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/macros.h"
90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/memory/ref_counted.h"
100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/memory/scoped_vector.h"
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/common/content_export.h"
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/renderer/media/media_stream.h"
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/renderer/media/webrtc/webrtc_video_track_adapter.h"
140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "third_party/WebKit/public/platform/WebMediaStream.h"
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h"
160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace content {
180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class PeerConnectionDependencyFactory;
200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// WebRtcMediaStreamAdapter is an adapter between a blink::WebMediaStream
220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// object and a webrtc MediaStreams that is currently sent on a PeerConnection.
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// The responsibility of the class is to create and own a representation of a
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// webrtc MediaStream that can be added and removed from a RTCPeerConnection.
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// An instance of WebRtcMediaStreamAdapter is created when a MediaStream is
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// added to an RTCPeerConnection object
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Instances of this class is owned by the RTCPeerConnectionHandler object that
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// created it.
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass CONTENT_EXPORT WebRtcMediaStreamAdapter
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    : NON_EXPORTED_BASE(public MediaStreamObserver) {
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public:
320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  WebRtcMediaStreamAdapter(const blink::WebMediaStream& web_stream,
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           PeerConnectionDependencyFactory* factory);
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual ~WebRtcMediaStreamAdapter();
350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool IsEqual(const blink::WebMediaStream& web_stream) {
370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return web_stream_.extraData() == web_stream.extraData();
380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  webrtc::MediaStreamInterface* webrtc_media_stream() {
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return webrtc_media_stream_.get();
420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch protected:
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // MediaStreamObserver implementation.
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void TrackAdded(const blink::WebMediaStreamTrack& track) OVERRIDE;
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void TrackRemoved(const blink::WebMediaStreamTrack& track) OVERRIDE;
480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private:
500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void CreateAudioTrack(const blink::WebMediaStreamTrack& track);
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void CreateVideoTrack(const blink::WebMediaStreamTrack& track);
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  blink::WebMediaStream web_stream_;
540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Pointer to a PeerConnectionDependencyFactory, owned by the RenderThread.
560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // It's valid for the lifetime of RenderThread.
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PeerConnectionDependencyFactory* factory_;
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_refptr<webrtc::MediaStreamInterface> webrtc_media_stream_;
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ScopedVector<WebRtcVideoTrackAdapter> video_adapters_;
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DISALLOW_COPY_AND_ASSIGN (WebRtcMediaStreamAdapter);
630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace content
660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif  // CONTENT_RENDERER_MEDIA_WEBRTC_WEBRTC_MEDIA_STREAM_ADAPTER_H_
68