mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-02-15 07:28:30 +00:00
Abort transcoding if frame processing gets stuck.
This commit is contained in:
committed by
Greyson Parrelli
parent
f20fe33af9
commit
489b58ad67
@@ -398,19 +398,13 @@ final class AudioTrackConverter {
|
||||
}
|
||||
}
|
||||
|
||||
String dumpState() {
|
||||
return String.format(Locale.US,
|
||||
"A{"
|
||||
+ "extracted:%d(done:%b) "
|
||||
+ "decoded:%d(done:%b) "
|
||||
+ "encoded:%d(done:%b) "
|
||||
+ "pending:%d "
|
||||
+ "muxing:%b(track:%d} )",
|
||||
mAudioExtractedFrameCount, mAudioExtractorDone,
|
||||
mAudioDecodedFrameCount, mAudioDecoderDone,
|
||||
mAudioEncodedFrameCount, mAudioEncoderDone,
|
||||
mPendingAudioDecoderOutputBufferIndex,
|
||||
mMuxer != null, mOutputAudioTrack);
|
||||
AudioTrackConverterState dumpState() {
|
||||
return new AudioTrackConverterState(
|
||||
mAudioExtractedFrameCount, mAudioExtractorDone,
|
||||
mAudioDecodedFrameCount, mAudioDecoderDone,
|
||||
mAudioEncodedFrameCount, mAudioEncoderDone,
|
||||
mPendingAudioDecoderOutputBufferIndex,
|
||||
mMuxer != null, mOutputAudioTrack);
|
||||
}
|
||||
|
||||
void verifyEndState() {
|
||||
|
||||
@@ -47,6 +47,8 @@ public final class MediaConverter {
|
||||
private static final String TAG = "media-converter";
|
||||
private static final boolean VERBOSE = false; // lots of logging
|
||||
|
||||
private static final int STUCK_FRAME_THRESHOLD = 100;
|
||||
|
||||
// Describes when the annotation will be discarded
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@StringDef({VIDEO_CODEC_H264, VIDEO_CODEC_H265})
|
||||
@@ -217,6 +219,8 @@ public final class MediaConverter {
|
||||
final @Nullable AudioTrackConverter audioTrackConverter,
|
||||
final @NonNull Muxer muxer) throws IOException, TranscodingException {
|
||||
|
||||
MediaConverterState oldState = null;
|
||||
int stuckFrames = 0;
|
||||
boolean muxing = false;
|
||||
int percentProcessed = 0;
|
||||
long inputDuration = Math.max(
|
||||
@@ -227,11 +231,19 @@ public final class MediaConverter {
|
||||
((videoTrackConverter != null && !videoTrackConverter.mVideoEncoderDone) ||
|
||||
(audioTrackConverter != null &&!audioTrackConverter.mAudioEncoderDone))) {
|
||||
|
||||
final MediaConverterState currentState = new MediaConverterState(videoTrackConverter != null ? videoTrackConverter.dumpState() : null, audioTrackConverter != null ? audioTrackConverter.dumpState() : null, muxing);
|
||||
|
||||
if (VERBOSE) {
|
||||
Log.d(TAG, "loop: " +
|
||||
(videoTrackConverter == null ? "" : videoTrackConverter.dumpState()) +
|
||||
(audioTrackConverter == null ? "" : audioTrackConverter.dumpState()) +
|
||||
" muxing:" + muxing);
|
||||
Log.d(TAG, "loop: " + currentState);
|
||||
}
|
||||
|
||||
if (currentState.equals(oldState)) {
|
||||
if (++stuckFrames >= STUCK_FRAME_THRESHOLD) {
|
||||
mCancelled = true;
|
||||
}
|
||||
} else {
|
||||
oldState = currentState;
|
||||
stuckFrames = 0;
|
||||
}
|
||||
|
||||
if (videoTrackConverter != null && (audioTrackConverter == null || audioTrackConverter.mAudioExtractorDone || videoTrackConverter.mMuxingVideoPresentationTime <= audioTrackConverter.mMuxingAudioPresentationTime)) {
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
/*
|
||||
* Copyright 2024 Signal Messenger, LLC
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
package org.thoughtcrime.securesms.video.videoconverter
|
||||
|
||||
data class MediaConverterState(val videoTrack: VideoTrackConverterState?, val audioTrack: AudioTrackConverterState?, val muxing: Boolean)
|
||||
|
||||
data class VideoTrackConverterState(val extractedCount: Long, val extractedDone: Boolean, val decodedCount: Long, val decodedDone: Boolean, val encodedCount: Long, val encodedDone: Boolean, val muxing: Boolean, val trackIndex: Int)
|
||||
|
||||
data class AudioTrackConverterState(val extractedCount: Long, val extractedDone: Boolean, val decodedCount: Long, val decodedDone: Boolean, val encodedCount: Long, val encodedDone: Boolean, val pendingBufferIndex: Int, val muxing: Boolean, val trackIndex: Int)
|
||||
@@ -429,17 +429,12 @@ final class VideoTrackConverter {
|
||||
}
|
||||
}
|
||||
|
||||
String dumpState() {
|
||||
return String.format(Locale.US,
|
||||
"V{"
|
||||
+ "extracted:%d(done:%b) "
|
||||
+ "decoded:%d(done:%b) "
|
||||
+ "encoded:%d(done:%b) "
|
||||
+ "muxing:%b(track:%d)} ",
|
||||
mVideoExtractedFrameCount, mVideoExtractorDone,
|
||||
mVideoDecodedFrameCount, mVideoDecoderDone,
|
||||
mVideoEncodedFrameCount, mVideoEncoderDone,
|
||||
mMuxer != null, mOutputVideoTrack);
|
||||
VideoTrackConverterState dumpState() {
|
||||
return new VideoTrackConverterState(
|
||||
mVideoExtractedFrameCount, mVideoExtractorDone,
|
||||
mVideoDecodedFrameCount, mVideoDecoderDone,
|
||||
mVideoEncodedFrameCount, mVideoEncoderDone,
|
||||
mMuxer != null, mOutputVideoTrack);
|
||||
}
|
||||
|
||||
void verifyEndState() {
|
||||
|
||||
Reference in New Issue
Block a user