Changeset 158337 in webkit


Ignore:
Timestamp:
Oct 30, 2013 6:15:20 PM (10 years ago)
Author:
commit-queue@webkit.org
Message:

Simplifying MediaStream and MediStreamDescriptor creation
https://bugs.webkit.org/show_bug.cgi?id=123443

Patch by Thiago de Barros Lacerda <thiago.lacerda@openbossa.org> on 2013-10-30
Reviewed by Eric Carlson.

The internal process of creating a MediaStream and MediaStreamDescriptor was quite confusing and spread.
We can take advantage of the platform implementation of MediaStreamTrack (aka MediaStreamTrackPrivate)
and simplify the whole process.
A new constructor that receives vectors of MediaStreamTrackPrivate objects were added, then the check
if a source already exists or if the tracks are all ended are now made in MediaStreamDescriptor.

No new tests needed.

  • Modules/mediastream/MediaStream.cpp:

(WebCore::MediaStream::create): Removed unnecessary variables in one create method and using new
MediaStreamDescriptor::create method that receives vector of MediaStreamTrackPrivate objects as parameter.

  • Modules/webaudio/MediaStreamAudioDestinationNode.cpp:

(WebCore::MediaStreamAudioDestinationNode::MediaStreamAudioDestinationNode): Removed passing flag to
MediaStreamDescriptor create.

  • platform/mediastream/MediaStreamDescriptor.cpp:

(WebCore::MediaStreamDescriptor::create): Removed EndedAtCreationFlag parameter, because this is being
handled inside constructor by analyzing the tracks or sources passed.
(WebCore::MediaStreamDescriptor::MediaStreamDescriptor): Adding new constructor that receives vector of
MediaStreamTrackPrivate as parameter.

(WebCore::MediaStreamDescriptor::addTrack): Changed to store the track's source in the object.

(WebCore::MediaStreamDescriptor::removeTrack):

  • platform/mediastream/MediaStreamDescriptor.h:

(WebCore::MediaStreamDescriptor::numberOfAudioTracks):
(WebCore::MediaStreamDescriptor::audioTracks):
(WebCore::MediaStreamDescriptor::numberOfVideoTracks):
(WebCore::MediaStreamDescriptor::videoTracks):

  • platform/mock/MockMediaStreamCenter.cpp:

(WebCore::MockMediaStreamCenter::createMediaStream): Removing flag that is being passed to
MediaStreamDescriptor's create method.

