Prevent timeline access in AnalyticsCollector for future windows and periods.

Some of the events are emitted by the media periods itself and their index may
not be available in the publicly accessible timeline yet.

To prevent this, we currently check for timeline.isEmpty() only. But this may
also happen for dynamic changes, e.g. when new sources are added in fast
succession and a manifest for one of the new sources starts loading before the
updated timeline is reported.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=194057401
This commit is contained in:
tonihei 2018-04-24 02:26:07 -07:00 committed by Oliver Woodman
parent f96f053f2e
commit 874dc202f8
57 changed files with 200 additions and 170 deletions

View File

@ -80,7 +80,6 @@ public class AnalyticsCollector
private final CopyOnWriteArraySet<AnalyticsListener> listeners;
private final Player player;
private final Clock clock;
private final Period period;
private final Window window;
private final MediaPeriodQueueTracker mediaPeriodQueueTracker;
@ -95,7 +94,6 @@ public class AnalyticsCollector
this.clock = Assertions.checkNotNull(clock);
listeners = new CopyOnWriteArraySet<>();
mediaPeriodQueueTracker = new MediaPeriodQueueTracker();
period = new Period();
window = new Window();
}
@ -164,13 +162,10 @@ public class AnalyticsCollector
*/
public final void resetForNewMediaSource() {
// Copying the list is needed because onMediaPeriodReleased will modify the list.
List<MediaPeriodId> activeMediaPeriods =
List<WindowAndMediaPeriodId> activeMediaPeriods =
new ArrayList<>(mediaPeriodQueueTracker.activeMediaPeriods);
Timeline timeline = mediaPeriodQueueTracker.timeline;
for (MediaPeriodId mediaPeriod : activeMediaPeriods) {
int windowIndex =
timeline.isEmpty() ? 0 : timeline.getPeriod(mediaPeriod.periodIndex, period).windowIndex;
onMediaPeriodReleased(windowIndex, mediaPeriod);
for (WindowAndMediaPeriodId mediaPeriod : activeMediaPeriods) {
onMediaPeriodReleased(mediaPeriod.windowIndex, mediaPeriod.mediaPeriodId);
}
}
@ -309,7 +304,7 @@ public class AnalyticsCollector
@Override
public final void onMediaPeriodCreated(int windowIndex, MediaPeriodId mediaPeriodId) {
mediaPeriodQueueTracker.onMediaPeriodCreated(mediaPeriodId);
mediaPeriodQueueTracker.onMediaPeriodCreated(windowIndex, mediaPeriodId);
EventTime eventTime = generateEventTime(windowIndex, mediaPeriodId);
for (AnalyticsListener listener : listeners) {
listener.onMediaPeriodCreated(eventTime);
@ -318,7 +313,7 @@ public class AnalyticsCollector
@Override
public final void onMediaPeriodReleased(int windowIndex, MediaPeriodId mediaPeriodId) {
mediaPeriodQueueTracker.onMediaPeriodReleased(mediaPeriodId);
mediaPeriodQueueTracker.onMediaPeriodReleased(windowIndex, mediaPeriodId);
EventTime eventTime = generateEventTime(windowIndex, mediaPeriodId);
for (AnalyticsListener listener : listeners) {
listener.onMediaPeriodReleased(eventTime);
@ -377,7 +372,7 @@ public class AnalyticsCollector
@Override
public final void onReadingStarted(int windowIndex, MediaPeriodId mediaPeriodId) {
mediaPeriodQueueTracker.onReadingStarted(mediaPeriodId);
mediaPeriodQueueTracker.onReadingStarted(windowIndex, mediaPeriodId);
EventTime eventTime = generateEventTime(windowIndex, mediaPeriodId);
for (AnalyticsListener listener : listeners) {
listener.onReadingStarted(eventTime);
@ -597,7 +592,8 @@ public class AnalyticsCollector
// This event is for content in the currently playing window.
eventPositionMs = player.getContentPosition();
}
} else if (timeline.isEmpty() || (mediaPeriodId != null && mediaPeriodId.isAd())) {
} else if (windowIndex >= timeline.getWindowCount()
|| (mediaPeriodId != null && mediaPeriodId.isAd())) {
// This event is for an unknown future window or for an ad in a future window.
// Assume start position of zero.
eventPositionMs = 0;
@ -617,16 +613,13 @@ public class AnalyticsCollector
bufferedDurationMs);
}
private EventTime generateEventTime(@Nullable MediaPeriodId mediaPeriodId) {
Timeline timeline = player.getCurrentTimeline();
if (mediaPeriodId == null) {
mediaPeriodId = mediaPeriodQueueTracker.tryResolveWindowIndex(player.getCurrentWindowIndex());
private EventTime generateEventTime(@Nullable WindowAndMediaPeriodId mediaPeriod) {
if (mediaPeriod == null) {
int windowIndex = player.getCurrentWindowIndex();
MediaPeriodId mediaPeriodId = mediaPeriodQueueTracker.tryResolveWindowIndex(windowIndex);
return generateEventTime(windowIndex, mediaPeriodId);
}
int windowIndex =
mediaPeriodId == null || timeline.isEmpty()
? player.getCurrentWindowIndex()
: timeline.getPeriod(mediaPeriodId.periodIndex, period).windowIndex;
return generateEventTime(windowIndex, mediaPeriodId);
return generateEventTime(mediaPeriod.windowIndex, mediaPeriod.mediaPeriodId);
}
private EventTime generateLastReportedPlayingMediaPeriodEventTime() {
@ -651,11 +644,11 @@ public class AnalyticsCollector
// TODO: Investigate reporting MediaPeriodId in renderer events and adding a listener of queue
// changes, which would hopefully remove the need to track the queue here.
private final ArrayList<MediaPeriodId> activeMediaPeriods;
private final ArrayList<WindowAndMediaPeriodId> activeMediaPeriods;
private final Period period;
private MediaPeriodId lastReportedPlayingMediaPeriod;
private MediaPeriodId readingMediaPeriod;
private WindowAndMediaPeriodId lastReportedPlayingMediaPeriod;
private WindowAndMediaPeriodId readingMediaPeriod;
private Timeline timeline;
private boolean isSeeking;
@ -666,33 +659,34 @@ public class AnalyticsCollector
}
/**
* Returns the {@link MediaPeriodId} of the media period in the front of the queue. This is the
* playing media period unless the player hasn't started playing yet (in which case it is the
* loading media period or null). While the player is seeking or preparing, this method will
* always return null to reflect the uncertainty about the current playing period. May also be
* null, if the timeline is empty or no media period is active yet.
* Returns the {@link WindowAndMediaPeriodId} of the media period in the front of the queue.
* This is the playing media period unless the player hasn't started playing yet (in which case
* it is the loading media period or null). While the player is seeking or preparing, this
* method will always return null to reflect the uncertainty about the current playing period.
* May also be null, if the timeline is empty or no media period is active yet.
*/
public @Nullable MediaPeriodId getPlayingMediaPeriod() {
public @Nullable WindowAndMediaPeriodId getPlayingMediaPeriod() {
return activeMediaPeriods.isEmpty() || timeline.isEmpty() || isSeeking
? null
: activeMediaPeriods.get(0);
}
/**
* Returns the {@link MediaPeriodId} of the currently playing media period. This is the publicly
* reported period which should always match {@link Player#getCurrentPeriodIndex()} unless the
* player is currently seeking or being prepared in which case the previous period is reported
* until the seek or preparation is processed. May be null, if no media period is active yet.
* Returns the {@link WindowAndMediaPeriodId} of the currently playing media period. This is the
* publicly reported period which should always match {@link Player#getCurrentPeriodIndex()}
* unless the player is currently seeking or being prepared in which case the previous period is
* reported until the seek or preparation is processed. May be null, if no media period is
* active yet.
*/
public @Nullable MediaPeriodId getLastReportedPlayingMediaPeriod() {
public @Nullable WindowAndMediaPeriodId getLastReportedPlayingMediaPeriod() {
return lastReportedPlayingMediaPeriod;
}
/**
* Returns the {@link MediaPeriodId} of the media period currently being read by the player. May
* be null, if the player is not reading a media period.
* Returns the {@link WindowAndMediaPeriodId} of the media period currently being read by the
* player. May be null, if the player is not reading a media period.
*/
public @Nullable MediaPeriodId getReadingMediaPeriod() {
public @Nullable WindowAndMediaPeriodId getReadingMediaPeriod() {
return readingMediaPeriod;
}
@ -701,7 +695,7 @@ public class AnalyticsCollector
* currently loading or will be the next one loading. May be null, if no media period is active
* yet.
*/
public @Nullable MediaPeriodId getLoadingMediaPeriod() {
public @Nullable WindowAndMediaPeriodId getLoadingMediaPeriod() {
return activeMediaPeriods.isEmpty()
? null
: activeMediaPeriods.get(activeMediaPeriods.size() - 1);
@ -713,20 +707,23 @@ public class AnalyticsCollector
}
/**
* Tries to find an existing media period from the specified window index. Only returns a
* Tries to find an existing media period id from the specified window index. Only returns a
* non-null media period id if there is a unique, unambiguous match.
*/
public @Nullable MediaPeriodId tryResolveWindowIndex(int windowIndex) {
MediaPeriodId match = null;
if (timeline != null && !timeline.isEmpty()) {
if (timeline != null) {
int timelinePeriodCount = timeline.getPeriodCount();
for (int i = 0; i < activeMediaPeriods.size(); i++) {
MediaPeriodId mediaPeriodId = activeMediaPeriods.get(i);
if (timeline.getPeriod(mediaPeriodId.periodIndex, period).windowIndex == windowIndex) {
WindowAndMediaPeriodId mediaPeriod = activeMediaPeriods.get(i);
int periodIndex = mediaPeriod.mediaPeriodId.periodIndex;
if (periodIndex < timelinePeriodCount
&& timeline.getPeriod(periodIndex, period).windowIndex == windowIndex) {
if (match != null) {
// Ambiguous match.
return null;
}
match = mediaPeriodId;
match = mediaPeriod.mediaPeriodId;
}
}
}
@ -742,10 +739,10 @@ public class AnalyticsCollector
public void onTimelineChanged(Timeline timeline) {
for (int i = 0; i < activeMediaPeriods.size(); i++) {
activeMediaPeriods.set(
i, updateMediaPeriodIdToNewTimeline(activeMediaPeriods.get(i), timeline));
i, updateMediaPeriodToNewTimeline(activeMediaPeriods.get(i), timeline));
}
if (readingMediaPeriod != null) {
readingMediaPeriod = updateMediaPeriodIdToNewTimeline(readingMediaPeriod, timeline);
readingMediaPeriod = updateMediaPeriodToNewTimeline(readingMediaPeriod, timeline);
}
this.timeline = timeline;
updateLastReportedPlayingMediaPeriod();
@ -763,24 +760,25 @@ public class AnalyticsCollector
}
/** Updates the queue with a newly created media period. */
public void onMediaPeriodCreated(MediaPeriodId mediaPeriodId) {
activeMediaPeriods.add(mediaPeriodId);
public void onMediaPeriodCreated(int windowIndex, MediaPeriodId mediaPeriodId) {
activeMediaPeriods.add(new WindowAndMediaPeriodId(windowIndex, mediaPeriodId));
if (activeMediaPeriods.size() == 1 && !timeline.isEmpty()) {
updateLastReportedPlayingMediaPeriod();
}
}
/** Updates the queue with a released media period. */
public void onMediaPeriodReleased(MediaPeriodId mediaPeriodId) {
activeMediaPeriods.remove(mediaPeriodId);
if (mediaPeriodId.equals(readingMediaPeriod)) {
public void onMediaPeriodReleased(int windowIndex, MediaPeriodId mediaPeriodId) {
WindowAndMediaPeriodId mediaPeriod = new WindowAndMediaPeriodId(windowIndex, mediaPeriodId);
activeMediaPeriods.remove(mediaPeriod);
if (mediaPeriod.equals(readingMediaPeriod)) {
readingMediaPeriod = activeMediaPeriods.isEmpty() ? null : activeMediaPeriods.get(0);
}
}
/** Update the queue with a change in the reading media period. */
public void onReadingStarted(MediaPeriodId mediaPeriodId) {
readingMediaPeriod = mediaPeriodId;
public void onReadingStarted(int windowIndex, MediaPeriodId mediaPeriodId) {
readingMediaPeriod = new WindowAndMediaPeriodId(windowIndex, mediaPeriodId);
}
private void updateLastReportedPlayingMediaPeriod() {
@ -789,16 +787,48 @@ public class AnalyticsCollector
}
}
private MediaPeriodId updateMediaPeriodIdToNewTimeline(
MediaPeriodId mediaPeriodId, Timeline newTimeline) {
private WindowAndMediaPeriodId updateMediaPeriodToNewTimeline(
WindowAndMediaPeriodId mediaPeriod, Timeline newTimeline) {
if (newTimeline.isEmpty() || timeline.isEmpty()) {
return mediaPeriodId;
return mediaPeriod;
}
Object uid = timeline.getPeriod(mediaPeriodId.periodIndex, period, /* setIds= */ true).uid;
int newIndex = newTimeline.getIndexOfPeriod(uid);
return newIndex == C.INDEX_UNSET
? mediaPeriodId
: mediaPeriodId.copyWithPeriodIndex(newIndex);
Object uid =
timeline.getPeriod(mediaPeriod.mediaPeriodId.periodIndex, period, /* setIds= */ true).uid;
int newPeriodIndex = newTimeline.getIndexOfPeriod(uid);
if (newPeriodIndex == C.INDEX_UNSET) {
return mediaPeriod;
}
int newWindowIndex = newTimeline.getPeriod(newPeriodIndex, period).windowIndex;
return new WindowAndMediaPeriodId(
newWindowIndex, mediaPeriod.mediaPeriodId.copyWithPeriodIndex(newPeriodIndex));
}
}
private static final class WindowAndMediaPeriodId {
public final int windowIndex;
public final MediaPeriodId mediaPeriodId;
public WindowAndMediaPeriodId(int windowIndex, MediaPeriodId mediaPeriodId) {
this.windowIndex = windowIndex;
this.mediaPeriodId = mediaPeriodId;
}
@Override
public boolean equals(@Nullable Object other) {
if (this == other) {
return true;
}
if (other == null || getClass() != other.getClass()) {
return false;
}
WindowAndMediaPeriodId that = (WindowAndMediaPeriodId) other;
return windowIndex == that.windowIndex && mediaPeriodId.equals(that.mediaPeriodId);
}
@Override
public int hashCode() {
return 31 * windowIndex + mediaPeriodId.hashCode();
}
}
}

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Geen</string>
<string name="exo_track_selection_auto">Outo</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">ምንም</string>
<string name="exo_track_selection_auto">ራስ-ሰር</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">بدون اختيار</string>
<string name="exo_track_selection_auto">تلقائي</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Yoxdur</string>
<string name="exo_track_selection_auto">Avtomatik</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Nijedna</string>
<string name="exo_track_selection_auto">Automatski</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Няма</string>
<string name="exo_track_selection_auto">Аўтаматычна</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Ništa</string>
<string name="exo_track_selection_auto">Automatski</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Cap</string>
<string name="exo_track_selection_auto">Automàtica</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Žádné</string>
<string name="exo_track_selection_auto">Automaticky</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Ingen</string>
<string name="exo_track_selection_auto">Automatisk</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Keine</string>
<string name="exo_track_selection_auto">Automatisch</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Κανένα</string>
<string name="exo_track_selection_auto">Αυτόματο</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Ninguna</string>
<string name="exo_track_selection_auto">Automática</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Ninguna</string>
<string name="exo_track_selection_auto">Automático</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Bat ere ez</string>
<string name="exo_track_selection_auto">Automatikoa</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">هیچ‌کدام</string>
<string name="exo_track_selection_auto">خودکار</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none"></string>
<string name="exo_track_selection_auto">Automaattinen</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_none">Aucun</string>
<string name="exo_track_selection_auto">Auto</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Aucun</string>
<string name="exo_track_selection_auto">Automatique</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Ningunha pista</string>
<string name="exo_track_selection_auto">Pista automática</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Ništa</string>
<string name="exo_track_selection_auto">Automatski</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Nincs</string>
<string name="exo_track_selection_auto">Automatikus</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Ekkert</string>
<string name="exo_track_selection_auto">Sjálfvirkt</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_none">Nessuno</string>
<string name="exo_track_selection_auto">Auto</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">ללא</string>
<string name="exo_track_selection_auto">אוטומטי</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">なし</string>
<string name="exo_track_selection_auto">自動</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">არცერთი</string>
<string name="exo_track_selection_auto">ავტომატური</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Ешқайсысы</string>
<string name="exo_track_selection_auto">Автоматты</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">គ្មាន</string>
<string name="exo_track_selection_auto">ស្វ័យប្រវត្តិ</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">없음</string>
<string name="exo_track_selection_auto">자동</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Жок</string>
<string name="exo_track_selection_auto">Авто</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">ບໍ່ມີ</string>
<string name="exo_track_selection_auto">ອັດຕະໂນມັດ</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Нема</string>
<string name="exo_track_selection_auto">Автоматскa</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Байхгүй</string>
<string name="exo_track_selection_auto">Автомат</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Tiada</string>
<string name="exo_track_selection_auto">Automatik</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Ingen</string>
<string name="exo_track_selection_auto">Automatisk</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_none">Geen</string>
<string name="exo_track_selection_auto">Auto</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Brak</string>
<string name="exo_track_selection_auto">Automatycznie</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Nenhuma</string>
<string name="exo_track_selection_auto">Automático</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Nenhuma</string>
<string name="exo_track_selection_auto">Automática</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Нет</string>
<string name="exo_track_selection_auto">Авто</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Žiadne</string>
<string name="exo_track_selection_auto">Automaticky</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">N</string>
<string name="exo_track_selection_auto">Samodejno</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Asnjë</string>
<string name="exo_track_selection_auto">Automatike</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Ниједна</string>
<string name="exo_track_selection_auto">Аутоматски</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Ingen</string>
<string name="exo_track_selection_auto">Automatiskt</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Hamna</string>
<string name="exo_track_selection_auto">Otomatiki</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">ไม่มี</string>
<string name="exo_track_selection_auto">ยานยนต์</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Wala</string>
<string name="exo_track_selection_auto">Awtomatiko</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Yok</string>
<string name="exo_track_selection_auto">Otomatik</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Нічого</string>
<string name="exo_track_selection_auto">Автоматично</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Hech biri</string>
<string name="exo_track_selection_auto">Avtomatik</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Bỏ chọn tất cả</string>
<string name="exo_track_selection_auto">Tự động</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none"></string>
<string name="exo_track_selection_auto">自動</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none"></string>
<string name="exo_track_selection_auto">自動</string>
</resources>

View File

@ -20,6 +20,6 @@
<string name="exo_track_selection_title_video">Video</string>
<string name="exo_track_selection_title_audio">Audio</string>
<string name="exo_track_selection_title_text">Text</string>
<string name="exo_track_selection_none">None</string>
<string name="exo_track_selection_auto">Auto</string>
<string name="exo_track_selection_none">Lutho</string>
<string name="exo_track_selection_auto">Okuzenzakalelayo</string>
</resources>