Clean up BitmapFactoryVideoRenderer
This commit is contained in:
parent
b520b26f0f
commit
9d88db7119
@ -24,17 +24,22 @@ import java.nio.ByteBuffer;
|
||||
|
||||
public class BitmapFactoryVideoRenderer extends BaseRenderer {
|
||||
private static final String TAG = "BitmapFactoryRenderer";
|
||||
final VideoRendererEventListener.EventDispatcher eventDispatcher;
|
||||
@Nullable
|
||||
volatile Surface surface;
|
||||
private static int threadId;
|
||||
|
||||
private final Rect rect = new Rect();
|
||||
private final Point lastSurface = new Point();
|
||||
private final RenderRunnable renderRunnable = new RenderRunnable();
|
||||
private final Thread thread = new Thread(renderRunnable, "BitmapFactoryVideoRenderer");
|
||||
|
||||
final VideoRendererEventListener.EventDispatcher eventDispatcher;
|
||||
final Thread thread = new Thread(renderRunnable, getClass().getSimpleName() + threadId++);
|
||||
|
||||
@Nullable
|
||||
volatile Surface surface;
|
||||
|
||||
private VideoSize lastVideoSize = VideoSize.UNKNOWN;
|
||||
private long currentTimeUs;
|
||||
private long frameUs;
|
||||
boolean ended;
|
||||
private boolean firstFrameRendered;
|
||||
@Nullable
|
||||
private DecoderCounters decoderCounters;
|
||||
|
||||
@ -60,8 +65,7 @@ public class BitmapFactoryVideoRenderer extends BaseRenderer {
|
||||
|
||||
@Override
|
||||
protected void onDisabled() {
|
||||
renderRunnable.running = false;
|
||||
thread.interrupt();
|
||||
renderRunnable.stop();
|
||||
|
||||
@Nullable
|
||||
final DecoderCounters decoderCounters = this.decoderCounters;
|
||||
@ -111,7 +115,7 @@ public class BitmapFactoryVideoRenderer extends BaseRenderer {
|
||||
|
||||
@Override
|
||||
public boolean isEnded() {
|
||||
return renderRunnable.ended;
|
||||
return renderRunnable.isEnded();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -123,32 +127,9 @@ public class BitmapFactoryVideoRenderer extends BaseRenderer {
|
||||
return RendererCapabilities.create(C.FORMAT_UNSUPPORTED_TYPE);
|
||||
}
|
||||
|
||||
class RenderRunnable implements Runnable {
|
||||
private volatile boolean ended;
|
||||
private boolean firstFrameRendered;
|
||||
private volatile boolean running = true;
|
||||
|
||||
void renderBitmap(final Bitmap bitmap) {
|
||||
@Nullable
|
||||
private Bitmap decodeInputBuffer(final DecoderInputBuffer decoderInputBuffer) {
|
||||
@Nullable final ByteBuffer byteBuffer = decoderInputBuffer.data;
|
||||
if (byteBuffer != null) {
|
||||
final Bitmap bitmap;
|
||||
try {
|
||||
bitmap = BitmapFactory.decodeByteArray(byteBuffer.array(), byteBuffer.arrayOffset(),
|
||||
byteBuffer.arrayOffset() + byteBuffer.position());
|
||||
if (bitmap == null) {
|
||||
eventDispatcher.videoCodecError(new NullPointerException("Decode bytes failed"));
|
||||
} else {
|
||||
return bitmap;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
eventDispatcher.videoCodecError(e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void renderBitmap(final Bitmap bitmap, @Nullable final Surface surface) {
|
||||
final Surface surface = this.surface;
|
||||
if (surface == null) {
|
||||
return;
|
||||
}
|
||||
@ -192,6 +173,41 @@ public class BitmapFactoryVideoRenderer extends BaseRenderer {
|
||||
}
|
||||
}
|
||||
|
||||
class RenderRunnable implements Runnable {
|
||||
final DecoderInputBuffer decoderInputBuffer =
|
||||
new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL);
|
||||
|
||||
private volatile boolean running = true;
|
||||
|
||||
void stop() {
|
||||
running = false;
|
||||
thread.interrupt();
|
||||
}
|
||||
|
||||
boolean isEnded() {
|
||||
return !running || decoderInputBuffer.isEndOfStream();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private Bitmap decodeInputBuffer(final DecoderInputBuffer decoderInputBuffer) {
|
||||
@Nullable final ByteBuffer byteBuffer = decoderInputBuffer.data;
|
||||
if (byteBuffer != null) {
|
||||
final Bitmap bitmap;
|
||||
try {
|
||||
bitmap = BitmapFactory.decodeByteArray(byteBuffer.array(), byteBuffer.arrayOffset(),
|
||||
byteBuffer.arrayOffset() + byteBuffer.position());
|
||||
if (bitmap == null) {
|
||||
eventDispatcher.videoCodecError(new NullPointerException("Decode bytes failed"));
|
||||
} else {
|
||||
return bitmap;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
eventDispatcher.videoCodecError(e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return true if interrupted
|
||||
@ -210,9 +226,6 @@ public class BitmapFactoryVideoRenderer extends BaseRenderer {
|
||||
|
||||
public void run() {
|
||||
final FormatHolder formatHolder = getFormatHolder();
|
||||
@NonNull
|
||||
final DecoderInputBuffer decoderInputBuffer =
|
||||
new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL);
|
||||
long start = SystemClock.uptimeMillis();
|
||||
main:
|
||||
while (running) {
|
||||
@ -221,10 +234,8 @@ public class BitmapFactoryVideoRenderer extends BaseRenderer {
|
||||
formatHolder.format == null ? SampleStream.FLAG_REQUIRE_FORMAT : 0);
|
||||
if (result == C.RESULT_BUFFER_READ) {
|
||||
if (decoderInputBuffer.isEndOfStream()) {
|
||||
ended = true;
|
||||
if (!sleep()) {
|
||||
ended = false;
|
||||
}
|
||||
//Wait for shutdown or stream to be changed
|
||||
sleep();
|
||||
continue;
|
||||
}
|
||||
final long leadUs = decoderInputBuffer.timeUs - currentTimeUs;
|
||||
@ -244,17 +255,17 @@ public class BitmapFactoryVideoRenderer extends BaseRenderer {
|
||||
while (currentTimeUs < decoderInputBuffer.timeUs) {
|
||||
//Log.d(TAG, "Sleep: us=" + currentTimeUs);
|
||||
if (sleep()) {
|
||||
//Sleep was interrupted, discard Bitmap
|
||||
continue main;
|
||||
}
|
||||
}
|
||||
if (running) {
|
||||
renderBitmap(bitmap, surface);
|
||||
renderBitmap(bitmap);
|
||||
}
|
||||
} else if (result == C.RESULT_FORMAT_READ) {
|
||||
onFormatChanged(formatHolder);
|
||||
}
|
||||
}
|
||||
ended = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user