@Override
  protected void doSomeWork(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException {
    currentPositionUs = positionUs;
    try {
      source.continueBuffering(positionUs);
    } catch (IOException e) {
      throw new ExoPlaybackException(e);
    }

    if (parserHelper.isParsing()) {
      return;
    }

    Subtitle dequeuedSubtitle = null;
    if (subtitle == null) {
      try {
        dequeuedSubtitle = parserHelper.getAndClearResult();
      } catch (IOException e) {
        throw new ExoPlaybackException(e);
      }
    }

    if (subtitle == null && dequeuedSubtitle != null) {
      // We've dequeued a new subtitle. Sync the event index and update the subtitle.
      subtitle = dequeuedSubtitle;
      syncNextEventIndex(positionUs);
      textRendererNeedsUpdate = true;
    } else if (subtitle != null) {
      // We're iterating through the events in a subtitle. Set textRendererNeedsUpdate if we
      // advance to the next event.
      long nextEventTimeUs = getNextEventTime();
      while (nextEventTimeUs <= positionUs) {
        nextSubtitleEventIndex++;
        nextEventTimeUs = getNextEventTime();
        textRendererNeedsUpdate = true;
      }
      if (nextEventTimeUs == Long.MAX_VALUE) {
        // We've finished processing the subtitle.
        subtitle = null;
      }
    }

    // We don't have a subtitle. Try and read the next one from the source, and if we succeed then
    // sync and set textRendererNeedsUpdate.
    if (!inputStreamEnded && subtitle == null) {
      try {
        SampleHolder sampleHolder = parserHelper.getSampleHolder();
        sampleHolder.clearData();
        int result = source.readData(trackIndex, positionUs, formatHolder, sampleHolder, false);
        if (result == SampleSource.SAMPLE_READ && !sampleHolder.decodeOnly) {
          parserHelper.startParseOperation();
          textRendererNeedsUpdate = false;
        } else if (result == SampleSource.END_OF_STREAM) {
          inputStreamEnded = true;
        }
      } catch (IOException e) {
        throw new ExoPlaybackException(e);
      }
    }

    // Update the text renderer if we're both playing and textRendererNeedsUpdate is set.
    if (textRendererNeedsUpdate && getState() == TrackRenderer.STATE_STARTED) {
      textRendererNeedsUpdate = false;
      if (subtitle == null) {
        clearTextRenderer();
      } else {
        updateTextRenderer(positionUs);
      }
    }
  }