Changeset 269121 in webkit


Ignore:
Timestamp:
Oct 28, 2020 1:42:59 PM (3 years ago)
Author:
jer.noble@apple.com
Message:

[MSE] Handle trackId changing across Initialization Segments
https://bugs.webkit.org/show_bug.cgi?id=218294
<rdar://problem/70771306>

Reviewed by Eric Carlson.

Source/WebCore:

Test: media/media-source/media-source-trackid-change.html

When appending an initialization segment after the receivedFirstInitializationSegment flag is
true, and when the number of video or audio tracks is 1, the trackId is allowed to change across
initialiaztion segments. When this occurs, move the TrackBuffer inside the trackBufferMap to
refer to the new trackId, so that when MediaSamples are parsed, they're put into the correct
TrackBuffer.

  • Modules/mediasource/SourceBuffer.cpp:

(WebCore::SourceBuffer::sourceBufferPrivateDidReceiveInitializationSegment):

  • html/track/AudioTrack.cpp:

(WebCore::AudioTrack::setPrivate):

  • html/track/InbandTextTrack.cpp:

(WebCore::InbandTextTrack::setPrivate):

  • html/track/VideoTrack.cpp:

(WebCore::VideoTrack::setPrivate):

LayoutTests:

  • media/media-source/media-source-trackid-change-expected.txt: Added.
  • media/media-source/media-source-trackid-change.html: Added.
Location:
trunk
Files:
2 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r269111 r269121  
     12020-10-28  Jer Noble  <jer.noble@apple.com>
     2
     3        [MSE] Handle trackId changing across Initialization Segments
     4        https://bugs.webkit.org/show_bug.cgi?id=218294
     5        <rdar://problem/70771306>
     6
     7        Reviewed by Eric Carlson.
     8
     9        * media/media-source/media-source-trackid-change-expected.txt: Added.
     10        * media/media-source/media-source-trackid-change.html: Added.
     11
    1122020-10-28  Sam Weinig  <weinig@apple.com>
    213
  • trunk/Source/WebCore/ChangeLog

    r269118 r269121  
     12020-10-28  Jer Noble  <jer.noble@apple.com>
     2
     3        [MSE] Handle trackId changing across Initialization Segments
     4        https://bugs.webkit.org/show_bug.cgi?id=218294
     5        <rdar://problem/70771306>
     6
     7        Reviewed by Eric Carlson.
     8
     9        Test: media/media-source/media-source-trackid-change.html
     10
     11        When appending an initialization segment after the receivedFirstInitializationSegment flag is
     12        true, and when the number of video or audio tracks is 1, the trackId is allowed to change across
     13        initialiaztion segments. When this occurs, move the TrackBuffer inside the trackBufferMap to
     14        refer to the new trackId, so that when MediaSamples are parsed, they're put into the correct
     15        TrackBuffer.
     16
     17        * Modules/mediasource/SourceBuffer.cpp:
     18        (WebCore::SourceBuffer::sourceBufferPrivateDidReceiveInitializationSegment):
     19        * html/track/AudioTrack.cpp:
     20        (WebCore::AudioTrack::setPrivate):
     21        * html/track/InbandTextTrack.cpp:
     22        (WebCore::InbandTextTrack::setPrivate):
     23        * html/track/VideoTrack.cpp:
     24        (WebCore::VideoTrack::setPrivate):
     25
    1262020-10-28  Tim Horton  <timothy_horton@apple.com>
    227
  • trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp

    r269001 r269121  
    11121112            return;
    11131113        }
     1114
     1115        Vector<std::pair<AtomString, TrackBuffer>> newTrackBuffers;
     1116
    11141117        // 3.2 Add the appropriate track descriptions from this initialization segment to each of the track buffers.
    11151118        ASSERT(segment.audioTracks.size() == audioTracks().length());
    11161119        for (auto& audioTrackInfo : segment.audioTracks) {
    11171120            if (audioTracks().length() == 1) {
    1118                 audioTracks().item(0)->setPrivate(*audioTrackInfo.track);
     1121                auto* track = audioTracks().item(0);
     1122                auto oldId = track->id();
     1123                auto newId = audioTrackInfo.track->id();
     1124                track->setPrivate(*audioTrackInfo.track);
     1125                if (newId != oldId) {
     1126                    auto trackBuffer = m_trackBufferMap.take(oldId);
     1127                    newTrackBuffers.append(std::make_pair(newId, WTFMove(trackBuffer)));
     1128                }
    11191129                break;
    11201130            }
     
    11281138        for (auto& videoTrackInfo : segment.videoTracks) {
    11291139            if (videoTracks().length() == 1) {
    1130                 videoTracks().item(0)->setPrivate(*videoTrackInfo.track);
     1140                auto* track = videoTracks().item(0);
     1141                auto oldId = track->id();
     1142                auto newId = videoTrackInfo.track->id();
     1143                track->setPrivate(*videoTrackInfo.track);
     1144                if (newId != oldId) {
     1145                    auto trackBuffer = m_trackBufferMap.take(oldId);
     1146                    newTrackBuffers.append(std::make_pair(newId, WTFMove(trackBuffer)));
     1147                }
    11311148                break;
    11321149            }
     
    11401157        for (auto& textTrackInfo : segment.textTracks) {
    11411158            if (textTracks().length() == 1) {
    1142                 downcast<InbandTextTrack>(*textTracks().item(0)).setPrivate(*textTrackInfo.track);
     1159                auto* track = downcast<InbandTextTrack>(textTracks().item(0));
     1160                auto oldId = track->id();
     1161                auto newId = textTrackInfo.track->id();
     1162                track->setPrivate(*textTrackInfo.track);
     1163                if (newId != oldId) {
     1164                    auto trackBuffer = m_trackBufferMap.take(oldId);
     1165                    newTrackBuffers.append(std::make_pair(newId, WTFMove(trackBuffer)));
     1166                }
    11431167                break;
    11441168            }
     
    11471171            ASSERT(textTrack);
    11481172            downcast<InbandTextTrack>(*textTrack).setPrivate(*textTrackInfo.track);
     1173        }
     1174
     1175        while (!newTrackBuffers.isEmpty()) {
     1176            auto trackPair = newTrackBuffers.takeLast();
     1177            m_trackBufferMap.add(trackPair.first, WTFMove(trackPair.second));
    11491178        }
    11501179
  • trunk/Source/WebCore/html/track/AudioTrack.cpp

    r262695 r269121  
    105105
    106106    updateKindFromPrivate();
     107    setId(m_private->id());
    107108}
    108109
  • trunk/Source/WebCore/html/track/InbandTextTrack.cpp

    r262695 r269121  
    7878    setModeInternal(mode());
    7979    updateKindFromPrivate();
     80    setId(m_private->id());
    8081}
    8182
  • trunk/Source/WebCore/html/track/VideoTrack.cpp

    r262695 r269121  
    110110    m_private->setSelected(m_selected);
    111111    updateKindFromPrivate();
     112    setId(m_private->id());
    112113}
    113114
Note: See TracChangeset for help on using the changeset viewer.