Skip to content

Commit cf8b351

Browse files
committed
Revisit Step interface
1 parent c962703 commit cf8b351

File tree

15 files changed

+89
-93
lines changed

15 files changed

+89
-93
lines changed

lib/src/main/java/com/otaliastudios/transcoder/internal/audio/AudioEngine.kt

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,11 @@ import kotlin.math.floor
1919
* remixing, stretching. TODO: With some extra work this could be split in different steps.
2020
*/
2121
internal class AudioEngine(
22-
private val stretcher: AudioStretcher,
23-
private val resampler: AudioResampler,
24-
private val targetFormat: MediaFormat
22+
private val stretcher: AudioStretcher,
23+
private val resampler: AudioResampler,
24+
private val targetFormat: MediaFormat
2525
): QueuedStep<DecoderData, DecoderChannel, EncoderData, EncoderChannel>("AudioEngine"), DecoderChannel {
2626

27-
companion object {
28-
private val ID = AtomicInteger(0)
29-
}
30-
private val log = Logger("AudioEngine(${ID.getAndIncrement()})")
31-
3227
override val channel = this
3328
private val buffers = ShortBuffers()
3429

lib/src/main/java/com/otaliastudios/transcoder/internal/codec/Decoder.kt

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.otaliastudios.transcoder.internal.codec
33
import android.media.MediaCodec.*
44
import android.media.MediaFormat
55
import android.view.Surface
6+
import com.otaliastudios.transcoder.common.TrackType
67
import com.otaliastudios.transcoder.common.trackType
78
import com.otaliastudios.transcoder.internal.data.ReaderChannel
89
import com.otaliastudios.transcoder.internal.data.ReaderData
@@ -29,15 +30,15 @@ internal interface DecoderChannel : Channel {
2930
}
3031

3132
internal class Decoder(
32-
private val format: MediaFormat, // source.getTrackFormat(track)
33-
continuous: Boolean, // relevant if the source sends no-render chunks. should we compensate or not?
34-
) : QueuedStep<ReaderData, ReaderChannel, DecoderData, DecoderChannel>("Decoder"), ReaderChannel {
35-
36-
companion object {
37-
private val ID = trackMapOf(AtomicInteger(0), AtomicInteger(0))
33+
private val format: MediaFormat, // source.getTrackFormat(track)
34+
continuous: Boolean, // relevant if the source sends no-render chunks. should we compensate or not?
35+
) : QueuedStep<ReaderData, ReaderChannel, DecoderData, DecoderChannel>(
36+
when (format.trackType) {
37+
TrackType.VIDEO -> "VideoDecoder"
38+
TrackType.AUDIO -> "AudioDecoder"
3839
}
40+
), ReaderChannel {
3941

40-
private val log = Logger("Decoder(${format.trackType},${ID[format.trackType].getAndIncrement()})")
4142
override val channel = this
4243

4344
private val codec = createDecoderByType(format.getString(MediaFormat.KEY_MIME)!!)

lib/src/main/java/com/otaliastudios/transcoder/internal/codec/DecoderTimer.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ internal class DecoderTimerData(
1515
) : DecoderData(buffer, timeUs, release)
1616

1717
internal class DecoderTimer(
18-
private val track: TrackType,
19-
private val interpolator: TimeInterpolator,
18+
private val track: TrackType,
19+
private val interpolator: TimeInterpolator,
2020
) : TransformStep<DecoderData, DecoderChannel>("DecoderTimer") {
2121

2222
private var lastTimeUs: Long? = null
2323
private var lastRawTimeUs: Long? = null
2424

25-
override fun step(state: State.Ok<DecoderData>, fresh: Boolean): State<DecoderData> {
25+
override fun advance(state: State.Ok<DecoderData>): State<DecoderData> {
2626
if (state is State.Eos) return state
2727
require(state.value !is DecoderTimerData) {
2828
"Can't apply DecoderTimer twice."
@@ -42,11 +42,11 @@ internal class DecoderTimer(
4242
lastRawTimeUs = rawTimeUs
4343

4444
return State.Ok(DecoderTimerData(
45-
buffer = state.value.buffer,
46-
rawTimeUs = rawTimeUs,
47-
timeUs = timeUs,
48-
timeStretch = timeStretch,
49-
release = state.value.release
45+
buffer = state.value.buffer,
46+
rawTimeUs = rawTimeUs,
47+
timeUs = timeUs,
48+
timeStretch = timeStretch,
49+
release = state.value.release
5050
))
5151
}
5252
}

lib/src/main/java/com/otaliastudios/transcoder/internal/codec/Encoder.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,12 @@ internal class Encoder(
3636
override val surface: Surface?,
3737
ownsCodecStart: Boolean,
3838
private val ownsCodecStop: Boolean,
39-
) : QueuedStep<EncoderData, EncoderChannel, WriterData, WriterChannel>("Encoder"), EncoderChannel {
39+
) : QueuedStep<EncoderData, EncoderChannel, WriterData, WriterChannel>(
40+
when (surface) {
41+
null -> "AudioEncoder"
42+
else -> "VideoEncoder"
43+
}
44+
), EncoderChannel {
4045

4146
constructor(codecs: Codecs, type: TrackType) : this(
4247
codecs.encoders[type].first,
@@ -45,12 +50,7 @@ internal class Encoder(
4550
codecs.ownsEncoderStop[type]
4651
)
4752

48-
companion object {
49-
private val ID = trackMapOf(AtomicInteger(0), AtomicInteger(0))
50-
}
51-
5253
private val type = if (surface != null) TrackType.VIDEO else TrackType.AUDIO
53-
private val log = Logger("Encoder(${type},${ID[type].getAndIncrement()})")
5454
private var dequeuedInputs by observable(0) { _, _, _ -> printDequeued() }
5555
private var dequeuedOutputs by observable(0) { _, _, _ -> printDequeued() }
5656
private fun printDequeued() {

lib/src/main/java/com/otaliastudios/transcoder/internal/data/Bridge.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,16 @@ package com.otaliastudios.transcoder.internal.data
22

33
import android.media.MediaCodec
44
import android.media.MediaFormat
5+
import com.otaliastudios.transcoder.internal.pipeline.BaseStep
56
import com.otaliastudios.transcoder.internal.pipeline.State
67
import com.otaliastudios.transcoder.internal.pipeline.Step
78
import com.otaliastudios.transcoder.internal.utils.Logger
89
import java.nio.ByteBuffer
910
import java.nio.ByteOrder
1011

1112
internal class Bridge(private val format: MediaFormat)
12-
: Step<ReaderData, ReaderChannel, WriterData, WriterChannel>, ReaderChannel {
13+
: BaseStep<ReaderData, ReaderChannel, WriterData, WriterChannel>("Bridge"), ReaderChannel {
1314

14-
override val name: String = "Bridge"
15-
private val log = Logger("Bridge")
1615
private val bufferSize = format.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE)
1716
private val buffer = ByteBuffer.allocateDirect(bufferSize).order(ByteOrder.nativeOrder())
1817
override val channel = this
@@ -28,7 +27,7 @@ internal class Bridge(private val format: MediaFormat)
2827
}
2928

3029
// Can't do much about chunk.render, since we don't even decode.
31-
override fun step(state: State.Ok<ReaderData>, fresh: Boolean): State<WriterData> {
30+
override fun advance(state: State.Ok<ReaderData>): State<WriterData> {
3231
val (chunk, _) = state.value
3332
val flags = if (chunk.keyframe) MediaCodec.BUFFER_FLAG_SYNC_FRAME else 0
3433
val result = WriterData(chunk.buffer, chunk.timeUs, flags) {}

lib/src/main/java/com/otaliastudios/transcoder/internal/data/Reader.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,10 @@ internal interface ReaderChannel : Channel {
1616
}
1717

1818
internal class Reader(
19-
private val source: DataSource,
20-
private val track: TrackType
19+
private val source: DataSource,
20+
private val track: TrackType
2121
) : BaseStep<Unit, Channel, ReaderData, ReaderChannel>("Reader") {
2222

23-
private val log = Logger("Reader")
2423
override val channel = Channel
2524
private val chunk = DataSource.Chunk()
2625

@@ -35,7 +34,7 @@ internal class Reader(
3534
}
3635
}
3736

38-
override fun step(state: State.Ok<Unit>, fresh: Boolean): State<ReaderData> {
37+
override fun advance(state: State.Ok<Unit>): State<ReaderData> {
3938
return if (source.isDrained) {
4039
log.i("Source is drained! Returning Eos as soon as possible.")
4140
nextBufferOrWait { byteBuffer, id ->

lib/src/main/java/com/otaliastudios/transcoder/internal/data/ReaderTimer.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ internal class ReaderTimer(
99
private val track: TrackType,
1010
private val interpolator: TimeInterpolator
1111
) : TransformStep<ReaderData, ReaderChannel>("ReaderTimer") {
12-
override fun step(state: State.Ok<ReaderData>, fresh: Boolean): State<ReaderData> {
12+
override fun advance(state: State.Ok<ReaderData>): State<ReaderData> {
1313
if (state is State.Eos) return state
1414
state.value.chunk.timeUs = interpolator.interpolate(track, state.value.chunk.timeUs)
1515
return state

lib/src/main/java/com/otaliastudios/transcoder/internal/data/Seeker.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,16 @@ import com.otaliastudios.transcoder.source.DataSource
99
import java.nio.ByteBuffer
1010

1111
internal class Seeker(
12-
private val source: DataSource,
13-
positions: List<Long>,
14-
private val seek: (Long) -> Boolean
12+
private val source: DataSource,
13+
positions: List<Long>,
14+
private val seek: (Long) -> Boolean
1515
) : BaseStep<Unit, Channel, Unit, Channel>("Seeker") {
1616

17-
private val log = Logger("Seeker")
1817
override val channel = Channel
1918
private val positions = positions.toMutableList()
2019

21-
override fun step(state: State.Ok<Unit>, fresh: Boolean): State<Unit> {
22-
if (fresh && positions.isNotEmpty()) {
20+
override fun advance(state: State.Ok<Unit>): State<Unit> {
21+
if (positions.isNotEmpty()) {
2322
if (seek(positions.first())) {
2423
log.i("Seeking to next position ${positions.first()}")
2524
val next = positions.removeFirst()

lib/src/main/java/com/otaliastudios/transcoder/internal/data/Writer.kt

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.otaliastudios.transcoder.internal.data
33
import android.media.MediaCodec
44
import android.media.MediaFormat
55
import com.otaliastudios.transcoder.common.TrackType
6+
import com.otaliastudios.transcoder.internal.pipeline.BaseStep
67
import com.otaliastudios.transcoder.internal.pipeline.Channel
78
import com.otaliastudios.transcoder.internal.pipeline.State
89
import com.otaliastudios.transcoder.internal.pipeline.Step
@@ -22,22 +23,20 @@ internal interface WriterChannel : Channel {
2223
}
2324

2425
internal class Writer(
25-
private val sink: DataSink,
26-
private val track: TrackType
27-
) : Step<WriterData, WriterChannel, Unit, Channel>, WriterChannel {
26+
private val sink: DataSink,
27+
private val track: TrackType
28+
) : BaseStep<WriterData, WriterChannel, Unit, Channel>("Writer"), WriterChannel {
2829

2930
override val channel = this
30-
override val name: String = "Writer"
3131

32-
private val log = Logger("Writer")
3332
private val info = MediaCodec.BufferInfo()
3433

3534
override fun handleFormat(format: MediaFormat) {
3635
log.i("handleFormat($format)")
3736
sink.setTrackFormat(track, format)
3837
}
3938

40-
override fun step(state: State.Ok<WriterData>, fresh: Boolean): State<Unit> {
39+
override fun advance(state: State.Ok<WriterData>): State<Unit> {
4140
val (buffer, timestamp, flags) = state.value
4241
// Note: flags does NOT include BUFFER_FLAG_END_OF_STREAM. That's passed via State.Eos.
4342
val eos = state is State.Eos
@@ -49,10 +48,10 @@ internal class Writer(
4948
info.set(0, 0, 0, flags or MediaCodec.BUFFER_FLAG_END_OF_STREAM)
5049
} else {
5150
info.set(
52-
buffer.position(),
53-
buffer.remaining(),
54-
timestamp,
55-
flags
51+
buffer.position(),
52+
buffer.remaining(),
53+
timestamp,
54+
flags
5655
)
5756
}
5857
sink.writeTrack(track, buffer, info)

lib/src/main/java/com/otaliastudios/transcoder/internal/pipeline/Pipeline.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ internal class Pipeline private constructor(name: String, private val items: Lis
4848
// - caused failure in the previous run (i == previouslyFailedIndex, failure != null)
4949
// - run (with failure or success) then one of the items following it failed (i < previouslyFailedIndex, cached != null)
5050
log.v("${i+1}/${items.size} '${item.step.name}' START (${if (headFresh) "fresh" else "stale"})")
51-
item.set(item.step.step(headState, headFresh))
51+
// item.set(item.step.step(headState, headFresh))
5252
if (item.success != null) {
5353
log.v("${i+1}/${items.size} '${item.step.name}' SUCCESS ${if (item.success is State.Eos) "(eos)" else ""}")
5454
headState = item.success!!

0 commit comments

Comments
 (0)