1. 16 Jan, 2020 20 commits
    • Tunneling timestamp use Message instead of Runnable · a99ab622
      This avoids allocating a Runnable.
      
      PiperOrigin-RevId: 290079660
      krocard committed
    • Start service in foreground if allowed · cb8391a5
      This fixes an issue where a DownloadService implementation
      that allows foreground but doesn't provide a scheduler would
      not be restarted in the case that it was still in memory but
      classed as idle by the platform.
      
      It also speeds up service restart in the case that a
      scheduler is provided.
      
      Issue: #6798
      PiperOrigin-RevId: 290068960
      olly committed
    • Split SampleQueue.advanceTo for advance & seek use cases · 775a17c4
      This method has two use cases:
      
      1. Seeking. Calls are immediately preceded by a call to rewind(), and
         the returned value isn't important unless it's ADVANCED_FAILED (i.e.
         the caller is only interested in success and failure).
      2. Advancing. The return value is important unless it's ADVANCED_FAILED,
         in which case the caller wants to treat it as 0.
      
      This change creates separate methods for each use case. The new seekTo
      methods automatically rewind and return a boolean. The updated advanceTo
      method returns 0 directly in cases where ADVANCED_FAILED was returned.
      Arguments that were always hard-coded to true by callers have also been
      removed.
      
      This change is a step toward one possible solution for #6155. How we'll
      solve that issue is still up for discussion, but this change seems like
      one we should make regardless!
      
      Issue: #6155
      PiperOrigin-RevId: 290053743
      olly committed
    • Fix DownloadService resumption · 51f2723b
      - DownloadManagerHelper now passes all downloads to the
        DownloadService when the service is attached (and once
        the downloads are known). The service then starts the
        foreground notification updater if necessary. This fixes
        the ref'd issue.
      - Don't call getScheduler() if the service is background
        only. This was already documented to be the case on the
        DownloadService constructor.
      - If the service is started in the foreground on SDK level
        26 and higher, satisfy the condition to move the service
        to the foreground in onStartCommand rather than in stop().
        It's much more obviously correct, and should produce the
        same end result.
      
      Issue: #6798
      PiperOrigin-RevId: 290050024
      olly committed
    • Merge pull request #6603 from TiVo:fix-tunneling-stuck-release · 1ec05199
      PiperOrigin-RevId: 290041295
      Oliver Woodman committed
    • Reorder renderer changes at period transitions · 2e7978a0
      Currently the following sequence of events happens at automatic period transitions:
      1. Update queue (=release old playing period)
      2. Disable unused renderers
      3. Enable newly needed renderers
      
      This order requires difficult to follow workarounds in AnalyticsCollector for all
      events related to step 2 (disable renderers). The current media period has already
      been advanced so can't be used. The current workaround saves the last known playing
      media period that was published as part of a PlaybackInfo update in ExoPlayerImpl.
      This works in most cases, but is inherently wrong because the published state in
      ExoPlayerImpl may be completely unrelated to the updates happening on the playback
      thread (e.g. if many other operations are pending).
      
      Simplify and fix this problem by changing the order of the events above:
      1. Disable unused renderers.
      2. Update queue
      3. Enable newly needed renderers.
      This way the current playing media period can be used for both renderer disable
      and renderer enable events, thus it's correct in all cases and the workaround
      in AnalyticsCollector can be removed.
      
      PiperOrigin-RevId: 290037225
      tonihei committed
    • Fix setting maskingPeriodIndex in ExoPlayerImpl · 8d2fd383
      Whenever we set the maskingWindowIndex, we also need to set the masking period index
      and the masking position. Otherwise it may cause exception when the period index
      is used together with the masking timeline.
      
      PiperOrigin-RevId: 290036973
      tonihei committed
    • Merge pull request #6678 from phhusson:feature/enable-multi-metadata-tracks · 17d13433
      PiperOrigin-RevId: 290032841
      Oliver Woodman committed
    • Fix demo app NPE when selecting unsupported samples. · cf7b908e
      PiperOrigin-RevId: 290027772
      tonihei committed
    • Add non-null by default to source.chunk · 090aed3a
      PiperOrigin-RevId: 289859343
      olly committed
    • DASH: Output Format before InitializationChunk load completes · 4a5d788f
      This optimization allows a ChunkSampleStream to output track
      formats as soon as they're parsed during an InitializationChunk
      load, rather than waiting until after the InitializationChunk
      load is completed.
      
      In DASH VOD, a single InitializationChunk typically loads the
      moov and sidx atoms in that order. Hence for long form content
      where the sidx is a non-trivial size, this may result in the
      track formats being output a non-negligible period of time
      sooner than was previously the case. This allows downstream
      renderers to start codec initialization sooner, potentially
      decreasing startup latency.
      
      For a single test stream on a fast & stable network, this
      pretty consistently reduced elapsed time until both audio and
      video codecs have been initialized from ~0.5s to ~0.3 seconds
      on a Galaxy S8. For 5 test runs without and with these patches,
      the eventTime logged by EventLogger for the second decoder
      init were:
      
      Without (secs): 0.47 0.47 0.45 0.48 0.46
      With (secs)   : 0.32 0.33 0.34 0.31 0.40
      
      PiperOrigin-RevId: 289845089
      olly committed
    • Optimize chunks to init their outputs before opening the DataSource · 7d0f0b69
      The current order of operations means that the Format is only passed
      to the chunk's output after the DataSource has been opened. This
      means that establishing the network connection and the downstream
      renderers initializing their codecs are effectively serialized to
      occur one after the other.
      
      In the new order, the Format is passed to the chunk's output before
      the DataSource has been opened. This allows the downstream renderers
      to initialize their codecs in parallel with the network connection
      being established, and hence latency at the start of playback is
      reduced.
      
      PiperOrigin-RevId: 289841854
      olly committed
    • Move @Nullable annotations to correct positions · 4b234388
      PiperOrigin-RevId: 289838473
      olly committed
    • Improve customisability of FakeSampleStream. · 96c648c2
      PiperOrigin-RevId: 289829592
      samrobinson committed
    • Move @MonotonicNonNull annotations to their correct positions · a225e887
      PiperOrigin-RevId: 289823804
      olly committed
    • Use customCacheKey in DownloadHelper.createMediaSource · cea37c60
      Issue: #6870
      PiperOrigin-RevId: 289658261
      olly committed
    • Fix nullability issues for testutil.truth · 3feb263c
      PiperOrigin-RevId: 289658098
      olly committed
    • Make tests independent · 4c74f3cf
      PiperOrigin-RevId: 289521837
      andrewlewis committed
    • Align media2 extension tests with other tests · ccce9948
      PiperOrigin-RevId: 289494365
      olly committed
    • Rename ID3 tag to Afro-Punk · f0ce1c3b
      PiperOrigin-RevId: 289490708
      olly committed
  2. 13 Jan, 2020 7 commits
    • Simplify keeping track of current id in DefaultPlaybackSessionManager · c0ee312a
      We currently have a currentMediaPeriodId and an activeSessionId that are more
      or less tracking the same thing unless the current media period isn't "active" yet.
      
      Simplify this logic by using a single currentSessionId field and the respective
      isActive flag of this session. Also move all session creation and activation code in
      the same method to make it easier to reason about the code.
      
      This change also fixes a subtle bug where events after a seek to a new window
      are not ignored as they should.
      
      PiperOrigin-RevId: 289432181
      tonihei committed
    • DownloadService: No-op cleanup · ad7bcab4
      Issue: #6798
      PiperOrigin-RevId: 289424582
      olly committed
    • Add a clarifying comment to shouldContinueLoading handling. · 3c5c43c9
      PiperOrigin-RevId: 289424321
      tonihei committed
    • Deprecate DownloadService state change methods · d7643acd
      As discovered whilst investigating #6798, there are cases
      where these methods are not correctly. They were added as
      convenience methods that could be overridden by concrete
      DownloadService implementations, but since they don't work
      properly it's preferable to require application code to
      listen to their DownloadManager directly instead.
      
      Notes:
      
      - The original proposal to fix #6798 stored the state change
      events in memory until they could be delivered. This approach
      is not ideal because the events still end up being delivered
      later than they should be. We also want to fix the root cause
      in a different way that does not require doing this.
      - This change does not fix #6798. It's a preparatory step.
      
      Issue: #6798
      PiperOrigin-RevId: 289418555
      olly committed
    • PlayerTrackEmsgHandler: Release sample queue in release() · 15f974a2
      This change makes it clear the SampleQueue doesn't outlive
      the wrapping PlayerTrackEmsgHandler, and releases it from
      PlayerTrackEmsgHandler.release().
      
      This change is a no-op because calling release() is the
      same as reset() in this case (the behavior only differs if
      a non-dummy DrmSessionManager is being used).
      
      PiperOrigin-RevId: 289416622
      olly committed
    • Split HlsSampleStreamWrapper.init into two methods · 7f7632a3
      As a result, onMediaChunkLoadStarted gets invoked on the loading thread, and
      init on the playback thread, matching the thread access comments.
      
      Issue:#6321
      PiperOrigin-RevId: 289167981
      aquilescanta committed
    • Add NTP client to get time offset for live streams without UTCTiming. · 01e661f2
      Dash live streams require that the client has an accurate wall clock
      time and in absence of a UTCTiming element, this is assumed to be the
      NTP time.
      
      This change adds NTP time offset resolution for DASH live streams
      without such timing elements.
      
      PiperOrigin-RevId: 289098796
      tonihei committed
  3. 10 Jan, 2020 13 commits