Changeset 204118 in webkit


Ignore:
Timestamp:
Aug 4, 2016 2:26:16 AM (8 years ago)
Author:
alex
Message:

WebRTC: OWR: Add support for the muted state in the mediaplayer
https://bugs.webkit.org/show_bug.cgi?id=160502

Modified the load, play and stop methods to handle the new
situation where the mediaSource could be empty, until the remote
side sends the information to create the receiver.

Reviewed by Philippe Normand.

No new tests, we need to upstream the owr endpoint to check this
situation.

  • platform/graphics/gstreamer/MediaPlayerPrivateGStreamerOwr.cpp:

(WebCore::MediaPlayerPrivateGStreamerOwr::play): Check the muted
state of the tracks if required, we do it using the new
maybeHandleChangeMutedState function.
(WebCore::MediaPlayerPrivateGStreamerOwr::load): Add always the
observer of the track to check when it is unmuted, and we delay
enabling/setting the source until the play or the unmute.
(WebCore::MediaPlayerPrivateGStreamerOwr::internalLoad): Removed,
we now do all in the load method.
(WebCore::MediaPlayerPrivateGStreamerOwr::stop): Remove the
mediasource when disabling. Removed the m_stopped state, it was
there because the internalLoad was called multiple times.
(WebCore::MediaPlayerPrivateGStreamerOwr::trackMutedChanged):
Check the muted state and handle it, we use the new method
maybeHandleChangeMutedState.
(WebCore::MediaPlayerPrivateGStreamerOwr::maybeHandleChangeMutedState):
Check if the track is muted or not, in case it is muted disable
the the renderer and remove its mediasource. If it is not muted
enable the renderer and set the mediasource.
(WebCore::MediaPlayerPrivateGStreamerOwr::createVideoSink): Move
the workaround for the renderer to this method when it is created.

  • platform/graphics/gstreamer/MediaPlayerPrivateGStreamerOwr.h:

