1/*
2 * Copyright (C) 2011 Ericsson AB. All rights reserved.
3 * Copyright (C) 2012 Google Inc. All rights reserved.
4 * Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer
14 *    in the documentation and/or other materials provided with the
15 *    distribution.
16 * 3. Neither the name of Ericsson nor the names of its contributors
17 *    may be used to endorse or promote products derived from this
18 *    software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
33#ifndef MediaStreamPrivate_h
34#define MediaStreamPrivate_h
35
36#if ENABLE(MEDIA_STREAM)
37
38#include "MediaStreamSource.h"
39#include "MediaStreamTrack.h"
40#include "MediaStreamTrackPrivate.h"
41#include <wtf/RefCounted.h>
42#include <wtf/Vector.h>
43
44namespace WebCore {
45
46class MediaStreamTrackPrivate;
47
48class MediaStreamPrivateClient : public MediaStreamTrack::Observer {
49public:
50    virtual ~MediaStreamPrivateClient() { }
51
52    virtual void setStreamIsActive(bool) = 0;
53    virtual void addRemoteSource(MediaStreamSource*) = 0;
54    virtual void removeRemoteSource(MediaStreamSource*) = 0;
55    virtual void addRemoteTrack(MediaStreamTrackPrivate*) = 0;
56    virtual void removeRemoteTrack(MediaStreamTrackPrivate*) = 0;
57};
58
59class MediaStreamPrivate : public RefCounted<MediaStreamPrivate> {
60public:
61    static PassRefPtr<MediaStreamPrivate> create(const Vector<RefPtr<MediaStreamSource>>& audioSources, const Vector<RefPtr<MediaStreamSource>>& videoSources);
62    static PassRefPtr<MediaStreamPrivate> create(const Vector<RefPtr<MediaStreamTrackPrivate>>& audioPrivateTracks, const Vector<RefPtr<MediaStreamTrackPrivate>>& videoPrivateTracks);
63
64    virtual ~MediaStreamPrivate() { }
65
66    MediaStreamPrivateClient* client() const { return m_client; }
67    void setClient(MediaStreamPrivateClient* client) { m_client = client; }
68
69    String id() const { return m_id; }
70
71    unsigned numberOfAudioSources() const { return m_audioStreamSources.size(); }
72    MediaStreamSource* audioSources(unsigned index) const { return m_audioStreamSources[index].get(); }
73
74    unsigned numberOfVideoSources() const { return m_videoStreamSources.size(); }
75    MediaStreamSource* videoSources(unsigned index) const { return m_videoStreamSources[index].get(); }
76
77    unsigned numberOfAudioTracks() const { return m_audioPrivateTracks.size(); }
78    MediaStreamTrackPrivate* audioTracks(unsigned index) const { return m_audioPrivateTracks[index].get(); }
79
80    unsigned numberOfVideoTracks() const { return m_videoPrivateTracks.size(); }
81    MediaStreamTrackPrivate* videoTracks(unsigned index) const { return m_videoPrivateTracks[index].get(); }
82
83    void addSource(PassRefPtr<MediaStreamSource>);
84    void removeSource(PassRefPtr<MediaStreamSource>);
85
86    void addRemoteSource(MediaStreamSource*);
87    void removeRemoteSource(MediaStreamSource*);
88
89    bool active() const { return m_isActive; }
90    void setActive(bool);
91
92    void addTrack(PassRefPtr<MediaStreamTrackPrivate>);
93    void removeTrack(PassRefPtr<MediaStreamTrackPrivate>);
94
95    void addRemoteTrack(MediaStreamTrackPrivate*);
96    void removeRemoteTrack(MediaStreamTrackPrivate*);
97
98private:
99    MediaStreamPrivate(const String& id, const Vector<RefPtr<MediaStreamSource>>& audioSources, const Vector<RefPtr<MediaStreamSource>>& videoSources);
100    MediaStreamPrivate(const String& id, const Vector<RefPtr<MediaStreamTrackPrivate>>& audioPrivateTracks, const Vector<RefPtr<MediaStreamTrackPrivate>>& videoPrivateTracks);
101
102    MediaStreamPrivateClient* m_client;
103    String m_id;
104    Vector<RefPtr<MediaStreamSource>> m_audioStreamSources;
105    Vector<RefPtr<MediaStreamSource>> m_videoStreamSources;
106
107    Vector<RefPtr<MediaStreamTrackPrivate>> m_audioPrivateTracks;
108    Vector<RefPtr<MediaStreamTrackPrivate>> m_videoPrivateTracks;
109    bool m_isActive;
110};
111
112typedef Vector<RefPtr<MediaStreamPrivate>> MediaStreamPrivateVector;
113
114} // namespace WebCore
115
116#endif // ENABLE(MEDIA_STREAM)
117
118#endif // MediaStreamPrivate_h
119