Created AudioPacket and basic executor

This commit is contained in:
collinsmith
2020-10-06 10:55:04 -07:00
parent 3803abb02b
commit be2e0d005c
3 changed files with 65 additions and 10 deletions

View File

@ -0,0 +1,34 @@
package com.riiablo.video;
import com.badlogic.gdx.audio.AudioDevice;
import com.riiablo.io.BitInput;
import com.riiablo.io.ByteInput;
import com.riiablo.logger.LogManager;
import com.riiablo.logger.Logger;
class AudioPacket implements Runnable {
private static final Logger log = LogManager.getLogger(AudioPacket.class);
final BinkAudio track;
final BitInput bits;
final int numSamples;
final AudioDevice device;
final float[][] out;
public AudioPacket(BinkAudio track, ByteInput in, AudioDevice device, float[][] out) {
this.track = track;
this.numSamples = in.readSafe32u();
this.bits = in.unalign();
this.device = device;
this.out = out;
log.trace("numSamples: {}", numSamples);
track.decode(bits, out);
}
@Override
public void run() {
device.writeSamples(out[0], 0, numSamples);
}
}

View File

@ -2,6 +2,7 @@ package com.riiablo.video;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import java.util.List;
import org.apache.commons.io.FileUtils;
import com.badlogic.gdx.audio.AudioDevice;
@ -152,7 +153,8 @@ public class BIK {
return numTracks;
}
void decode(int frame, AudioDevice[] audio, float[][] out) {
void decode(int frame, List<AudioPacket> audioPackets, AudioDevice device, float[][] out) {
audioPackets.clear();
final boolean keyframe = (offsets[frame] & 1) == 1;
final int offset = offsets[frame] & ~1;
log.tracef("offset: +%x, keyframe: %s", offset, keyframe);
@ -162,17 +164,14 @@ public class BIK {
for (int i = 0, s = numTracks; i < s; i++) {
try {
MDC.put("track", i);
final BinkAudio track = tracks[i];
final int packetSize = in.readSafe32u();
log.trace("packetSize: {} bytes", packetSize);
final ByteInput audioPacket = in.readSlice(packetSize);
System.out.println(ByteBufUtil.prettyHexDump(audioPacket.buffer()));
final int numSamples = audioPacket.readSafe32u();
log.trace("numSamples: {}", numSamples);
// BinkAudio track = tracks[i];
// track.decode(audioPacket.unalign(), out);
// audio[i].writeSamples(out[0], 0, numSamples);
final AudioPacket packet = new AudioPacket(track, in, device, out);
audioPackets.add(packet);
log.trace("bytesRemaining: {} bytes", audioPacket.bytesRemaining());
} finally {

View File

@ -1,16 +1,25 @@
package com.riiablo.video;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.audio.AudioDevice;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.utils.Disposable;
public class VideoPlayer implements Disposable {
private List<AudioPacket> audioPackets;
private BIK bik;
private AudioDevice[] audio;
private float[][][] out;
private int frame;
private float time, nextFrame;
private ExecutorService audioStreams;
public VideoPlayer() {
@ -22,12 +31,22 @@ public class VideoPlayer implements Disposable {
}
this.bik = bik;
audioPackets = new ArrayList<>(bik.numTracks);
audioStreams = Executors.newFixedThreadPool(bik.numTracks, new ThreadFactory() {
int i = 0;
@Override
public Thread newThread(Runnable r) {
final Thread t = new Thread(r);
t.setName("VideoPlayer-" + i++);
return t;
}
});
audio = new AudioDevice[bik.numTracks];
out = new float[bik.numTracks][][];
for (int i = 0, s = bik.numTracks; i < s; i++) {
final BinkAudio track = bik.track(i);
// final AudioDevice device = audio[i] = Gdx.audio.newAudioDevice(track.sampleRate, track.isMono());
final AudioDevice device = audio[i] = Gdx.audio.newAudioDevice(track.sampleRate, true);
final AudioDevice device = audio[i] = Gdx.audio.newAudioDevice(track.sampleRate, track.isMono());
device.setVolume(0.10f);
out[i] = track.createOut();
}
@ -41,7 +60,10 @@ public class VideoPlayer implements Disposable {
time += delta;
if (time > nextFrame) {
nextFrame += bik.delta;
bik.decode(frame++, audio, out[0]);
bik.decode(frame++, audioPackets, audio[0], out[0]);
for (AudioPacket audioPacket : audioPackets) {
audioStreams.submit(audioPacket);
}
}
}