Removed internalLoad method and the m_stopped attribute used to
call internalLoad multiple times.

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r204117 r204118  
     12016-08-04  Alejandro G. Castro  <alex@igalia.com>
     2
     3        WebRTC: OWR: Add support for the muted state in the mediaplayer
     4        https://bugs.webkit.org/show_bug.cgi?id=160502
     5
     6        Modified the load, play and stop methods to handle the new
     7        situation where the mediaSource could be empty, until the remote
     8        side sends the information to create the receiver.
     9
     10        Reviewed by Philippe Normand.
     11
     12        No new tests, we need to upstream the owr endpoint to check this
     13        situation.
     14
     15        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerOwr.cpp:
     16        (WebCore::MediaPlayerPrivateGStreamerOwr::play): Check the muted
     17        state of the tracks if required, we do it using the new
     18        maybeHandleChangeMutedState function.
     19        (WebCore::MediaPlayerPrivateGStreamerOwr::load): Add always the
     20        observer of the track to check when it is unmuted, and we delay
     21        enabling/setting the source until the play or the unmute.
     22        (WebCore::MediaPlayerPrivateGStreamerOwr::internalLoad): Removed,
     23        we now do all in the load method.
     24        (WebCore::MediaPlayerPrivateGStreamerOwr::stop): Remove the
     25        mediasource when disabling. Removed the m_stopped state, it was
     26        there because the internalLoad was called multiple times.
     27        (WebCore::MediaPlayerPrivateGStreamerOwr::trackMutedChanged):
     28        Check the muted state and handle it, we use the new method
     29        maybeHandleChangeMutedState.
     30        (WebCore::MediaPlayerPrivateGStreamerOwr::maybeHandleChangeMutedState):
     31        Check if the track is muted or not, in case it is muted disable
     32        the the renderer and remove its mediasource. If it is not muted
     33        enable the renderer and set the mediasource.
     34        (WebCore::MediaPlayerPrivateGStreamerOwr::createVideoSink): Move
     35        the workaround for the renderer to this method when it is created.
     36        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerOwr.h:
     37        Removed internalLoad method and the m_stopped attribute used to
     38        call internalLoad multiple times.
     39
    1402016-08-04  Youenn Fablet  <youenn@apple.com>
    241
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerOwr.cpp

    r203058 r204118  
    7272
    7373    m_paused = false;
    74     internalLoad();
     74
     75    GST_DEBUG("Connecting to live stream, descriptor: %p", m_streamPrivate.get());
     76
     77    for (auto track : m_streamPrivate->tracks()) {
     78        if (!track->enabled()) {
     79            GST_DEBUG("Track %s disabled", track->label().ascii().data());
     80            continue;
     81        }
     82
     83        maybeHandleChangeMutedState(*track);
     84    }
    7585}
    7686
     
    133143        return;
    134144
    135     if (!m_videoSink)
     145    if (streamPrivate.hasVideo() && !m_videoSink)
    136146        createVideoSink();
    137147
    138     if (!m_audioSink)
     148    if (streamPrivate.hasAudio() && !m_audioSink)
    139149        createGSTAudioSinkBin();
    140150
     
    152162    m_player->readyStateChanged();
    153163
    154     if (!internalLoad())
    155         return;
    156 
    157     // If the stream contains video, wait for first video frame before setting
    158     // HaveEnoughData.
    159     if (!hasVideo())
    160         m_readyState = MediaPlayer::HaveEnoughData;
    161 
    162     m_player->readyStateChanged();
    163 }
    164 
    165 void MediaPlayerPrivateGStreamerOwr::loadingFailed(MediaPlayer::NetworkState error)
    166 {
    167     if (m_networkState != error) {
    168         m_networkState = error;
    169         m_player->networkStateChanged();
    170     }
    171     if (m_readyState != MediaPlayer::HaveNothing) {
    172         m_readyState = MediaPlayer::HaveNothing;
    173         m_player->readyStateChanged();
    174     }
    175 }
    176 
    177 bool MediaPlayerPrivateGStreamerOwr::didLoadingProgress() const
    178 {
    179     // FIXME: Implement loading progress support.
    180     return true;
    181 }
    182 
    183 bool MediaPlayerPrivateGStreamerOwr::internalLoad()
    184 {
    185     if (!m_stopped)
    186         return false;
    187 
    188     m_stopped = false;
    189     if (!m_streamPrivate || !m_streamPrivate->active()) {
    190         loadingFailed(MediaPlayer::NetworkError);
    191         return false;
    192     }
    193 
    194     GST_DEBUG("Connecting to live stream, descriptor: %p", m_streamPrivate.get());
    195 
    196164    for (auto track : m_streamPrivate->tracks()) {
    197165        if (!track->enabled()) {
     
    200168        }
    201169
    202         OwrMediaSource* mediaSource = OWR_MEDIA_SOURCE(reinterpret_cast<RealtimeMediaSourceOwr*>(&track->source())->mediaSource());
     170        track->addObserver(*this);
    203171
    204172        switch (track->type()) {
    205173        case RealtimeMediaSource::Audio:
    206             if (m_audioTrack && (m_audioTrack.get() == track))
    207                 g_object_set(m_audioRenderer.get(), "disabled", FALSE, nullptr);
    208 
    209             owr_media_renderer_set_source(OWR_MEDIA_RENDERER(m_audioRenderer.get()), mediaSource);
    210174            m_audioTrack = track;
    211             track->addObserver(*this);
    212175            break;
    213176        case RealtimeMediaSource::Video:
    214             if (m_videoTrack && (m_videoTrack.get() == track))
    215                 g_object_set(m_videoRenderer.get(), "disabled", FALSE, nullptr);
    216 
    217             // FIXME: Remove hardcoded video dimensions when the rendering performance:
    218             // https://webkit.org/b/153826.
    219             g_object_set(m_videoRenderer.get(), "width", 640, "height", 480, nullptr);
    220             owr_media_renderer_set_source(OWR_MEDIA_RENDERER(m_videoRenderer.get()), mediaSource);
    221177            m_videoTrack = track;
    222             track->addObserver(*this);
    223178            break;
    224179        case RealtimeMediaSource::None:
     
    229184    m_readyState = MediaPlayer::HaveEnoughData;
    230185    m_player->readyStateChanged();
     186}
     187
     188void MediaPlayerPrivateGStreamerOwr::loadingFailed(MediaPlayer::NetworkState error)
     189{
     190    if (m_networkState != error) {
     191        m_networkState = error;
     192        m_player->networkStateChanged();
     193    }
     194    if (m_readyState != MediaPlayer::HaveNothing) {
     195        m_readyState = MediaPlayer::HaveNothing;
     196        m_player->readyStateChanged();
     197    }
     198}
     199
     200bool MediaPlayerPrivateGStreamerOwr::didLoadingProgress() const
     201{
     202    // FIXME: Implement loading progress support.
    231203    return true;
    232204}
     
    234206void MediaPlayerPrivateGStreamerOwr::stop()
    235207{
    236     if (m_stopped)
    237         return;
    238 
    239     m_stopped = true;
    240208    if (m_audioTrack) {
    241209        GST_DEBUG("Stop: disconnecting audio");
    242210        g_object_set(m_audioRenderer.get(), "disabled", TRUE, nullptr);
     211        owr_media_renderer_set_source(OWR_MEDIA_RENDERER(m_audioRenderer.get()), nullptr);
    243212    }
    244213    if (m_videoTrack) {
    245214        GST_DEBUG("Stop: disconnecting video");
    246215        g_object_set(m_videoRenderer.get(), "disabled", TRUE, nullptr);
     216        owr_media_renderer_set_source(OWR_MEDIA_RENDERER(m_videoRenderer.get()), nullptr);
    247217    }
    248218}
     
    313283}
    314284
    315 void MediaPlayerPrivateGStreamerOwr::trackMutedChanged(MediaStreamTrackPrivate&)
     285void MediaPlayerPrivateGStreamerOwr::trackMutedChanged(MediaStreamTrackPrivate& track)
    316286{
    317287    GST_DEBUG("Track muted state changed");
     288
     289    maybeHandleChangeMutedState(track);
     290}
     291
     292void MediaPlayerPrivateGStreamerOwr::maybeHandleChangeMutedState(MediaStreamTrackPrivate& track)
     293{
     294    auto realTimeMediaSource = reinterpret_cast<RealtimeMediaSourceOwr*>(&track.source());
     295    auto mediaSource = OWR_MEDIA_SOURCE(realTimeMediaSource->mediaSource());
     296
     297    switch (track.type()) {
     298    case RealtimeMediaSource::Audio:
     299        if (!realTimeMediaSource->muted()) {
     300            g_object_set(m_audioRenderer.get(), "disabled", false, nullptr);
     301            owr_media_renderer_set_source(OWR_MEDIA_RENDERER(m_audioRenderer.get()), mediaSource);
     302        } else {
     303            g_object_set(m_audioRenderer.get(), "disabled", true, nullptr);
     304            owr_media_renderer_set_source(OWR_MEDIA_RENDERER(m_audioRenderer.get()), nullptr);
     305        }
     306        break;
     307    case RealtimeMediaSource::Video:
     308        if (!realTimeMediaSource->muted()) {
     309            g_object_set(m_videoRenderer.get(), "disabled", false, nullptr);
     310            owr_media_renderer_set_source(OWR_MEDIA_RENDERER(m_videoRenderer.get()), mediaSource);
     311        } else {
     312            g_object_set(m_videoRenderer.get(), "disabled", true, nullptr);
     313            owr_media_renderer_set_source(OWR_MEDIA_RENDERER(m_videoRenderer.get()), nullptr);
     314        }
     315        break;
     316    case RealtimeMediaSource::None:
     317        GST_WARNING("Trying to change mute state of a track with None type");
     318    }
    318319}
    319320
     
    332333    GstElement* sink = MediaPlayerPrivateGStreamerBase::createVideoSink();
    333334    m_videoRenderer = adoptGRef(owr_gst_video_renderer_new(sink));
     335
     336    // FIXME: Remove hardcoded video dimensions when the rendering performance:
     337    // https://webkit.org/b/153826.
     338    g_object_set(m_videoRenderer.get(), "width", 640, "height", 480, nullptr);
     339
    334340    return sink;
    335341}
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerOwr.h

    r202851 r204118  
    9595    void createGSTAudioSinkBin();
    9696    void loadingFailed(MediaPlayer::NetworkState error);
    97     bool internalLoad();
    9897    void stop();
     98    void maybeHandleChangeMutedState(MediaStreamTrackPrivate&);
    9999
    100100    bool m_paused { true };
    101     bool m_stopped { true };
    102101    RefPtr<MediaStreamTrackPrivate> m_videoTrack;
    103102    RefPtr<MediaStreamTrackPrivate> m_audioTrack;
Note: See TracChangeset for help on using the changeset viewer.