Rabbit-R1/original r1/java/sources/org/webrtc/FileVideoCapturer.java
2024-05-21 17:08:36 -04:00

175 lines
6.7 KiB
Java

package org.webrtc;
import android.content.Context;
import android.os.SystemClock;
import com.google.android.exoplayer2.C;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;
/* loaded from: classes3.dex */
public class FileVideoCapturer implements VideoCapturer {
private static final String TAG = "FileVideoCapturer";
private CapturerObserver capturerObserver;
private final VideoReader videoReader;
private final Timer timer = new Timer();
private final TimerTask tickTask = new TimerTask() { // from class: org.webrtc.FileVideoCapturer.1
@Override // java.util.TimerTask, java.lang.Runnable
public void run() {
FileVideoCapturer.this.tick();
}
};
/* JADX INFO: Access modifiers changed from: private */
/* loaded from: classes3.dex */
public interface VideoReader {
void close();
VideoFrame getNextFrame();
}
@Override // org.webrtc.VideoCapturer
public void changeCaptureFormat(int i, int i2, int i3) {
}
@Override // org.webrtc.VideoCapturer
public void initialize(SurfaceTextureHelper surfaceTextureHelper, Context context, CapturerObserver capturerObserver) {
this.capturerObserver = capturerObserver;
}
@Override // org.webrtc.VideoCapturer
public boolean isScreencast() {
return false;
}
/* loaded from: classes3.dex */
private static class VideoReaderY4M implements VideoReader {
private static final int FRAME_DELIMETER_LENGTH = 6;
private static final String TAG = "VideoReaderY4M";
private static final String Y4M_FRAME_DELIMETER = "FRAME";
private final int frameHeight;
private final int frameWidth;
private final RandomAccessFile mediaFile;
private final FileChannel mediaFileChannel;
private final long videoStart;
public VideoReaderY4M(String str) throws IOException {
RandomAccessFile randomAccessFile = new RandomAccessFile(str, "r");
this.mediaFile = randomAccessFile;
this.mediaFileChannel = randomAccessFile.getChannel();
StringBuilder sb = new StringBuilder();
while (true) {
int read = this.mediaFile.read();
if (read == -1) {
throw new RuntimeException("Found end of file before end of header for file: " + str);
}
if (read != 10) {
sb.append((char) read);
} else {
this.videoStart = this.mediaFileChannel.position();
String str2 = "";
int i = 0;
int i2 = 0;
for (String str3 : sb.toString().split("[ ]")) {
char charAt = str3.charAt(0);
if (charAt == 'C') {
str2 = str3.substring(1);
} else if (charAt == 'H') {
i2 = Integer.parseInt(str3.substring(1));
} else if (charAt == 'W') {
i = Integer.parseInt(str3.substring(1));
}
}
Logging.d(TAG, "Color space: " + str2);
if (!str2.equals("420") && !str2.equals("420mpeg2")) {
throw new IllegalArgumentException("Does not support any other color space than I420 or I420mpeg2");
}
if (i % 2 == 1 || i2 % 2 == 1) {
throw new IllegalArgumentException("Does not support odd width or height");
}
this.frameWidth = i;
this.frameHeight = i2;
Logging.d(TAG, "frame dim: (" + i + ", " + i2 + ")");
return;
}
}
}
@Override // org.webrtc.FileVideoCapturer.VideoReader
public VideoFrame getNextFrame() {
long nanos = TimeUnit.MILLISECONDS.toNanos(SystemClock.elapsedRealtime());
JavaI420Buffer allocate = JavaI420Buffer.allocate(this.frameWidth, this.frameHeight);
ByteBuffer dataY = allocate.getDataY();
ByteBuffer dataU = allocate.getDataU();
ByteBuffer dataV = allocate.getDataV();
int i = (this.frameHeight + 1) / 2;
allocate.getStrideY();
allocate.getStrideU();
allocate.getStrideV();
try {
int i2 = FRAME_DELIMETER_LENGTH;
ByteBuffer allocate2 = ByteBuffer.allocate(i2);
if (this.mediaFileChannel.read(allocate2) < i2) {
this.mediaFileChannel.position(this.videoStart);
if (this.mediaFileChannel.read(allocate2) < i2) {
throw new RuntimeException("Error looping video");
}
}
String str = new String(allocate2.array(), Charset.forName(C.ASCII_NAME));
if (!str.equals("FRAME\n")) {
throw new RuntimeException("Frames should be delimited by FRAME plus newline, found delimter was: '" + str + "'");
}
this.mediaFileChannel.read(dataY);
this.mediaFileChannel.read(dataU);
this.mediaFileChannel.read(dataV);
return new VideoFrame(allocate, 0, nanos);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override // org.webrtc.FileVideoCapturer.VideoReader
public void close() {
try {
this.mediaFile.close();
} catch (IOException e) {
Logging.e(TAG, "Problem closing file", e);
}
}
}
public FileVideoCapturer(String str) throws IOException {
try {
this.videoReader = new VideoReaderY4M(str);
} catch (IOException e) {
Logging.d(TAG, "Could not open video file: " + str);
throw e;
}
}
public void tick() {
VideoFrame nextFrame = this.videoReader.getNextFrame();
this.capturerObserver.onFrameCaptured(nextFrame);
nextFrame.release();
}
@Override // org.webrtc.VideoCapturer
public void startCapture(int i, int i2, int i3) {
this.timer.schedule(this.tickTask, 0L, 1000 / i3);
}
@Override // org.webrtc.VideoCapturer
public void stopCapture() throws InterruptedException {
this.timer.cancel();
}
@Override // org.webrtc.VideoCapturer
public void dispose() {
this.videoReader.close();
}
}