mirror of
https://github.com/collinsmith/riiablo.git
synced 2025-07-09 23:38:15 +07:00
Created AudioPacket and basic executor
This commit is contained in:
34
core/src/com/riiablo/video/AudioPacket.java
Normal file
34
core/src/com/riiablo/video/AudioPacket.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
@ -2,6 +2,7 @@ package com.riiablo.video;
|
|||||||
|
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.ByteBufUtil;
|
import io.netty.buffer.ByteBufUtil;
|
||||||
|
import java.util.List;
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
|
|
||||||
import com.badlogic.gdx.audio.AudioDevice;
|
import com.badlogic.gdx.audio.AudioDevice;
|
||||||
@ -152,7 +153,8 @@ public class BIK {
|
|||||||
return numTracks;
|
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 boolean keyframe = (offsets[frame] & 1) == 1;
|
||||||
final int offset = offsets[frame] & ~1;
|
final int offset = offsets[frame] & ~1;
|
||||||
log.tracef("offset: +%x, keyframe: %s", offset, keyframe);
|
log.tracef("offset: +%x, keyframe: %s", offset, keyframe);
|
||||||
@ -162,17 +164,14 @@ public class BIK {
|
|||||||
for (int i = 0, s = numTracks; i < s; i++) {
|
for (int i = 0, s = numTracks; i < s; i++) {
|
||||||
try {
|
try {
|
||||||
MDC.put("track", i);
|
MDC.put("track", i);
|
||||||
|
final BinkAudio track = tracks[i];
|
||||||
final int packetSize = in.readSafe32u();
|
final int packetSize = in.readSafe32u();
|
||||||
log.trace("packetSize: {} bytes", packetSize);
|
log.trace("packetSize: {} bytes", packetSize);
|
||||||
|
|
||||||
final ByteInput audioPacket = in.readSlice(packetSize);
|
final ByteInput audioPacket = in.readSlice(packetSize);
|
||||||
System.out.println(ByteBufUtil.prettyHexDump(audioPacket.buffer()));
|
System.out.println(ByteBufUtil.prettyHexDump(audioPacket.buffer()));
|
||||||
final int numSamples = audioPacket.readSafe32u();
|
final AudioPacket packet = new AudioPacket(track, in, device, out);
|
||||||
log.trace("numSamples: {}", numSamples);
|
audioPackets.add(packet);
|
||||||
|
|
||||||
// BinkAudio track = tracks[i];
|
|
||||||
// track.decode(audioPacket.unalign(), out);
|
|
||||||
// audio[i].writeSamples(out[0], 0, numSamples);
|
|
||||||
|
|
||||||
log.trace("bytesRemaining: {} bytes", audioPacket.bytesRemaining());
|
log.trace("bytesRemaining: {} bytes", audioPacket.bytesRemaining());
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -1,16 +1,25 @@
|
|||||||
package com.riiablo.video;
|
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.Gdx;
|
||||||
import com.badlogic.gdx.audio.AudioDevice;
|
import com.badlogic.gdx.audio.AudioDevice;
|
||||||
import com.badlogic.gdx.graphics.g2d.Batch;
|
import com.badlogic.gdx.graphics.g2d.Batch;
|
||||||
import com.badlogic.gdx.utils.Disposable;
|
import com.badlogic.gdx.utils.Disposable;
|
||||||
|
|
||||||
public class VideoPlayer implements Disposable {
|
public class VideoPlayer implements Disposable {
|
||||||
|
private List<AudioPacket> audioPackets;
|
||||||
|
|
||||||
private BIK bik;
|
private BIK bik;
|
||||||
private AudioDevice[] audio;
|
private AudioDevice[] audio;
|
||||||
private float[][][] out;
|
private float[][][] out;
|
||||||
private int frame;
|
private int frame;
|
||||||
private float time, nextFrame;
|
private float time, nextFrame;
|
||||||
|
private ExecutorService audioStreams;
|
||||||
|
|
||||||
public VideoPlayer() {
|
public VideoPlayer() {
|
||||||
|
|
||||||
@ -22,12 +31,22 @@ public class VideoPlayer implements Disposable {
|
|||||||
}
|
}
|
||||||
this.bik = bik;
|
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];
|
audio = new AudioDevice[bik.numTracks];
|
||||||
out = new float[bik.numTracks][][];
|
out = new float[bik.numTracks][][];
|
||||||
for (int i = 0, s = bik.numTracks; i < s; i++) {
|
for (int i = 0, s = bik.numTracks; i < s; i++) {
|
||||||
final BinkAudio track = bik.track(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, track.isMono());
|
||||||
final AudioDevice device = audio[i] = Gdx.audio.newAudioDevice(track.sampleRate, true);
|
|
||||||
device.setVolume(0.10f);
|
device.setVolume(0.10f);
|
||||||
out[i] = track.createOut();
|
out[i] = track.createOut();
|
||||||
}
|
}
|
||||||
@ -41,7 +60,10 @@ public class VideoPlayer implements Disposable {
|
|||||||
time += delta;
|
time += delta;
|
||||||
if (time > nextFrame) {
|
if (time > nextFrame) {
|
||||||
nextFrame += bik.delta;
|
nextFrame += bik.delta;
|
||||||
bik.decode(frame++, audio, out[0]);
|
bik.decode(frame++, audioPackets, audio[0], out[0]);
|
||||||
|
for (AudioPacket audioPacket : audioPackets) {
|
||||||
|
audioStreams.submit(audioPacket);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user