Location:
trunk/Source/WebCore
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r158334 r158337  
     12013-10-30  Thiago de Barros Lacerda  <thiago.lacerda@openbossa.org>
     2
     3        Simplifying MediaStream and MediStreamDescriptor creation
     4        https://bugs.webkit.org/show_bug.cgi?id=123443
     5
     6        Reviewed by Eric Carlson.
     7
     8        The internal process of creating a MediaStream and MediaStreamDescriptor was quite confusing and spread.
     9        We can take advantage of the platform implementation of MediaStreamTrack (aka MediaStreamTrackPrivate)
     10        and simplify the whole process.
     11        A new constructor that receives vectors of MediaStreamTrackPrivate objects were added, then the check
     12        if a source already exists or if the tracks are all ended are now made in MediaStreamDescriptor.
     13
     14        No new tests needed.
     15
     16        * Modules/mediastream/MediaStream.cpp:
     17        (WebCore::MediaStream::create): Removed unnecessary variables in one create method and using new
     18        MediaStreamDescriptor::create method that receives vector of MediaStreamTrackPrivate objects as parameter.
     19
     20        * Modules/webaudio/MediaStreamAudioDestinationNode.cpp:
     21        (WebCore::MediaStreamAudioDestinationNode::MediaStreamAudioDestinationNode): Removed passing flag to
     22        MediaStreamDescriptor create.
     23
     24        * platform/mediastream/MediaStreamDescriptor.cpp:
     25        (WebCore::MediaStreamDescriptor::create): Removed EndedAtCreationFlag parameter, because this is being
     26        handled inside constructor by analyzing the tracks or sources passed.
     27        (WebCore::MediaStreamDescriptor::MediaStreamDescriptor): Adding new constructor that receives vector of
     28        MediaStreamTrackPrivate as parameter.
     29
     30        (WebCore::MediaStreamDescriptor::addTrack): Changed to store the track's source in the object.
     31
     32        (WebCore::MediaStreamDescriptor::removeTrack):
     33        * platform/mediastream/MediaStreamDescriptor.h:
     34        (WebCore::MediaStreamDescriptor::numberOfAudioTracks):
     35        (WebCore::MediaStreamDescriptor::audioTracks):
     36        (WebCore::MediaStreamDescriptor::numberOfVideoTracks):
     37        (WebCore::MediaStreamDescriptor::videoTracks):
     38        * platform/mock/MockMediaStreamCenter.cpp:
     39        (WebCore::MockMediaStreamCenter::createMediaStream): Removing flag that is being passed to
     40        MediaStreamDescriptor's create method.
     41
    1422013-10-30  Brent Fulgham  <bfulgham@apple.com>
    243
  • trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp

    r158220 r158337  
    4242namespace WebCore {
    4343
    44 static bool containsSource(MediaStreamSourceVector& sourceVector, MediaStreamSource* source)
    45 {
    46     for (size_t i = 0; i < sourceVector.size(); ++i) {
    47         if (source->id() == sourceVector[i]->id())
    48             return true;
    49     }
    50     return false;
    51 }
    52 
    53 static void processTrack(MediaStreamTrack* track, MediaStreamSourceVector& sourceVector)
    54 {
    55     if (track->ended())
    56         return;
    57 
    58     MediaStreamSource* source = track->source();
    59     if (!containsSource(sourceVector, source))
    60         sourceVector.append(source);
    61 }
    62 
    63 static PassRefPtr<MediaStream> createFromSourceVectors(ScriptExecutionContext* context, const MediaStreamSourceVector& audioSources, const MediaStreamSourceVector& videoSources, bool ended)
    64 {
    65     MediaStreamDescriptor::EndedAtCreationFlag flag = ended ? MediaStreamDescriptor::IsEnded : MediaStreamDescriptor::IsNotEnded;
    66     RefPtr<MediaStreamDescriptor> descriptor = MediaStreamDescriptor::create(audioSources, videoSources, flag);
    67     return MediaStream::create(context, descriptor.release());
    68 }
    69 
    7044PassRefPtr<MediaStream> MediaStream::create(ScriptExecutionContext* context)
    7145{
    72     MediaStreamSourceVector audioSources;
    73     MediaStreamSourceVector videoSources;
    74 
    75     return createFromSourceVectors(context, audioSources, videoSources, false);
     46    return MediaStream::create(context, MediaStreamDescriptor::create(MediaStreamSourceVector(), MediaStreamSourceVector()));
    7647}
    7748
     
    8051    ASSERT(stream);
    8152
    82     MediaStreamSourceVector audioSources;
    83     MediaStreamSourceVector videoSources;
     53    Vector<RefPtr<MediaStreamTrackPrivate>> audioTracks;
     54    Vector<RefPtr<MediaStreamTrackPrivate>> videoTracks;
    8455
    8556    for (size_t i = 0; i < stream->m_audioTracks.size(); ++i)
    86         processTrack(stream->m_audioTracks[i].get(), audioSources);
     57        audioTracks.append(&stream->m_audioTracks[i]->privateTrack());
    8758
    8859    for (size_t i = 0; i < stream->m_videoTracks.size(); ++i)
    89         processTrack(stream->m_videoTracks[i].get(), videoSources);
    90 
    91     return createFromSourceVectors(context, audioSources, videoSources, stream->ended());
     60        videoTracks.append(&stream->m_videoTracks[i]->privateTrack());
     61
     62    return MediaStream::create(context, MediaStreamDescriptor::create(audioTracks, videoTracks));
    9263}
    9364
    9465PassRefPtr<MediaStream> MediaStream::create(ScriptExecutionContext* context, const MediaStreamTrackVector& tracks)
    9566{
    96     MediaStreamSourceVector audioSources;
    97     MediaStreamSourceVector videoSources;
    98 
    99     bool allEnded = true;
     67    Vector<RefPtr<MediaStreamTrackPrivate>> audioTracks;
     68    Vector<RefPtr<MediaStreamTrackPrivate>> videoTracks;
     69
    10070    for (size_t i = 0; i < tracks.size(); ++i) {
    101         allEnded &= tracks[i]->ended();
    102         processTrack(tracks[i].get(), tracks[i]->kind() == "audio" ? audioSources : videoSources);
    103     }
    104 
    105     return createFromSourceVectors(context, audioSources, videoSources, allEnded);
     71        if (tracks[i]->kind() == "audio")
     72            audioTracks.append(&tracks[i]->privateTrack());
     73        else
     74            videoTracks.append(&tracks[i]->privateTrack());
     75    }
     76
     77    return MediaStream::create(context, MediaStreamDescriptor::create(audioTracks, videoTracks));
    10678}
    10779
  • trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.h

    r158220 r158337  
    9191
    9292    MediaStreamSource* source() const { return m_privateTrack->source(); }
     93    MediaStreamTrackPrivate& privateTrack() { return m_privateTrack.get(); }
    9394
    9495    bool ended() const;
     
    108109    MediaStreamTrack(ScriptExecutionContext*, MediaStreamTrackPrivate&, const Dictionary*);
    109110
    110     MediaStreamTrackPrivate& privateTrack() { return m_privateTrack.get(); }
    111111    void setSource(PassRefPtr<MediaStreamSource>);
    112112
  • trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioDestinationNode.cpp

    r157268 r158337  
    5252    MediaStreamSourceVector audioSources;
    5353    audioSources.append(m_source);
    54     m_stream = MediaStream::create(context->scriptExecutionContext(), MediaStreamDescriptor::create(audioSources, MediaStreamSourceVector(), MediaStreamDescriptor::IsNotEnded));
     54    m_stream = MediaStream::create(context->scriptExecutionContext(), MediaStreamDescriptor::create(audioSources, MediaStreamSourceVector()));
    5555
    5656    m_source->setAudioFormat(numberOfChannels, context->sampleRate());
  • trunk/Source/WebCore/platform/mediastream/MediaStreamDescriptor.cpp

    r158220 r158337  
    3737
    3838#include "MediaStreamCenter.h"
    39 #include "MediaStreamSource.h"
    40 #include "MediaStreamTrackPrivate.h"
    4139#include "UUID.h"
    4240#include <wtf/RefCounted.h>
     
    4543namespace WebCore {
    4644
    47 PassRefPtr<MediaStreamDescriptor> MediaStreamDescriptor::create(const MediaStreamSourceVector& audioSources, const MediaStreamSourceVector& videoSources, EndedAtCreationFlag flag)
     45PassRefPtr<MediaStreamDescriptor> MediaStreamDescriptor::create(const MediaStreamSourceVector& audioSources, const MediaStreamSourceVector& videoSources)
    4846{
    49     return adoptRef(new MediaStreamDescriptor(createCanonicalUUIDString(), audioSources, videoSources, flag == IsEnded));
     47    return adoptRef(new MediaStreamDescriptor(createCanonicalUUIDString(), audioSources, videoSources));
     48}
     49
     50PassRefPtr<MediaStreamDescriptor> MediaStreamDescriptor::create(const Vector<RefPtr<MediaStreamTrackPrivate>>& audioPrivateTracks, const Vector<RefPtr<MediaStreamTrackPrivate>>& videoPrivateTracks)
     51{
     52    return adoptRef(new MediaStreamDescriptor(createCanonicalUUIDString(), audioPrivateTracks, videoPrivateTracks));
    5053}
    5154
     
    105108}
    106109
    107 MediaStreamDescriptor::MediaStreamDescriptor(const String& id, const MediaStreamSourceVector& audioSources, const MediaStreamSourceVector& videoSources, bool ended)
     110MediaStreamDescriptor::MediaStreamDescriptor(const String& id, const MediaStreamSourceVector& audioSources, const MediaStreamSourceVector& videoSources)
    108111    : m_client(0)
    109112    , m_id(id)
    110     , m_ended(ended)
     113    , m_ended(false)
    111114{
    112115    ASSERT(m_id.length());
    113     for (size_t i = 0; i < audioSources.size(); i++) {
    114         RefPtr<MediaStreamSource> source = audioSources[i];
    115         m_audioStreamSources.append(source);
    116         m_audioTrackDescriptors.append(MediaStreamTrackPrivate::create(source));
    117     }
     116    for (size_t i = 0; i < audioSources.size(); i++)
     117        addTrack(MediaStreamTrackPrivate::create(audioSources[i]));
    118118
    119     for (size_t i = 0; i < videoSources.size(); i++) {
    120         RefPtr<MediaStreamSource> source = videoSources[i];
    121         m_videoStreamSources.append(source);
    122         m_videoTrackDescriptors.append(MediaStreamTrackPrivate::create(source));
    123     }
     119    for (size_t i = 0; i < videoSources.size(); i++)
     120        addTrack(MediaStreamTrackPrivate::create(videoSources[i]));
     121
     122    unsigned providedSourcesSize = audioSources.size() + videoSources.size();
     123    unsigned tracksSize = m_audioPrivateTracks.size() + m_videoPrivateTracks.size();
     124    // If sources were provided and no track was added to the MediaStreamDescriptor's tracks, this means
     125    // that the tracks were all ended
     126    if (providedSourcesSize > 0 && !tracksSize)
     127        m_ended = true;
     128}
     129
     130MediaStreamDescriptor::MediaStreamDescriptor(const String& id, const Vector<RefPtr<MediaStreamTrackPrivate>>& audioPrivateTracks, const Vector<RefPtr<MediaStreamTrackPrivate>>& videoPrivateTracks)
     131    : m_client(0)
     132    , m_id(id)
     133    , m_ended(false)
     134{
     135    ASSERT(m_id.length());
     136    for (size_t i = 0; i < audioPrivateTracks.size(); i++)
     137        addTrack(audioPrivateTracks[i]);
     138
     139    for (size_t i = 0; i < videoPrivateTracks.size(); i++)
     140        addTrack(videoPrivateTracks[i]);
     141
     142    unsigned providedTracksSize = audioPrivateTracks.size() + videoPrivateTracks.size();
     143    unsigned tracksSize = m_audioPrivateTracks.size() + m_videoPrivateTracks.size();
     144    // If tracks were provided and no one was added to the MediaStreamDescriptor's tracks, this means
     145    // that the tracks were all ended
     146    if (providedTracksSize > 0 && !tracksSize)
     147        m_ended = true;
    124148}
    125149
     
    134158void MediaStreamDescriptor::addTrack(PassRefPtr<MediaStreamTrackPrivate> track)
    135159{
    136     Vector<RefPtr<MediaStreamTrackPrivate>>& tracks = track->type() == MediaStreamSource::Audio ? m_audioTrackDescriptors : m_videoTrackDescriptors;
     160    if (track->ended())
     161        return;
     162
     163    Vector<RefPtr<MediaStreamTrackPrivate>>& tracks = track->type() == MediaStreamSource::Audio ? m_audioPrivateTracks : m_videoPrivateTracks;
    137164
    138165    size_t pos = tracks.find(track);
     
    141168
    142169    tracks.append(track);
     170    if (track->source())
     171        addSource(track->source());
    143172}
    144173
    145174void MediaStreamDescriptor::removeTrack(PassRefPtr<MediaStreamTrackPrivate> track)
    146175{
    147     Vector<RefPtr<MediaStreamTrackPrivate>>& tracks = track->type() == MediaStreamSource::Audio ? m_audioTrackDescriptors : m_videoTrackDescriptors;
     176    Vector<RefPtr<MediaStreamTrackPrivate>>& tracks = track->type() == MediaStreamSource::Audio ? m_audioPrivateTracks : m_videoPrivateTracks;
    148177
    149178    size_t pos = tracks.find(track);
  • trunk/Source/WebCore/platform/mediastream/MediaStreamDescriptor.h

    r158018 r158337  
    3737#include "MediaStreamSource.h"
    3838#include "MediaStreamTrack.h"
     39#include "MediaStreamTrackPrivate.h"
    3940#include <wtf/RefCounted.h>
    4041#include <wtf/Vector.h>
     
    5556class MediaStreamDescriptor : public RefCounted<MediaStreamDescriptor> {
    5657public:
    57     enum EndedAtCreationFlag { IsNotEnded, IsEnded };
    58 
    59     static PassRefPtr<MediaStreamDescriptor> create(const MediaStreamSourceVector& audioSources, const MediaStreamSourceVector& videoSources, EndedAtCreationFlag);
     58    static PassRefPtr<MediaStreamDescriptor> create(const MediaStreamSourceVector& audioSources, const MediaStreamSourceVector& videoSources);
     59    static PassRefPtr<MediaStreamDescriptor> create(const Vector<RefPtr<MediaStreamTrackPrivate>>& audioPrivateTracks, const Vector<RefPtr<MediaStreamTrackPrivate>>& videoPrivateTracks);
    6060
    6161    virtual ~MediaStreamDescriptor() { }
     
    7272    MediaStreamSource* videoSources(unsigned index) const { return m_videoStreamSources[index].get(); }
    7373
    74     unsigned numberOfAudioTracks() const { return m_audioTrackDescriptors.size(); }
    75     MediaStreamTrackPrivate* audioTracks(unsigned index) const { return m_audioTrackDescriptors[index].get(); }
     74    unsigned numberOfAudioTracks() const { return m_audioPrivateTracks.size(); }
     75    MediaStreamTrackPrivate* audioTracks(unsigned index) const { return m_audioPrivateTracks[index].get(); }
    7676
    77     unsigned numberOfVideoTracks() const { return m_videoTrackDescriptors.size(); }
    78     MediaStreamTrackPrivate* videoTracks(unsigned index) const { return m_videoTrackDescriptors[index].get(); }
     77    unsigned numberOfVideoTracks() const { return m_videoPrivateTracks.size(); }
     78    MediaStreamTrackPrivate* videoTracks(unsigned index) const { return m_videoPrivateTracks[index].get(); }
    7979
    8080    void addSource(PassRefPtr<MediaStreamSource>);
     
    9191
    9292private:
    93     MediaStreamDescriptor(const String& id, const MediaStreamSourceVector& audioSources, const MediaStreamSourceVector& videoSources, bool ended);
     93    MediaStreamDescriptor(const String& id, const MediaStreamSourceVector& audioSources, const MediaStreamSourceVector& videoSources);
     94    MediaStreamDescriptor(const String& id, const Vector<RefPtr<MediaStreamTrackPrivate>>& audioPrivateTracks, const Vector<RefPtr<MediaStreamTrackPrivate>>& videoPrivateTracks);
    9495
    9596    MediaStreamDescriptorClient* m_client;
    9697    String m_id;
    97     Vector<RefPtr<MediaStreamSource>> m_audioStreamSources;
    98     Vector<RefPtr<MediaStreamSource>> m_videoStreamSources;
     98    MediaStreamSourceVector m_audioStreamSources;
     99    MediaStreamSourceVector m_videoStreamSources;
    99100
    100     Vector<RefPtr<MediaStreamTrackPrivate>> m_audioTrackDescriptors;
    101     Vector<RefPtr<MediaStreamTrackPrivate>> m_videoTrackDescriptors;
     101    Vector<RefPtr<MediaStreamTrackPrivate>> m_audioPrivateTracks;
     102    Vector<RefPtr<MediaStreamTrackPrivate>> m_videoPrivateTracks;
    102103    bool m_ended;
    103104};
  • trunk/Source/WebCore/platform/mock/MockMediaStreamCenter.cpp

    r158220 r158337  
    230230    }
    231231   
    232     client->didCreateStream(MediaStreamDescriptor::create(audioSources, videoSources, MediaStreamDescriptor::IsNotEnded));
     232    client->didCreateStream(MediaStreamDescriptor::create(audioSources, videoSources));
    233233}
    234234
Note: See TracChangeset for help on using the changeset viewer.