onSegmentAppended_(start, end, contentType, isMuxed) {
    const ContentType = shaka.util.ManifestParserUtils.ContentType;
    if (contentType != ContentType.TEXT) {
      // When we append a segment to media source (via streaming engine) we are
      // changing what data we have buffered, so notify the playhead of the
      // change.
      if (this.playhead_) {
        this.playhead_.notifyOfBufferingChange();
        // Skip the initial buffer gap
        const startTime = this.mediaSourceEngine_.bufferStart(contentType);
        if (
          !this.isLive() &&
          // If not paused then GapJumpingController will handle this gap.
          this.video_.paused &&
          !this.video_.seeking &&
          startTime != null &&
          startTime > 0 &&
          this.playhead_.getTime() < startTime
        ) {
          this.playhead_.setStartTime(startTime);
        }
      }
      this.pollBufferState_();
    }

    // Dispatch an event for users to consume, too.
    const data = new Map()
        .set('start', start)
        .set('end', end)
        .set('contentType', contentType)
        .set('isMuxed', isMuxed);
    this.dispatchEvent(shaka.Player.makeEvent_(
        shaka.util.FakeEvent.EventName.SegmentAppended, data));
  }
Callback from StreamingEngine.

@param {number} start
@param {number} end
@param {shaka.util.ManifestParserUtils.ContentType} contentType
@param {boolean} isMuxed

@private