From 3d4c19e37980e08cf3389fc142726fd21ac0a3af Mon Sep 17 00:00:00 2001 From: Saqrag Date: Mon, 29 Jul 2019 09:53:08 +0800 Subject: [PATCH 1/2] PassThroughTrackTranscoder supports not checking MediaFormatValidator --- .../transcoder/engine/TranscoderMuxer.java | 21 +++++++++++++++---- .../transcode/BaseTrackTranscoder.java | 2 +- .../transcode/PassThroughTrackTranscoder.java | 2 +- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/lib/src/main/java/com/otaliastudios/transcoder/engine/TranscoderMuxer.java b/lib/src/main/java/com/otaliastudios/transcoder/engine/TranscoderMuxer.java index bffec0bb..e50c91b2 100644 --- a/lib/src/main/java/com/otaliastudios/transcoder/engine/TranscoderMuxer.java +++ b/lib/src/main/java/com/otaliastudios/transcoder/engine/TranscoderMuxer.java @@ -35,6 +35,8 @@ public class TranscoderMuxer { private static final String TAG = TranscoderMuxer.class.getSimpleName(); private static final Logger LOG = new Logger(TAG); + private boolean mAudioTrackNeedsValidation = false; + private boolean mVideoTrackNeedsValidation = false; private static final int BUFFER_SIZE = 64 * 1024; // I have no idea whether this value is appropriate or not... @@ -74,8 +76,13 @@ private void toBufferInfo(@NonNull MediaCodec.BufferInfo bufferInfo, int offset) * @param trackType the sample type, either audio or video * @param format the new format */ - public void setOutputFormat(@NonNull TrackType trackType, @NonNull MediaFormat format) { + public void setOutputFormat(@NonNull TrackType trackType, @NonNull MediaFormat format, boolean needsValidation) { mTracks.outputFormat(trackType, format); + if(trackType == TrackType.AUDIO) { + mAudioTrackNeedsValidation = needsValidation; + } else if(trackType == TrackType.VIDEO){ + mVideoTrackNeedsValidation = needsValidation; + } // If we have both, go on. boolean isTranscodingVideo = mTracks.status(TrackType.VIDEO).isTranscoding(); @@ -89,9 +96,15 @@ public void setOutputFormat(@NonNull TrackType trackType, @NonNull MediaFormat f // If both video and audio are ready, validate the formats and go on. // We will stop buffering data and we will start actually muxing it. - MediaFormatValidator formatValidator = new MediaFormatValidator(); - formatValidator.validateVideoOutputFormat(videoOutputFormat); - formatValidator.validateAudioOutputFormat(audioOutputFormat); + if(mVideoTrackNeedsValidation||mAudioTrackNeedsValidation) { + MediaFormatValidator formatValidator = new MediaFormatValidator(); + if(mVideoTrackNeedsValidation) { + formatValidator.validateVideoOutputFormat(videoOutputFormat); + } + if(mAudioTrackNeedsValidation) { + formatValidator.validateAudioOutputFormat(audioOutputFormat); + } + } if (isTranscodingVideo) { int videoIndex = mMuxer.addTrack(videoOutputFormat); diff --git a/lib/src/main/java/com/otaliastudios/transcoder/transcode/BaseTrackTranscoder.java b/lib/src/main/java/com/otaliastudios/transcoder/transcode/BaseTrackTranscoder.java index e2850338..e06cc069 100644 --- a/lib/src/main/java/com/otaliastudios/transcoder/transcode/BaseTrackTranscoder.java +++ b/lib/src/main/java/com/otaliastudios/transcoder/transcode/BaseTrackTranscoder.java @@ -196,7 +196,7 @@ protected void onEncoderOutputFormatChanged(@NonNull MediaCodec encoder, @NonNul throw new RuntimeException("Audio output format changed twice."); } mActualOutputFormat = format; - mMuxer.setOutputFormat(mTrackType, mActualOutputFormat); + mMuxer.setOutputFormat(mTrackType, mActualOutputFormat, true); } @SuppressWarnings("SameParameterValue") diff --git a/lib/src/main/java/com/otaliastudios/transcoder/transcode/PassThroughTrackTranscoder.java b/lib/src/main/java/com/otaliastudios/transcoder/transcode/PassThroughTrackTranscoder.java index 1c88f8d3..074077ba 100644 --- a/lib/src/main/java/com/otaliastudios/transcoder/transcode/PassThroughTrackTranscoder.java +++ b/lib/src/main/java/com/otaliastudios/transcoder/transcode/PassThroughTrackTranscoder.java @@ -71,7 +71,7 @@ public void setUp(@NonNull MediaFormat desiredOutputFormat) { } public boolean transcode() { if (mIsEOS) return false; if (!mOutputFormatSet) { - mMuxer.setOutputFormat(mTrackType, mOutputFormat); + mMuxer.setOutputFormat(mTrackType, mOutputFormat, false); mOutputFormatSet = true; } int trackIndex = mExtractor.getSampleTrackIndex(); From 2ecd06fcf6d44eb57cb0e19ffb021e676b73d969 Mon Sep 17 00:00:00 2001 From: Saqrag Date: Tue, 30 Jul 2019 14:15:31 +0800 Subject: [PATCH 2/2] throw InterruptedException when cancel transcode * TaskFuture#cancel will call Thread#interrupt. Thread#interrupt throw InterruptedException only when thread is bloking. So other situation can't stop transcode. --- .../com/otaliastudios/transcoder/engine/TranscoderEngine.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/src/main/java/com/otaliastudios/transcoder/engine/TranscoderEngine.java b/lib/src/main/java/com/otaliastudios/transcoder/engine/TranscoderEngine.java index 2dc1a85c..76162ab1 100644 --- a/lib/src/main/java/com/otaliastudios/transcoder/engine/TranscoderEngine.java +++ b/lib/src/main/java/com/otaliastudios/transcoder/engine/TranscoderEngine.java @@ -259,6 +259,9 @@ private void runPipelines() throws InterruptedException { TrackTranscoder videoTranscoder = mTranscoders.get(TrackType.VIDEO); TrackTranscoder audioTranscoder = mTranscoders.get(TrackType.AUDIO); while (!(videoTranscoder.isFinished() && audioTranscoder.isFinished())) { + if (Thread.interrupted()) { + throw new InterruptedException(); + } boolean stepped = videoTranscoder.transcode() || audioTranscoder.transcode(); loopCount++; if (mDurationUs > 0 && loopCount % PROGRESS_INTERVAL_STEPS == 0) {