From 577e05eb511d981252049921b70e4c63535bb39c Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Wed, 25 Feb 2026 11:37:17 -0500 Subject: [PATCH] Make sure we transcode non-H264 video. --- .../securesms/video/StreamingTranscoder.java | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/video/src/main/java/org/thoughtcrime/securesms/video/StreamingTranscoder.java b/lib/video/src/main/java/org/thoughtcrime/securesms/video/StreamingTranscoder.java index 2601b8c53c..5120e6a778 100644 --- a/lib/video/src/main/java/org/thoughtcrime/securesms/video/StreamingTranscoder.java +++ b/lib/video/src/main/java/org/thoughtcrime/securesms/video/StreamingTranscoder.java @@ -1,6 +1,8 @@ package org.thoughtcrime.securesms.video; import android.media.MediaDataSource; +import android.media.MediaExtractor; +import android.media.MediaFormat; import android.media.MediaMetadataRetriever; import androidx.annotation.NonNull; @@ -74,9 +76,9 @@ public final class StreamingTranscoder { this.targetQuality = TranscodingQuality.createFromPreset(preset, duration); this.upperSizeLimit = upperSizeLimit; - this.transcodeRequired = inputBitRate >= targetQuality.getTargetTotalBitRate() * 1.2 || inSize > upperSizeLimit || containsLocation(mediaMetadataRetriever) || options != null; + this.transcodeRequired = inputBitRate >= targetQuality.getTargetTotalBitRate() * 1.2 || inSize > upperSizeLimit || containsLocation(mediaMetadataRetriever) || options != null || !isH264(dataSource); if (!transcodeRequired) { - Log.i(TAG, "Video is within 20% of target bitrate, below the size limit, contained no location metadata or custom options."); + Log.i(TAG, "Video is within 20% of target bitrate, below the size limit, contained no location metadata or custom options, and is already H.264."); } this.fileSizeEstimate = targetQuality.getByteCountEstimate(); @@ -249,6 +251,26 @@ public final class StreamingTranscoder { return locationString != null; } + private static boolean isH264(@NonNull MediaDataSource dataSource) { + MediaExtractor extractor = new MediaExtractor(); + try { + extractor.setDataSource(dataSource); + for (int i = 0; i < extractor.getTrackCount(); i++) { + MediaFormat format = extractor.getTrackFormat(i); + String mime = format.getString(MediaFormat.KEY_MIME); + if (mime != null && mime.startsWith("video/")) { + return MediaConverter.VIDEO_CODEC_H264.equals(mime); + } + } + return false; + } catch (IOException e) { + Log.w(TAG, "Unable to check video codec", e); + return false; + } finally { + extractor.release(); + } + } + public interface Progress { void onProgress(int percent); }