Skip to content

Commit

Permalink
Allow bypassing of decoder rate limiting
Browse files Browse the repository at this point in the history
  • Loading branch information
ultraq committed Feb 3, 2024
1 parent e48fe28 commit 7e2b224
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 57 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ import nz.net.ultraq.redhorizon.filetypes.io.NativeDataInputStream
import org.slf4j.Logger
import org.slf4j.LoggerFactory

import groovy.transform.TupleConstructor
import java.nio.ByteBuffer
import java.util.concurrent.Executors

/**
* Implementation of the AUD files used in Red Alert and Tiberium Dawn. An AUD
Expand Down Expand Up @@ -98,19 +98,13 @@ class AudFile implements SoundFile, Streaming {
@Override
ByteBuffer getSoundData() {

return ByteBuffer.fromBuffers(
Executors.newSingleThreadExecutor().executeAndShutdown { executorService ->
def worker = streamingDecoder
def samples = []
worker.on(StreamingSampleEvent) { event ->
samples << event.sample
}
executorService
.submit(worker)
.get()
return samples as ByteBuffer[]
}
)
var decoder = new AudFileDecoder()
var samples = []
decoder.on(StreamingSampleEvent) { event ->
samples << event.sample
}
decoder.run()
return ByteBuffer.fromBuffers(samples as ByteBuffer[])
}

/**
Expand All @@ -120,7 +114,7 @@ class AudFile implements SoundFile, Streaming {
@Override
StreamingDecoder getStreamingDecoder() {

return new StreamingDecoder(new AudFileDecoder())
return new StreamingDecoder(new AudFileDecoder(true))
}

@Override
Expand All @@ -145,8 +139,11 @@ class AudFile implements SoundFile, Streaming {
/**
* Decode AUD file sound data and emit as {@link StreamingSampleEvent}s.
*/
@TupleConstructor
class AudFileDecoder implements Runnable, EventTarget {

final boolean rateLimit

@Override
void run() {

Expand All @@ -172,7 +169,10 @@ class AudFile implements SoundFile, Streaming {
)
}
trigger(new StreamingSampleEvent(sample))
Thread.sleep(20)

if (rateLimit) {
Thread.sleep(20)
}
}

logger.debug('Decoding complete')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@ import org.slf4j.LoggerFactory

import groovy.transform.CompileStatic
import java.nio.ByteBuffer
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors

/**
* Implementation of a VQA file, which is the video format used in Red Alert and
Expand Down Expand Up @@ -174,35 +172,25 @@ class VqaFile implements VideoFile {
@Override
ByteBuffer[] getFrameData() {

return Executors.newSingleThreadExecutor().executeAndShutdown { executorService ->
def frames = []
def worker = streamingDecoder
worker.on(StreamingFrameEvent) { event ->
frames << event.frame
}
executorService
.submit(worker)
.get()
return frames
var decoder = new VqaFileDecoder()
var frames = []
decoder.on(StreamingFrameEvent) { event ->
frames << event.frame
}
decoder.run()
return ByteBuffer.fromBuffers(frames as ByteBuffer[])
}

@Override
ByteBuffer getSoundData() {

return ByteBuffer.fromBuffers(
Executors.newSingleThreadExecutor().executeAndShutdown { ExecutorService executorService ->
def samples = []
def worker = streamingDecoder
worker.on(StreamingSampleEvent) { event ->
samples << event.sample
}
executorService
.submit(worker)
.get()
return ByteBuffer.fromBuffers(samples as ByteBuffer[])
}
)
var decoder = new VqaFileDecoder()
var samples = []
decoder.on(StreamingSampleEvent) { event ->
samples << event.sample
}
decoder.run()
return ByteBuffer.fromBuffers(samples as ByteBuffer[])
}

/**
Expand All @@ -213,7 +201,7 @@ class VqaFile implements VideoFile {
@Override
StreamingDecoder getStreamingDecoder() {

return new StreamingDecoder(new VqaFileDecoder())
return new StreamingDecoder(new VqaFileDecoder(true))
}

/**
Expand All @@ -237,6 +225,8 @@ class VqaFile implements VideoFile {
*/
class VqaFileDecoder implements Runnable, EventTarget {

final boolean rateLimit

private final LCW lcw = new LCW()
private final Decoder audioDecoder

Expand All @@ -249,7 +239,9 @@ class VqaFile implements VideoFile {
/**
* Constructor, create a new worker for decoding the VQA video data.
*/
VqaFileDecoder() {
VqaFileDecoder(boolean rateLimit = false) {

this.rateLimit = rateLimit

audioDecoder = bits == 16 ? new IMAADPCM16bit() : new WSADPCM8bit()

Expand Down Expand Up @@ -435,7 +427,10 @@ class VqaFile implements VideoFile {
}

discardNullByte()
Thread.sleep(25)

if (rateLimit) {
Thread.sleep(25)
}
}

logger.debug('Decoding complete')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ import nz.net.ultraq.redhorizon.filetypes.io.NativeDataInputStream
import org.slf4j.Logger
import org.slf4j.LoggerFactory

import groovy.transform.TupleConstructor
import java.nio.ByteBuffer
import java.util.concurrent.Executors

/**
* Implementation of the WSA file format as used in Tiberium Dawn and Red Alert.
Expand Down Expand Up @@ -116,17 +116,13 @@ class WsaFile implements AnimationFile, Streaming {
@Override
ByteBuffer[] getFrameData() {

return Executors.newSingleThreadExecutor().executeAndShutdown { executorService ->
def frames = []
def worker = streamingDecoder
worker.on(StreamingFrameEvent) { event ->
frames << event.frame
}
executorService
.submit(worker)
.get()
return frames
var decoder = new WsaFileDecoder()
var frames = []
decoder.on(StreamingFrameEvent) { event ->
frames << event.frame
}
decoder.run()
return frames as ByteBuffer[]
}

/**
Expand All @@ -137,7 +133,7 @@ class WsaFile implements AnimationFile, Streaming {
@Override
StreamingDecoder getStreamingDecoder() {

return new StreamingDecoder(new WsaFileDecoder())
return new StreamingDecoder(new WsaFileDecoder(true))
}

/**
Expand All @@ -157,8 +153,11 @@ class WsaFile implements AnimationFile, Streaming {
/**
* Decode WSA file frame data and emit as {@link StreamingFrameEvent}s.
*/
@TupleConstructor
class WsaFileDecoder implements Runnable, EventTarget {

final boolean rateLimit

@Override
void run() {

Expand All @@ -184,7 +183,10 @@ class WsaFile implements AnimationFile, Streaming {
}
trigger(new StreamingFrameEvent(colouredFrame))
frame++
Thread.sleep(50)

if (rateLimit) {
Thread.sleep(50)
}
}

logger.debug('Decoding complete')
Expand Down

0 comments on commit 7e2b224

Please sign in to comment.