Commit 21e69f31 by Oliver Woodman

Add more loading info (including chunk loading times) to

BaseChunkSampleSourceEventListener.onLoadCompleted.
parent 3a1325b0
...@@ -102,7 +102,8 @@ public class EventLogger implements DemoPlayer.Listener, DemoPlayer.InfoListener ...@@ -102,7 +102,8 @@ public class EventLogger implements DemoPlayer.Listener, DemoPlayer.InfoListener
} }
@Override @Override
public void onLoadCompleted(int sourceId, long bytesLoaded) { public void onLoadCompleted(int sourceId, long bytesLoaded, int type, int trigger, Format format,
int mediaStartTimeMs, int mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs) {
if (VerboseLogUtil.isTagEnabled(TAG)) { if (VerboseLogUtil.isTagEnabled(TAG)) {
long downloadTime = SystemClock.elapsedRealtime() - loadStartTimeMs[sourceId]; long downloadTime = SystemClock.elapsedRealtime() - loadStartTimeMs[sourceId];
Log.v(TAG, "loadEnd [" + getSessionTimeString() + ", " + sourceId + ", " + downloadTime Log.v(TAG, "loadEnd [" + getSessionTimeString() + ", " + sourceId + ", " + downloadTime
......
...@@ -128,7 +128,8 @@ public class DemoPlayer implements ExoPlayer.Listener, ChunkSampleSource.EventLi ...@@ -128,7 +128,8 @@ public class DemoPlayer implements ExoPlayer.Listener, ChunkSampleSource.EventLi
void onBandwidthSample(int elapsedMs, long bytes, long bitrateEstimate); void onBandwidthSample(int elapsedMs, long bytes, long bitrateEstimate);
void onLoadStarted(int sourceId, long length, int type, int trigger, Format format, void onLoadStarted(int sourceId, long length, int type, int trigger, Format format,
int mediaStartTimeMs, int mediaEndTimeMs); int mediaStartTimeMs, int mediaEndTimeMs);
void onLoadCompleted(int sourceId, long bytesLoaded); void onLoadCompleted(int sourceId, long bytesLoaded, int type, int trigger, Format format,
int mediaStartTimeMs, int mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs);
void onDecoderInitialized(String decoderName, long elapsedRealtimeMs, void onDecoderInitialized(String decoderName, long elapsedRealtimeMs,
long initializationDurationMs); long initializationDurationMs);
} }
...@@ -539,9 +540,11 @@ public class DemoPlayer implements ExoPlayer.Listener, ChunkSampleSource.EventLi ...@@ -539,9 +540,11 @@ public class DemoPlayer implements ExoPlayer.Listener, ChunkSampleSource.EventLi
} }
@Override @Override
public void onLoadCompleted(int sourceId, long bytesLoaded) { public void onLoadCompleted(int sourceId, long bytesLoaded, int type, int trigger, Format format,
int mediaStartTimeMs, int mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs) {
if (infoListener != null) { if (infoListener != null) {
infoListener.onLoadCompleted(sourceId, bytesLoaded); infoListener.onLoadCompleted(sourceId, bytesLoaded, type, trigger, format, mediaStartTimeMs,
mediaEndTimeMs, elapsedRealtimeMs, loadDurationMs);
} }
} }
......
...@@ -48,8 +48,19 @@ public interface BaseChunkSampleSourceEventListener { ...@@ -48,8 +48,19 @@ public interface BaseChunkSampleSourceEventListener {
* *
* @param sourceId The id of the reporting {@link SampleSource}. * @param sourceId The id of the reporting {@link SampleSource}.
* @param bytesLoaded The number of bytes that were loaded. * @param bytesLoaded The number of bytes that were loaded.
* @param type The type of the loaded data.
* @param trigger The reason for the data being loaded.
* @param format The particular format to which this data corresponds, or null if the loaded data
* does not correspond to a format.
* @param mediaStartTimeMs The media time of the start of the loaded data, or -1 if this load was
* for initialization data.
* @param mediaEndTimeMs The media time of the end of the loaded data, or -1 if this load was for
* initialization data.
* @param elapsedRealtimeMs {@code elapsedRealtime} timestamp of when the load finished.
* @param loadDurationMs Amount of time taken to load the data.
*/ */
void onLoadCompleted(int sourceId, long bytesLoaded); void onLoadCompleted(int sourceId, long bytesLoaded, int type, int trigger, Format format,
int mediaStartTimeMs, int mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs);
/** /**
* Invoked when the current upstream load operation is canceled. * Invoked when the current upstream load operation is canceled.
......
...@@ -84,6 +84,7 @@ public class ChunkSampleSource implements SampleSource, Loader.Callback { ...@@ -84,6 +84,7 @@ public class ChunkSampleSource implements SampleSource, Loader.Callback {
private boolean currentLoadableExceptionFatal; private boolean currentLoadableExceptionFatal;
private int currentLoadableExceptionCount; private int currentLoadableExceptionCount;
private long currentLoadableExceptionTimestamp; private long currentLoadableExceptionTimestamp;
private long currentLoadStartTimeMs;
private MediaFormat downstreamMediaFormat; private MediaFormat downstreamMediaFormat;
private volatile Format downstreamFormat; private volatile Format downstreamFormat;
...@@ -329,11 +330,18 @@ public class ChunkSampleSource implements SampleSource, Loader.Callback { ...@@ -329,11 +330,18 @@ public class ChunkSampleSource implements SampleSource, Loader.Callback {
@Override @Override
public void onLoadCompleted(Loadable loadable) { public void onLoadCompleted(Loadable loadable) {
long now = SystemClock.elapsedRealtime();
long loadDurationMs = now - currentLoadStartTimeMs;
Chunk currentLoadable = currentLoadableHolder.chunk; Chunk currentLoadable = currentLoadableHolder.chunk;
chunkSource.onChunkLoadCompleted(currentLoadable); chunkSource.onChunkLoadCompleted(currentLoadable);
notifyLoadCompleted(currentLoadable.bytesLoaded());
if (isMediaChunk(currentLoadable)) { if (isMediaChunk(currentLoadable)) {
MediaChunk mediaChunk = (MediaChunk) currentLoadable;
notifyLoadCompleted(currentLoadable.bytesLoaded(), mediaChunk.type, mediaChunk.trigger,
mediaChunk.format, mediaChunk.startTimeUs, mediaChunk.endTimeUs, now, loadDurationMs);
loadingFinished = ((BaseMediaChunk) currentLoadable).isLastChunk; loadingFinished = ((BaseMediaChunk) currentLoadable).isLastChunk;
} else {
notifyLoadCompleted(currentLoadable.bytesLoaded(), currentLoadable.type,
currentLoadable.trigger, currentLoadable.format, -1, -1, now, loadDurationMs);
} }
clearCurrentLoadable(); clearCurrentLoadable();
updateLoadControl(); updateLoadControl();
...@@ -525,6 +533,7 @@ public class ChunkSampleSource implements SampleSource, Loader.Callback { ...@@ -525,6 +533,7 @@ public class ChunkSampleSource implements SampleSource, Loader.Callback {
// Nothing to load. // Nothing to load.
return; return;
} }
currentLoadStartTimeMs = SystemClock.elapsedRealtime();
if (isMediaChunk(currentLoadable)) { if (isMediaChunk(currentLoadable)) {
BaseMediaChunk mediaChunk = (BaseMediaChunk) currentLoadable; BaseMediaChunk mediaChunk = (BaseMediaChunk) currentLoadable;
mediaChunk.init(sampleQueue); mediaChunk.init(sampleQueue);
...@@ -594,12 +603,15 @@ public class ChunkSampleSource implements SampleSource, Loader.Callback { ...@@ -594,12 +603,15 @@ public class ChunkSampleSource implements SampleSource, Loader.Callback {
} }
} }
private void notifyLoadCompleted(final long bytesLoaded) { private void notifyLoadCompleted(final long bytesLoaded, final int type, final int trigger,
final Format format, final long mediaStartTimeUs, final long mediaEndTimeUs,
final long elapsedRealtimeMs, final long loadDurationMs) {
if (eventHandler != null && eventListener != null) { if (eventHandler != null && eventListener != null) {
eventHandler.post(new Runnable() { eventHandler.post(new Runnable() {
@Override @Override
public void run() { public void run() {
eventListener.onLoadCompleted(eventSourceId, bytesLoaded); eventListener.onLoadCompleted(eventSourceId, bytesLoaded, type, trigger, format,
usToMs(mediaStartTimeUs), usToMs(mediaEndTimeUs), elapsedRealtimeMs, loadDurationMs);
} }
}); });
} }
......
...@@ -84,6 +84,7 @@ public class HlsSampleSource implements SampleSource, Loader.Callback { ...@@ -84,6 +84,7 @@ public class HlsSampleSource implements SampleSource, Loader.Callback {
private boolean currentLoadableExceptionFatal; private boolean currentLoadableExceptionFatal;
private int currentLoadableExceptionCount; private int currentLoadableExceptionCount;
private long currentLoadableExceptionTimestamp; private long currentLoadableExceptionTimestamp;
private long currentLoadStartTimeMs;
public HlsSampleSource(HlsChunkSource chunkSource, boolean frameAccurateSeeking, public HlsSampleSource(HlsChunkSource chunkSource, boolean frameAccurateSeeking,
int downstreamRendererCount) { int downstreamRendererCount) {
...@@ -316,11 +317,17 @@ public class HlsSampleSource implements SampleSource, Loader.Callback { ...@@ -316,11 +317,17 @@ public class HlsSampleSource implements SampleSource, Loader.Callback {
@Override @Override
public void onLoadCompleted(Loadable loadable) { public void onLoadCompleted(Loadable loadable) {
long now = SystemClock.elapsedRealtime();
long loadDurationMs = now - currentLoadStartTimeMs;
chunkSource.onChunkLoadCompleted(currentLoadable); chunkSource.onChunkLoadCompleted(currentLoadable);
notifyLoadCompleted(currentLoadable.bytesLoaded());
if (isTsChunk(currentLoadable)) { if (isTsChunk(currentLoadable)) {
TsChunk tsChunk = (TsChunk) loadable; TsChunk tsChunk = (TsChunk) loadable;
loadingFinished = tsChunk.isLastChunk; loadingFinished = tsChunk.isLastChunk;
notifyLoadCompleted(currentLoadable.bytesLoaded(), tsChunk.type, tsChunk.trigger,
tsChunk.format, tsChunk.startTimeUs, tsChunk.endTimeUs, now, loadDurationMs);
} else {
notifyLoadCompleted(currentLoadable.bytesLoaded(), currentLoadable.type,
currentLoadable.trigger, currentLoadable.format, -1, -1, now, loadDurationMs);
} }
if (!currentLoadableExceptionFatal) { if (!currentLoadableExceptionFatal) {
clearCurrentLoadable(); clearCurrentLoadable();
...@@ -450,6 +457,7 @@ public class HlsSampleSource implements SampleSource, Loader.Callback { ...@@ -450,6 +457,7 @@ public class HlsSampleSource implements SampleSource, Loader.Callback {
return; return;
} }
currentLoadStartTimeMs = SystemClock.elapsedRealtime();
currentLoadable = nextLoadable; currentLoadable = nextLoadable;
if (isTsChunk(currentLoadable)) { if (isTsChunk(currentLoadable)) {
TsChunk tsChunk = (TsChunk) currentLoadable; TsChunk tsChunk = (TsChunk) currentLoadable;
...@@ -498,12 +506,15 @@ public class HlsSampleSource implements SampleSource, Loader.Callback { ...@@ -498,12 +506,15 @@ public class HlsSampleSource implements SampleSource, Loader.Callback {
} }
} }
private void notifyLoadCompleted(final long bytesLoaded) { private void notifyLoadCompleted(final long bytesLoaded, final int type, final int trigger,
final Format format, final long mediaStartTimeUs, final long mediaEndTimeUs,
final long elapsedRealtimeMs, final long loadDurationMs) {
if (eventHandler != null && eventListener != null) { if (eventHandler != null && eventListener != null) {
eventHandler.post(new Runnable() { eventHandler.post(new Runnable() {
@Override @Override
public void run() { public void run() {
eventListener.onLoadCompleted(eventSourceId, bytesLoaded); eventListener.onLoadCompleted(eventSourceId, bytesLoaded, type, trigger, format,
usToMs(mediaStartTimeUs), usToMs(mediaEndTimeUs), elapsedRealtimeMs, loadDurationMs);
} }
}); });
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment