media icon indicating copy to clipboard operation
media copied to clipboard

Can not select the Dolby Vision AdaptationSet

Open Jietang126 opened this issue 1 year ago • 6 comments

Version

Media3 1.2.1

More version details

No response

Devices that reproduce the issue

FireOS 8 FireTV [ro.product.build.fingerprint]: [Amazon/ginza/ginza:11/RMAIN1.1990N/0024327472640:user/amz-d,dev-keys]

Devices that do not reproduce the issue

FireOS 7 FireTV

Reproducible in the demo app?

Yes

Reproduction steps

  1. Install Media3 Demo app.
  2. Play the demo.mpd

Expected result

Exoplayer would select the Dolby Vision AdaptationSet

Actual result

ExoPlayer selected the HEVC AdaptationSet

Media

Manifest: demo.mpd.zip

Log: bugreport-ginza-dt-RMAIN1.1990N-2024-08-20-06-39-52.zip

Bug Report

  • [ ] You will email the zip file produced by adb bugreport to [email protected] after filing this issue.

Jietang126 avatar Aug 20 '24 10:08 Jietang126

I added some logs in media/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java

protected @Capabilities int supportsFormat(MediaCodecSelector mediaCodecSelector, Format format)
      throws DecoderQueryException {
    String mimeType = format.sampleMimeType;
    if (!MimeTypes.isVideo(mimeType)) {
      return RendererCapabilities.create(C.FORMAT_UNSUPPORTED_TYPE);
    }
    @Nullable DrmInitData drmInitData = format.drmInitData;
    // Assume encrypted content requires secure decoders.
    boolean requiresSecureDecryption = drmInitData != null;
    List<MediaCodecInfo> decoderInfos =
        getDecoderInfos(
            context,
            mediaCodecSelector,
            format,
            requiresSecureDecryption,
            /* requiresTunnelingDecoder= */ false);
    if (requiresSecureDecryption && decoderInfos.isEmpty()) {
      // No secure decoders are available. Fall back to non-secure decoders.
      decoderInfos =
          getDecoderInfos(
              context,
              mediaCodecSelector,
              format,
              /* requiresSecureDecoder= */ false,
              /* requiresTunnelingDecoder= */ false);
    }
    if (decoderInfos.isEmpty()) {
      return RendererCapabilities.create(C.FORMAT_UNSUPPORTED_SUBTYPE);
    }
    if (!supportsFormatDrm(format)) {
      return RendererCapabilities.create(C.FORMAT_UNSUPPORTED_DRM);
    }
    // Check whether the first decoder supports the format. This is the preferred decoder for the
    // format's MIME type, according to the MediaCodecSelector.
    MediaCodecInfo decoderInfo = decoderInfos.get(0);
    boolean isFormatSupported = decoderInfo.isFormatSupported(format);
    if (MimeTypes.VIDEO_DOLBY_VISION.equals(format.sampleMimeType)) {
      Log.i(TAG, "decoderInfos = " + decoderInfos.toString());
      Log.i(TAG, "format = " + format.toString());
      Log.i(TAG, "isFormatSupported = " + (isFormatSupported ? "True" : "False"));
    }
08-20 06:39:23.272 10213  1597  1840 I MediaCodecVideoRenderer: decoderInfos = [c2.mtk.dvav.se.decoder, c2.mtk.dvav1.10.decoder, c2.mtk.dvhe.dtr.decoder, c2.mtk.dvhe.st.decoder, c2.mtk.dvhe.stn.decoder]
08-20 06:39:23.272 10213  1597  1840 I MediaCodecVideoRenderer: format = Format(v29, null, video/mp4, video/dolby-vision, dvh1.05.03, 11505339, null, [1920, 1080, 23.976025, null], [-1, -1])
08-20 06:39:23.272 10213  1597  1840 I MediaCodecVideoRenderer: isFormatSupported = False

It indicates that the first decoder in decoderInfos is AVC DolbyVision decoder, so isFormatSupported() will return false when the format is HEVC DolbyVision 'dvh1.05.03'. I checked the vndk's c2store, it uses the map<C2String, ComponentLoader> to store the decoder component. https://cs.android.com/android/platform/superproject/+/android14-qpr3-release:frameworks/av/media/codec2/vndk/C2Store.cpp;l=1022?q=C2Store.cpp&ss=android%2Fplatform%2Fsuperproject

So the decoder info is stored in dictionary order and can not be adjusted.

For ACodec +OMX, the decoder component is stored in vector, we can adjust the order in media_codecs.xml. So I can not reproduced this issue on FireOS 7 FireTV.

Jietang126 avatar Aug 20 '24 11:08 Jietang126

I found a way to fix this issue by using the following function to get the sorted decoderInfos.

  protected List<MediaCodecInfo> getDecoderInfos(
      MediaCodecSelector mediaCodecSelector, Format format, boolean requiresSecureDecoder)
      throws DecoderQueryException {
    return MediaCodecUtil.getDecoderInfosSortedByFormatSupport(
        getDecoderInfos(context, mediaCodecSelector, format, requiresSecureDecoder, tunneling),
        format);
  }

Please help to review, thanks.

--- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java
+++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java
@@ -427,20 +427,17 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer implements Video
     boolean requiresSecureDecryption = drmInitData != null;
     List<MediaCodecInfo> decoderInfos =
         getDecoderInfos(
-            context,
             mediaCodecSelector,
             format,
-            requiresSecureDecryption,
-            /* requiresTunnelingDecoder= */ false);
+            requiresSecureDecryption);
+
     if (requiresSecureDecryption && decoderInfos.isEmpty()) {
       // No secure decoders are available. Fall back to non-secure decoders.
       decoderInfos =
           getDecoderInfos(
-              context,
               mediaCodecSelector,
               format,
-              /* requiresSecureDecoder= */ false,
-              /* requiresTunnelingDecoder= */ false);
+              /* requiresSecureDecoder= */ false);
     }
     if (decoderInfos.isEmpty()) {

decoderInfos = [c2.mtk.dvhe.stn.decoder, c2.mtk.dvav.se.decoder, c2.mtk.dvav1.10.decoder, c2.mtk.dvhe.dtr.decoder, c2.mtk.dvhe.st.decoder]
08-20 08:35:45.711 17023 17077 I MediaCodecVideoRenderer: format = Format(v32, null, video/mp4, video/dolby-vision, dvh1.05.01, 542888, null, [448, 252, 23.976025, null], [-1, -1])
08-20 08:35:45.711 17023 17077 I MediaCodecVideoRenderer: isFormatSupported = True

The first decoder in decoderInfos is HEVC DolbyVision decoder after applying the above change, isFormatSupported() return true.

Jietang126 avatar Aug 20 '24 11:08 Jietang126

Hello @Jietang126,

I looked through the trace that you sent and I don't see any ExoPlayer logs? Are you sure that you recorded the scenario with the Demo App? What I would love to see is the section in Logcat that prints out the support for the different tracks like as seen in the example below.

2024-08-09 11:56:57.836 20761-20761 EventLogger             androidx.media3.demo.main            D    group [
2024-08-09 11:56:57.836 20761-20761 EventLogger             androidx.media3.demo.main            D      [X] Track:0, id=1, mimeType=video/avc, container=video/mp4, bitrate=769255, codecs=avc1.42c01e, res=320x142, fps=24.0, supported=YES
2024-08-09 11:56:57.837 20761-20761 EventLogger             androidx.media3.demo.main            D      [X] Track:1, id=2, mimeType=video/avc, container=video/mp4, bitrate=1774254, codecs=avc1.4d401f, res=854x380, fps=24.0, supported=YES
2024-08-09 11:56:57.837 20761-20761 EventLogger             androidx.media3.demo.main            D      [ ] Track:2, id=3, mimeType=video/avc, container=video/mp4, bitrate=7203938, codecs=avc1.4d4028, res=1280x570, fps=24.0, supported=NO_EXCEEDS_CAPABILITIES
2024-08-09 11:56:57.837 20761-20761 EventLogger             androidx.media3.demo.main            D      [ ] Track:3, id=4, mimeType=video/avc, container=video/mp4, bitrate=18316946, codecs=avc1.64002a, res=1920x856, fps=24.0, supported=NO_EXCEEDS_CAPABILITIES
2024-08-09 11:56:57.837 20761-20761 EventLogger             androidx.media3.demo.main            D    ]

Is it just the specific c2.mtk.dvav.se.decoder hardware decoder that does not support the Dolby Format you are trying to play? Hence your wish to change the order in the decoder list method?

My suggestion would be to file a bug with Amazon as far as why they don't support that Dolby format.

In helping you with an ExoPlayer solution, rather than altering the code in MediaCodecVideoRenderer, you could just provide a customized MediaCodecSelector when creating your ExoPlayer instance. The selector could either reorder the decoder list or remove c2.mtk.dvav.se.decoder.

Here is an example of what that might look like:

DefaultRenderersFactory defaultRenderersFactory
          = new DefaultRenderersFactory(/* context= */ this);
MediaCodecSelector mediaCodecSelector = new MediaCodecSelector() {
  @Override
  public List<MediaCodecInfo> getDecoderInfos(String mimeType, boolean requiresSecureDecoder,
      boolean requiresTunnelingDecoder) throws DecoderQueryException {
    ImmutableList.Builder<MediaCodecInfo> mediaCodecInfoListResult = new ImmutableList.Builder<>();
    List<MediaCodecInfo> mediaCodecInfoList = 
        MediaCodecSelector.DEFAULT.getDecoderInfos(mimeType, requiresSecureDecoder, requiresTunnelingDecoder);
    // Either remove or reorder
    for (MediaCodecInfo m : mediaCodecInfoList) {
      if (!m.name.equals("c2.mtk.dvav.se.decoder")) {
        mediaCodecInfoListResult.add(m);
      }
    }
    return mediaCodecInfoListResult.build();
  }
};
defaultRenderersFactory.setMediaCodecSelector(mediaCodecSelector);
ExoPlayer.Builder playerBuilder =
          new ExoPlayer.Builder(/* context= */ this)
              .setRenderersFactory(defaultRenderersFactory);

microkatz avatar Aug 20 '24 12:08 microkatz

Hi @microkatz Thanks for your quick response. I can find the ExoPlayer logs in bugreport-ginza-dt-RMAIN1.1990N-2024-08-20-06-39-52.txt.

08-20 06:39:23.385 10213  1597  1597 D EventLogger:   group [
08-20 06:39:23.389 10213  1597  1597 D EventLogger:     [ ] Track:0, id=v2, mimeType=video/avc, container=video/mp4, bitrate=367797, codecs=avc1.64000d, res=416x234, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.390 10213  1597  1597 D EventLogger:     [ ] Track:1, id=v3, mimeType=video/avc, container=video/mp4, bitrate=542372, codecs=avc1.640015, res=480x270, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.390 10213  1597  1597 D EventLogger:     [ ] Track:2, id=v5, mimeType=video/avc, container=video/mp4, bitrate=834038, codecs=avc1.640015, res=544x306, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.390 10213  1597  1597 D EventLogger:     [ ] Track:3, id=v1, mimeType=video/avc, container=video/mp4, bitrate=1128320, codecs=avc1.64001e, res=640x360, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.391 10213  1597  1597 D EventLogger:     [ ] Track:4, id=v8, mimeType=video/avc, container=video/mp4, bitrate=1488868, codecs=avc1.64001e, res=768x432, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.391 10213  1597  1597 D EventLogger:     [ ] Track:5, id=v6, mimeType=video/avc, container=video/mp4, bitrate=2365803, codecs=avc1.64001f, res=1024x576, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.392 10213  1597  1597 D EventLogger:     [ ] Track:6, id=v4, mimeType=video/avc, container=video/mp4, bitrate=3956716, codecs=avc1.64001f, res=1280x720, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.392 10213  1597  1597 D EventLogger:     [ ] Track:7, id=v0, mimeType=video/avc, container=video/mp4, bitrate=5693333, codecs=avc1.640028, res=1600x900, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.392 10213  1597  1597 D EventLogger:     [ ] Track:8, id=v7, mimeType=video/avc, container=video/mp4, bitrate=9291457, codecs=avc1.640029, res=1920x1080, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.392 10213  1597  1597 D EventLogger:   ]
08-20 06:39:23.392 10213  1597  1597 D EventLogger:   group [
08-20 06:39:23.392 10213  1597  1597 D EventLogger:     [ ] Track:0, id=v32, mimeType=video/dolby-vision, container=video/mp4, bitrate=542888, codecs=dvh1.05.01, res=448x252, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.393 10213  1597  1597 D EventLogger:     [ ] Track:1, id=v33, mimeType=video/dolby-vision, container=video/mp4, bitrate=753285, codecs=dvh1.05.01, res=512x288, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.393 10213  1597  1597 D EventLogger:     [ ] Track:2, id=v31, mimeType=video/dolby-vision, container=video/mp4, bitrate=979637, codecs=dvh1.05.01, res=576x324, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.393 10213  1597  1597 D EventLogger:     [ ] Track:3, id=v35, mimeType=video/dolby-vision, container=video/mp4, bitrate=1268904, codecs=dvh1.05.01, res=640x360, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.394 10213  1597  1597 D EventLogger:     [ ] Track:4, id=v27, mimeType=video/dolby-vision, container=video/mp4, bitrate=1960962, codecs=dvh1.05.01, res=768x432, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.394 10213  1597  1597 D EventLogger:     [ ] Track:5, id=v30, mimeType=video/dolby-vision, container=video/mp4, bitrate=3392388, codecs=dvh1.05.01, res=1024x576, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.394 10213  1597  1597 D EventLogger:     [ ] Track:6, id=v28, mimeType=video/dolby-vision, container=video/mp4, bitrate=4923825, codecs=dvh1.05.01, res=1280x720, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.394 10213  1597  1597 D EventLogger:     [ ] Track:7, id=v34, mimeType=video/dolby-vision, container=video/mp4, bitrate=7405733, codecs=dvh1.05.03, res=1600x900, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.394 10213  1597  1597 D EventLogger:     [ ] Track:8, id=v29, mimeType=video/dolby-vision, container=video/mp4, bitrate=11505339, codecs=dvh1.05.03, res=1920x1080, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.394 10213  1597  1597 D EventLogger:   ]
08-20 06:39:23.395 10213  1597  1597 D EventLogger:   group [
08-20 06:39:23.395 10213  1597  1597 D EventLogger:     [X] Track:0, id=v20, mimeType=video/hevc, container=video/mp4, bitrate=543809, codecs=hvc1.2.4.L60.90, res=448x252, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.395 10213  1597  1597 D EventLogger:     [X] Track:1, id=v24, mimeType=video/hevc, container=video/mp4, bitrate=794854, codecs=hvc1.2.4.L63.90, res=512x288, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.395 10213  1597  1597 D EventLogger:     [X] Track:2, id=v19, mimeType=video/hevc, container=video/mp4, bitrate=1101259, codecs=hvc1.2.4.L63.90, res=576x324, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.395 10213  1597  1597 D EventLogger:     [X] Track:3, id=v26, mimeType=video/hevc, container=video/mp4, bitrate=1579853, codecs=hvc1.2.4.L63.90, res=640x360, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.395 10213  1597  1597 D EventLogger:     [X] Track:4, id=v22, mimeType=video/hevc, container=video/mp4, bitrate=2423495, codecs=hvc1.2.4.L90.90, res=768x432, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.396 10213  1597  1597 D EventLogger:     [X] Track:5, id=v21, mimeType=video/hevc, container=video/mp4, bitrate=3513695, codecs=hvc1.2.4.L93.90, res=1024x576, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.396 10213  1597  1597 D EventLogger:     [X] Track:6, id=v23, mimeType=video/hevc, container=video/mp4, bitrate=5061467, codecs=hvc1.2.4.L93.90, res=1280x720, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.396 10213  1597  1597 D EventLogger:     [X] Track:7, id=v25, mimeType=video/hevc, container=video/mp4, bitrate=8000068, codecs=hvc1.2.4.L123.90, res=1600x900, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.396 10213  1597  1597 D EventLogger:     [X] Track:8, id=v18, mimeType=video/hevc, container=video/mp4, bitrate=11099181, codecs=hvc1.2.4.L123.90, res=1920x1080, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.396 10213  1597  1597 D EventLogger:   ]
08-20 06:39:23.396 10213  1597  1597 D EventLogger:   group [
08-20 06:39:23.397 10213  1597  1597 D EventLogger:     [ ] Track:0, id=v14, mimeType=video/hevc, container=video/mp4, bitrate=339875, codecs=hvc1.2.4.L60.90, res=448x252, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.397 10213  1597  1597 D EventLogger:     [ ] Track:1, id=v15, mimeType=video/hevc, container=video/mp4, bitrate=472516, codecs=hvc1.2.4.L63.90, res=512x288, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.398 10213  1597  1597 D EventLogger:     [ ] Track:2, id=v12, mimeType=video/hevc, container=video/mp4, bitrate=580796, codecs=hvc1.2.4.L63.90, res=576x324, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.398 10213  1597  1597 D EventLogger:     [ ] Track:3, id=v9, mimeType=video/hevc, container=video/mp4, bitrate=778182, codecs=hvc1.2.4.L63.90, res=640x360, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.398 10213  1597  1597 D EventLogger:     [ ] Track:4, id=v17, mimeType=video/hevc, container=video/mp4, bitrate=1193177, codecs=hvc1.2.4.L90.90, res=768x432, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.399 10213  1597  1597 D EventLogger:     [ ] Track:5, id=v10, mimeType=video/hevc, container=video/mp4, bitrate=2154358, codecs=hvc1.2.4.L93.90, res=1024x576, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.399 10213  1597  1597 D EventLogger:     [ ] Track:6, id=v13, mimeType=video/hevc, container=video/mp4, bitrate=3336612, codecs=hvc1.2.4.L93.90, res=1280x720, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.399 10213  1597  1597 D EventLogger:     [ ] Track:7, id=v16, mimeType=video/hevc, container=video/mp4, bitrate=5224120, codecs=hvc1.2.4.L123.90, res=1600x900, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.399 10213  1597  1597 D EventLogger:     [ ] Track:8, id=v11, mimeType=video/hevc, container=video/mp4, bitrate=8354726, codecs=hvc1.2.4.L123.90, res=1920x1080, fps=23.976025, roleFlags=[main], supported=YES
08-20 06:39:23.399 10213  1597  1597 D EventLogger:   ]

Is it just the specific c2.mtk.dvav.se.decoder hardware decoder that does not support the Dolby Format you are trying to play? Hence your wish to change the order in the decoder list method?

No, this dvav.se decoder is for Dolby Vision profile 9 content. This is Dolby Vision profile 5 stream, so it can not play with this decoder. Screenshot 2024-08-21 at 12 04 08 Screenshot 2024-08-21 at 12 22 14

My suggestion would be to file a bug with Amazon as far as why they don't support that Dolby format.

This FireTV support Dolby format, you can check the above logs. But it marks as 'DECODER_SUPPORT_FALLBACK' since the first decoder in decoderInfos doesn't support it. So the DefaultTrackSelector selects the HEVC group instead of Dolby group.

    // Check whether the first decoder supports the format. This is the preferred decoder for the
    // format's MIME type, according to the MediaCodecSelector.
    MediaCodecInfo decoderInfo = decoderInfos.get(0);
    boolean isFormatSupported = decoderInfo.isFormatSupported(format);
    boolean isPreferredDecoder = true;
    if (!isFormatSupported) {
      // Check whether any of the other decoders support the format.
      for (int i = 1; i < decoderInfos.size(); i++) {
        MediaCodecInfo otherDecoderInfo = decoderInfos.get(i);
        if (otherDecoderInfo.isFormatSupported(format)) {
          decoderInfo = otherDecoderInfo;
          isFormatSupported = true;
          isPreferredDecoder = false;
          break;
        }
      }
    }

I suppose the real issue is that for the DolbyVision decoder, we cannot assume the first decoder in the decoderInfos list is the preferred decoder. Since different profiles require different Dolby decoders. Could you please help to consider how to handle it in default MediaCodecSelector? thanks a lot.

Jietang126 avatar Aug 21 '24 04:08 Jietang126

@microkatz

I tried the following change and it also solved my issue.

➜  media git:(release-1.2.1) ✗ git diff libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java
diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java
index 8c45615ba3..d2228cdc45 100644
--- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java
+++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java
@@ -460,7 +460,9 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer implements Video
         if (otherDecoderInfo.isFormatSupported(format)) {
           decoderInfo = otherDecoderInfo;
           isFormatSupported = true;
-          isPreferredDecoder = false;
+          if (!MimeTypes.VIDEO_DOLBY_VISION.equals(format.sampleMimeType)) {
+            isPreferredDecoder = false;
+          }
           break;
         }
       }

I dumped the media.player info by the following command. mp_ginza.log adb shell dumpsys media.player > mp_ginza.log Each Dolby decoder only supports one profile.

Media type 'video/dolby-vision':
  Decoder "c2.mtk.dvav.se.decoder" supports
    profile/levels: [
        512/   16 (??/??) ]
  Decoder "c2.mtk.dvav.se.decoder.secure" supports
    profile/levels: [
        512/   16 (??/??) ]
  Decoder "c2.mtk.dvav1.10.decoder" supports
    profile/levels: [
       1024/  256 (??/??) ]
  Decoder "c2.mtk.dvav1.10.decoder.secure" supports
    profile/levels: [
       1024/  256 (??/??) ]
  Decoder "c2.mtk.dvhe.dtr.decoder" supports
    profile/levels: [
         16/  256 (??/??) ]
  Decoder "c2.mtk.dvhe.dtr.decoder.secure" supports
    profile/levels: [
         16/  256 (??/??) ]
  Decoder "c2.mtk.dvhe.st.decoder" supports
    profile/levels: [
        256/  256 (??/??) ]
  Decoder "c2.mtk.dvhe.st.decoder.secure" supports
    profile/levels: [
        256/  256 (??/??) ]
  Decoder "c2.mtk.dvhe.stn.decoder" supports
    profile/levels: [
         32/  256 (??/??) ]
  Decoder "c2.mtk.dvhe.stn.decoder.secure" supports
    profile/levels: [
         32/  256 (??/??) ]

I found some relevant discussions in https://github.com/google/ExoPlayer/pull/5438/files#diff-560421c04028f7ac67cf5b8aedd4a2f0e565dd77eff713bcd7f0dbbab8e4e242 Can we apply the above change as a short-term/workaround solution? Screenshot 2024-08-22 at 15 27 05

CC @aujohn @andrewlewis

Jietang126 avatar Aug 22 '24 07:08 Jietang126

@microkatz We need more precise decoding selection, please improve this decoder selection. Otherwise, many developers would have switched to mpv.

FongMi avatar Aug 25 '24 11:08 FongMi

@microkatz Could you please check if this change is acceptable? thanks a lot.

diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java
index 8c45615ba3..d2228cdc45 100644
--- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java
+++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java
@@ -460,7 +460,9 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer implements Video
         if (otherDecoderInfo.isFormatSupported(format)) {
           decoderInfo = otherDecoderInfo;
           isFormatSupported = true;
-          isPreferredDecoder = false;
+          if (!MimeTypes.VIDEO_DOLBY_VISION.equals(format.sampleMimeType)) {
+            isPreferredDecoder = false;
+          }
           break;
         }
       }

Jietang126 avatar Sep 12 '24 08:09 Jietang126