Skip to content

Commit b784e6b

Browse files
committed
Fix Trim initialization
1 parent b82539d commit b784e6b

File tree

7 files changed

+40
-23
lines changed

7 files changed

+40
-23
lines changed

demo/src/main/java/com/otaliastudios/transcoder/demo/TranscoderActivity.java

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import android.net.Uri;
77
import android.os.Bundle;
88
import android.os.SystemClock;
9+
import android.provider.MediaStore;
910
import android.text.Editable;
1011
import android.text.TextWatcher;
1112
import android.widget.EditText;
@@ -20,8 +21,6 @@
2021
import com.otaliastudios.transcoder.common.TrackStatus;
2122
import com.otaliastudios.transcoder.common.TrackType;
2223
import com.otaliastudios.transcoder.internal.utils.Logger;
23-
import com.otaliastudios.transcoder.sink.DataSink;
24-
import com.otaliastudios.transcoder.sink.DefaultDataSink;
2524
import com.otaliastudios.transcoder.source.DataSource;
2625
import com.otaliastudios.transcoder.source.TrimDataSource;
2726
import com.otaliastudios.transcoder.source.UriDataSource;
@@ -108,9 +107,10 @@ protected void onCreate(Bundle savedInstanceState) {
108107
mButtonView = findViewById(R.id.button);
109108
mButtonView.setOnClickListener(v -> {
110109
if (!mIsTranscoding) {
111-
startActivityForResult(new Intent(Intent.ACTION_GET_CONTENT)
112-
.setType("video/*")
113-
.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true), REQUEST_CODE_PICK);
110+
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
111+
.setDataAndType(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, "video/*")
112+
.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
113+
startActivityForResult(intent, REQUEST_CODE_PICK);
114114
} else {
115115
mTranscodeFuture.cancel(true);
116116
}
@@ -239,17 +239,17 @@ protected void onActivityResult(int requestCode, int resultCode, final Intent da
239239
if (requestCode == REQUEST_CODE_PICK
240240
&& resultCode == RESULT_OK
241241
&& data != null) {
242-
if (data.getData() != null) {
243-
mTranscodeInputUri1 = data.getData();
244-
mTranscodeInputUri2 = null;
245-
mTranscodeInputUri3 = null;
246-
transcode();
247-
} else if (data.getClipData() != null) {
242+
if (data.getClipData() != null) {
248243
ClipData clipData = data.getClipData();
249244
mTranscodeInputUri1 = clipData.getItemAt(0).getUri();
250245
mTranscodeInputUri2 = clipData.getItemCount() >= 2 ? clipData.getItemAt(1).getUri() : null;
251246
mTranscodeInputUri3 = clipData.getItemCount() >= 3 ? clipData.getItemAt(2).getUri() : null;
252247
transcode();
248+
} else if (data.getData() != null) {
249+
mTranscodeInputUri1 = data.getData();
250+
mTranscodeInputUri2 = null;
251+
mTranscodeInputUri3 = null;
252+
transcode();
253253
}
254254
}
255255
if (requestCode == REQUEST_CODE_PICK_AUDIO
@@ -294,9 +294,8 @@ private void transcode() {
294294
// Launch the transcoding operation.
295295
mTranscodeStartTime = SystemClock.uptimeMillis();
296296
setIsTranscoding(true);
297-
DataSink sink = new DefaultDataSink(mTranscodeOutputFile.getAbsolutePath());
298297
LOG.e("Building transcoding options...");
299-
TranscoderOptions.Builder builder = Transcoder.into(sink);
298+
TranscoderOptions.Builder builder = Transcoder.into(mTranscodeOutputFile.getAbsolutePath());
300299
if (mAudioReplacementUri == null) {
301300
if (mTranscodeInputUri1 != null) {
302301
DataSource source = new UriDataSource(this, mTranscodeInputUri1);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ internal class Encoder(
8282
State.Wait
8383
}
8484
INFO_OUTPUT_FORMAT_CHANGED -> {
85+
log.i("INFO_OUTPUT_FORMAT_CHANGED! format=${codec.outputFormat}")
8586
next.handleFormat(codec.outputFormat)
8687
State.Retry
8788
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ import android.media.MediaCodec
44
import android.media.MediaFormat
55
import com.otaliastudios.transcoder.internal.pipeline.State
66
import com.otaliastudios.transcoder.internal.pipeline.Step
7+
import com.otaliastudios.transcoder.internal.utils.Logger
78
import java.nio.ByteBuffer
89
import java.nio.ByteOrder
910

1011
internal class Bridge(private val format: MediaFormat)
1112
: Step<ReaderData, ReaderChannel, WriterData, WriterChannel>, ReaderChannel {
1213

14+
private val log = Logger("Bridge")
1315
private val bufferSize = format.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE)
1416
private val buffer = ByteBuffer.allocateDirect(bufferSize).order(ByteOrder.nativeOrder())
1517
override val channel = this
@@ -20,6 +22,7 @@ internal class Bridge(private val format: MediaFormat)
2022
}
2123

2224
override fun initialize(next: WriterChannel) {
25+
log.i("initialize(): format=$format")
2326
next.handleFormat(format)
2427
}
2528

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.otaliastudios.transcoder.common.TrackType
66
import com.otaliastudios.transcoder.internal.pipeline.Channel
77
import com.otaliastudios.transcoder.internal.pipeline.State
88
import com.otaliastudios.transcoder.internal.pipeline.Step
9+
import com.otaliastudios.transcoder.internal.utils.Logger
910
import com.otaliastudios.transcoder.sink.DataSink
1011
import java.nio.ByteBuffer
1112

@@ -27,9 +28,11 @@ internal class Writer(
2728

2829
override val channel = this
2930

31+
private val log = Logger("Writer")
3032
private val info = MediaCodec.BufferInfo()
3133

3234
override fun handleFormat(format: MediaFormat) {
35+
log.i("handleFormat($format)")
3336
sink.setTrackFormat(track, format)
3437
}
3538

lib/src/main/java/com/otaliastudios/transcoder/sink/DefaultDataSink.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ public void setTrackStatus(@NonNull TrackType type, @NonNull TrackStatus status)
111111

112112
@Override
113113
public void setTrackFormat(@NonNull TrackType type, @NonNull MediaFormat format) {
114+
LOG.i("setTrackFormat(" + type + ") format=" + format);
114115
boolean shouldValidate = mStatus.get(type) == TrackStatus.COMPRESSING;
115116
if (shouldValidate) {
116117
mMuxerChecks.checkOutputFormat(type, format);

lib/src/main/java/com/otaliastudios/transcoder/source/DataSourceWrapper.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010

1111
/**
1212
* A {@link DataSource} wrapper that simply delegates all methods to the
13-
* wrapped source.
13+
* wrapped source. It is the implementor responsibility to care about the case where
14+
* the wrapped source is already initialized, in case they are overriding initialize.
1415
*/
1516
public class DataSourceWrapper implements DataSource {
1617

@@ -90,7 +91,10 @@ public boolean isInitialized() {
9091

9192
@Override
9293
public void initialize() {
93-
mSource.initialize();
94+
// Make it easier for subclasses to put their logic in initialize safely.
95+
if (!mSource.isInitialized()) {
96+
mSource.initialize();
97+
}
9498
}
9599

96100
@Override

lib/src/main/java/com/otaliastudios/transcoder/source/TrimDataSource.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ public class TrimDataSource extends DataSourceWrapper {
1515
private final long trimStartUs;
1616
private final long trimEndUs;
1717

18-
private long extraDurationUs;
19-
private long trimDurationUs;
18+
private long extraDurationUs = 0;
19+
private long trimDurationUs = Long.MIN_VALUE;
2020
private boolean trimDone = false;
2121

2222
@SuppressWarnings("WeakerAccess")
@@ -34,6 +34,18 @@ public TrimDataSource(@NonNull DataSource source, long trimStartUs, long trimEnd
3434
this.trimEndUs = trimEndUs;
3535
}
3636

37+
@Override
38+
public boolean isInitialized() {
39+
return super.isInitialized() && trimDurationUs != Long.MIN_VALUE;
40+
}
41+
42+
@Override
43+
public void deinitialize() {
44+
super.deinitialize();
45+
trimDurationUs = Long.MIN_VALUE;
46+
trimDone = false;
47+
}
48+
3749
@Override
3850
public void initialize() {
3951
super.initialize();
@@ -80,10 +92,4 @@ public long seekTo(long desiredPositionUs) {
8092
long superReceivedUs = getSource().seekTo(superDesiredUs);
8193
return superReceivedUs - trimStartUs;
8294
}
83-
84-
@Override
85-
public void deinitialize() {
86-
super.deinitialize();
87-
trimDone = false;
88-
}
8995
}

0 commit comments

Comments
 (0)