From e19d4624c12a7b89aba45b4b9e1024d5cc5ac589 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Wed, 18 Feb 2026 17:58:59 +0000 Subject: [PATCH] Fix video transcoding crash caused by premature codec API calls. Move getParameterDescriptor and setParameters calls to after configure/start, since they require the codec to be in the Executing state. Always set KEY_COLOR_TRANSFER_REQUEST in the format before configure as the primary tone-mapping mechanism. --- .../videoconverter/VideoTrackConverter.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/video/src/main/java/org/thoughtcrime/securesms/video/videoconverter/VideoTrackConverter.java b/lib/video/src/main/java/org/thoughtcrime/securesms/video/videoconverter/VideoTrackConverter.java index 845b81b352..920a34d707 100644 --- a/lib/video/src/main/java/org/thoughtcrime/securesms/video/videoconverter/VideoTrackConverter.java +++ b/lib/video/src/main/java/org/thoughtcrime/securesms/video/videoconverter/VideoTrackConverter.java @@ -484,17 +484,22 @@ final class VideoTrackConverter { // Try to use the Dolby Vision decoder, but if it doesn't support the transfer parameter, the decoded video buffer // is HLG and in-app tone mapping has to be used instead if (Build.VERSION.SDK_INT >= 31) { - MediaCodec.ParameterDescriptor descriptor = decoder.getParameterDescriptor(VENDOR_DOLBY_CODEC_TRANSFER_PARAMKEY); - if (descriptor != null) { - Bundle transferBundle = new Bundle(); - transferBundle.putString(VENDOR_DOLBY_CODEC_TRANSFER_PARAMKEY, "transfer.sdr.normal"); - decoder.setParameters(transferBundle); - } else { - decoderPair.getSecond().setInteger(MediaFormat.KEY_COLOR_TRANSFER_REQUEST, MediaFormat.COLOR_TRANSFER_SDR_VIDEO); - } + decoderPair.getSecond().setInteger(MediaFormat.KEY_COLOR_TRANSFER_REQUEST, MediaFormat.COLOR_TRANSFER_SDR_VIDEO); } decoder.configure(decoderPair.getSecond(), surface, null, 0); decoder.start(); + if (Build.VERSION.SDK_INT >= 31) { + try { + MediaCodec.ParameterDescriptor descriptor = decoder.getParameterDescriptor(VENDOR_DOLBY_CODEC_TRANSFER_PARAMKEY); + if (descriptor != null) { + Bundle transferBundle = new Bundle(); + transferBundle.putString(VENDOR_DOLBY_CODEC_TRANSFER_PARAMKEY, "transfer.sdr.normal"); + decoder.setParameters(transferBundle); + } + } catch (IllegalStateException e) { + Log.w(TAG, "Failed to set Dolby Vision transfer parameter", e); + } + } return decoder; }