mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Don't let renderer input buffer get too big if codec not available.
------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=128082468
This commit is contained in:
parent
68156ac7a4
commit
0909446133
9 changed files with 85 additions and 28 deletions
|
|
@ -157,6 +157,7 @@ public final class LibvpxVideoRenderer extends BaseRenderer {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isRendererAvailable()) {
|
||||||
try {
|
try {
|
||||||
if (decoder == null) {
|
if (decoder == null) {
|
||||||
// If we don't have a decoder yet, we need to instantiate one.
|
// If we don't have a decoder yet, we need to instantiate one.
|
||||||
|
|
@ -177,6 +178,9 @@ public final class LibvpxVideoRenderer extends BaseRenderer {
|
||||||
} catch (VpxDecoderException e) {
|
} catch (VpxDecoderException e) {
|
||||||
throw ExoPlaybackException.createForRenderer(e, getIndex());
|
throw ExoPlaybackException.createForRenderer(e, getIndex());
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
skipToKeyframeBefore(positionUs);
|
||||||
|
}
|
||||||
decoderCounters.ensureUpdated();
|
decoderCounters.ensureUpdated();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -331,7 +335,8 @@ public final class LibvpxVideoRenderer extends BaseRenderer {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isReady() {
|
public boolean isReady() {
|
||||||
if (format != null && (isSourceReady() || outputBuffer != null) && renderedFirstFrame) {
|
if (format != null && (isSourceReady() || outputBuffer != null)
|
||||||
|
&& (renderedFirstFrame || !isRendererAvailable())) {
|
||||||
// Ready. If we were joining then we've now joined, so clear the joining deadline.
|
// Ready. If we were joining then we've now joined, so clear the joining deadline.
|
||||||
joiningDeadlineMs = -1;
|
joiningDeadlineMs = -1;
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -385,15 +390,19 @@ public final class LibvpxVideoRenderer extends BaseRenderer {
|
||||||
outputBuffer = null;
|
outputBuffer = null;
|
||||||
format = null;
|
format = null;
|
||||||
try {
|
try {
|
||||||
|
releaseDecoder();
|
||||||
|
} finally {
|
||||||
|
decoderCounters.ensureUpdated();
|
||||||
|
eventDispatcher.disabled(decoderCounters);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void releaseDecoder() {
|
||||||
if (decoder != null) {
|
if (decoder != null) {
|
||||||
decoder.release();
|
decoder.release();
|
||||||
decoder = null;
|
decoder = null;
|
||||||
decoderCounters.codecReleaseCount++;
|
decoderCounters.codecReleaseCount++;
|
||||||
}
|
}
|
||||||
} finally {
|
|
||||||
decoderCounters.ensureUpdated();
|
|
||||||
eventDispatcher.disabled(decoderCounters);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean readFormat() {
|
private boolean readFormat() {
|
||||||
|
|
@ -428,9 +437,7 @@ public final class LibvpxVideoRenderer extends BaseRenderer {
|
||||||
this.surface = surface;
|
this.surface = surface;
|
||||||
outputBufferRenderer = null;
|
outputBufferRenderer = null;
|
||||||
outputMode = (surface != null) ? VpxDecoder.OUTPUT_MODE_RGB : VpxDecoder.OUTPUT_MODE_NONE;
|
outputMode = (surface != null) ? VpxDecoder.OUTPUT_MODE_RGB : VpxDecoder.OUTPUT_MODE_NONE;
|
||||||
if (decoder != null) {
|
updateDecoder();
|
||||||
decoder.setOutputMode(outputMode);
|
|
||||||
}
|
|
||||||
drawnToSurface = false;
|
drawnToSurface = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -442,10 +449,22 @@ public final class LibvpxVideoRenderer extends BaseRenderer {
|
||||||
surface = null;
|
surface = null;
|
||||||
outputMode = (outputBufferRenderer != null) ? VpxDecoder.OUTPUT_MODE_YUV
|
outputMode = (outputBufferRenderer != null) ? VpxDecoder.OUTPUT_MODE_YUV
|
||||||
: VpxDecoder.OUTPUT_MODE_NONE;
|
: VpxDecoder.OUTPUT_MODE_NONE;
|
||||||
|
updateDecoder();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateDecoder() {
|
||||||
if (decoder != null) {
|
if (decoder != null) {
|
||||||
|
if (outputMode == VpxDecoder.OUTPUT_MODE_NONE) {
|
||||||
|
releaseDecoder();
|
||||||
|
} else {
|
||||||
decoder.setOutputMode(outputMode);
|
decoder.setOutputMode(outputMode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isRendererAvailable() {
|
||||||
|
return surface != null || outputBufferRenderer != null;
|
||||||
|
}
|
||||||
|
|
||||||
private void maybeNotifyVideoSizeChanged(final int width, final int height) {
|
private void maybeNotifyVideoSizeChanged(final int width, final int height) {
|
||||||
if (previousWidth != width || previousHeight != height) {
|
if (previousWidth != width || previousHeight != height) {
|
||||||
|
|
|
||||||
|
|
@ -263,4 +263,13 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
||||||
return readEndOfStream ? streamIsFinal : stream.isReady();
|
return readEndOfStream ? streamIsFinal : stream.isReady();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempts to skip to the keyframe before the specified time.
|
||||||
|
*
|
||||||
|
* @param timeUs The specified time.
|
||||||
|
*/
|
||||||
|
protected void skipToKeyframeBefore(long timeUs) {
|
||||||
|
stream.skipToKeyframeBefore(timeUs);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -477,6 +477,8 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
||||||
while (drainOutputBuffer(positionUs, elapsedRealtimeUs)) {}
|
while (drainOutputBuffer(positionUs, elapsedRealtimeUs)) {}
|
||||||
while (feedInputBuffer()) {}
|
while (feedInputBuffer()) {}
|
||||||
TraceUtil.endSection();
|
TraceUtil.endSection();
|
||||||
|
} else if (format != null) {
|
||||||
|
skipToKeyframeBefore(positionUs);
|
||||||
}
|
}
|
||||||
decoderCounters.ensureUpdated();
|
decoderCounters.ensureUpdated();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -610,6 +610,11 @@ public final class ExtractorMediaSource implements MediaPeriod, MediaSource,
|
||||||
return ExtractorMediaSource.this.readData(track, formatHolder, buffer);
|
return ExtractorMediaSource.this.readData(track, formatHolder, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void skipToKeyframeBefore(long timeUs) {
|
||||||
|
sampleQueues[track].skipToKeyframeBefore(timeUs);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -55,4 +55,11 @@ public interface SampleStream {
|
||||||
*/
|
*/
|
||||||
int readData(FormatHolder formatHolder, DecoderInputBuffer buffer);
|
int readData(FormatHolder formatHolder, DecoderInputBuffer buffer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempts to skip to the keyframe before the specified time.
|
||||||
|
*
|
||||||
|
* @param timeUs The specified time.
|
||||||
|
*/
|
||||||
|
void skipToKeyframeBefore(long timeUs);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -253,6 +253,11 @@ public final class SingleSampleMediaSource implements MediaPeriod, MediaSource,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void skipToKeyframeBefore(long timeUs) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
|
||||||
// Loader.Callback implementation.
|
// Loader.Callback implementation.
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -192,6 +192,11 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
|
||||||
return sampleQueue.readData(formatHolder, buffer, loadingFinished, lastSeekPositionUs);
|
return sampleQueue.readData(formatHolder, buffer, loadingFinished, lastSeekPositionUs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void skipToKeyframeBefore(long timeUs) {
|
||||||
|
sampleQueue.skipToKeyframeBefore(timeUs);
|
||||||
|
}
|
||||||
|
|
||||||
// Loader.Callback implementation.
|
// Loader.Callback implementation.
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -619,6 +619,11 @@ import java.util.List;
|
||||||
return HlsSampleStreamWrapper.this.readData(group, formatHolder, buffer);
|
return HlsSampleStreamWrapper.this.readData(group, formatHolder, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void skipToKeyframeBefore(long timeUs) {
|
||||||
|
sampleQueues.valueAt(group).skipToKeyframeBefore(timeUs);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -240,7 +240,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isReady() {
|
public boolean isReady() {
|
||||||
if (renderedFirstFrame && super.isReady()) {
|
if ((renderedFirstFrame || super.shouldInitCodec()) && super.isReady()) {
|
||||||
// Ready. If we were joining then we've now joined, so clear the joining deadline.
|
// Ready. If we were joining then we've now joined, so clear the joining deadline.
|
||||||
joiningDeadlineMs = -1;
|
joiningDeadlineMs = -1;
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue