jellyfin / jellyfin-androidtv

Android TV Client for Jellyfin
https://jellyfin.org
GNU General Public License v2.0
2.68k stars 457 forks source link

HEVC level 156 always transcoding on supported devices #3380

Open VampiricAlien opened 6 months ago

VampiricAlien commented 6 months ago

Describe the bug

I knew something was going on when the media was slow to play or the subtitles skipped ahead.

Reason for transcoding: The video codec's level is not supported

I think this https://github.com/jellyfin/jellyfin-androidtv/pull/3281 has effected HEVC support on devices that once supported it.

Codec: HEVC Profile: Main 10 Level: 156 Resolution: 1920x1080 Aspect ratio: 16:9

@lawadr @nielsvanvelzen pinging both of you because the pull request has effected playback.

Logs

Stream mapping: Stream #0:0 -> #0:0 (hevc (native) -> h264 (libx264)) Stream #0:1 -> #0:1 (copy) Press [q] to stop, [?] for help [libx264 @ 0x563eef26b080] using SAR=1/1 [libx264 @ 0x563eef26b080] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2 [libx264 @ 0x563eef26b080] profile Main, level 4.0, 4:2:0, 8-bit

"SupportsTranscoding":true,"SupportsDirectStream":true,"SupportsDirectPlay":true

Application version

v0.16.5

Where did you install the app from?

Sideloaded APK

Device information

Shield

Android version

Android 11

Jellyfin server version

10.8.13

lawadr commented 6 months ago

This is odd. The only thing I can think of is that MediaCodec is reporting a lower level than is really supported, causing transcoding. But even that I can't believe is true.

Level 156 is profile level 5.2, which the Shield should definitely support. Does logcat show the device profile being sent to the server? Or maybe the server logs show it. This would certainly help narrow down the problem.

I'll take a look to see what could be causing this, even though I don't have a Shield to test on.

lawadr commented 6 months ago

I don't think this affects the behaviour, but @nielsvanvelzen cherry picked the first commit in that PR for v0.16.5 rather than all of them. Therefore v0.16.5 contains the initial unfixed-up version of my change. I assume this was a mistake.

As I said, shouldn't affect anything, but more confusing to debug.

lawadr commented 6 months ago

Is there any chance you can run dumpsys media.player in an adb shell and attach the result? This should dump exactly what MediaCodec reports as supported on the device.

VampiricAlien commented 6 months ago

Nothing transcoded before last update, Does this help?

  Decoder "OMX.Nvidia.h265.decode" supports
    aliases: []
    attributes: 0xa: [
      encoder: 0,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: [
          1/131072 (Main/High 5.1),
          2/131072 (Main10/High 5.1),
       4096/131072 (Main10HDR10/High 5.1) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x15 (YUV420SemiPlanar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-120000000"
        string block-size = "16x16"
        string blocks-per-second-range = "1-2000000"
        int32_t feature-adaptive-playback = 0
        int32_t feature-low-latency = 0
        string measured-frame-rate-1280x720-range = "1030-1030"
        string measured-frame-rate-1920x1088-range = "409-589"
        string measured-frame-rate-352x288-range = "2239-2239"
        string measured-frame-rate-640x368-range = "1950-1950"
        string performance-point-3840x2160-range = "60-60"
        string size-range = "144x144-3840x2176"
      }
  Decoder "OMX.Nvidia.h265.decode.secure" supports
    aliases: []
    attributes: 0xa: [
      encoder: 0,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: [
          1/131072 (Main/High 5.1),
          2/131072 (Main10/High 5.1),
       4096/131072 (Main10HDR10/High 5.1) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x15 (YUV420SemiPlanar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-120000000"
        string block-size = "16x16"
        string blocks-per-second-range = "1-2000000"
        int32_t feature-adaptive-playback = 0
        int32_t feature-secure-playback = 1
        string performance-point-3840x2160-range = "60-60"
        string size-range = "144x144-3840x2176"
      }
  Decoder "OMX.google.hevc.decoder" supports
    aliases: []
    attributes: 0: [
      encoder: 0,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 528
    profile/levels: [
          1/65536 (Main/Main 5.1),
          4/65536 (MainStill/Main 5.1) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x13 (YUV420Planar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-10000000"
        string block-count-range = "1-196608"
        string block-size = "8x8"
        string blocks-per-second-range = "1-2000000"
        int32_t feature-adaptive-playback = 0
        string measured-frame-rate-1280x720-range = "120-140"
        string measured-frame-rate-1920x1080-range = "63-78"
        string measured-frame-rate-352x288-range = "584-590"
        string measured-frame-rate-640x360-range = "306-319"
        string size-range = "2x2-4096x4096"
      }
nielsvanvelzen commented 6 months ago

I don't think this affects the behaviour, but @nielsvanvelzen cherry picked the first commit in that PR for v0.16.5 rather than all of them. Therefore v0.16.5 contains the initial unfixed-up version of my change. I assume this was a mistake.

It wasn't intentional and I've now cherrypicked the missing commits to make sure they will be in the next 0.16 release.

lawadr commented 6 months ago
  Decoder "OMX.Nvidia.h265.decode" supports
    profile/levels: [
          1/131072 (Main/High 5.1),
          2/131072 (Main10/High 5.1),
       4096/131072 (Main10HDR10/High 5.1) ]

This shows that the device is self reporting a maximum of level 5.1 high tier for the Main 10 profile. This should guarantee support for all high tier and main tier streams at level 5.1 and below.

Your file appears to be encoded at level 5.2 main tier which your device doesn't report to support.

If you have a look at https://en.wikipedia.org/wiki/High_Efficiency_Video_Coding#Tiers_and_levels you can see that 5.2 main tier supports a bitrate of 60,000 kbit/s while 5.1 high tier supports up to 160,000 kbit/s. But as far as I know, a 5.2 encoding can support things that a 5.1 decoder can't handle.

My guess is that the Shield actually supports a higher level main tier than high tier, such as 5.2 main tier and 5.1 high tier, but it's not reporting that fact.

MichaelRUSF commented 6 months ago

The shield probably has hardware decoders for up to 5.1 and software decoding for 5.2. Seems like the same issue with the Fire TV Stick 4K - 2nd Gen (2023). 5.2 now transcodes instead of relying on the built-in software decoder.

The device specs even state it only goes up to 5.1 "H.265 (HEVC). Hardware accelerated up to 3840x2160p (4K) @ 60 fps, 35 Mbps, Main 10 Profile Level 5.1, Color space 8-bit and 10-bit input with HDR10, HDR10+, and HLG"

Fire TV Stick's reported capabilities:

Media type 'video/ ':
  Decoder "OMX.MTK.VIDEO.DECODER.HEVC" supports
    aliases: []
    attributes: 0xa: [
      encoder: 0,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: [
          1/    1 (Main/Main 1),
          1/    2 (Main/High 1),
          1/    4 (Main/Main 2),
          1/    8 (Main/High 2),
          1/   16 (Main/Main 2.1),
          1/   32 (Main/High 2.1),
          1/   64 (Main/Main 3),
          1/  128 (Main/High 3),
          1/  256 (Main/Main 3.1),
          1/  512 (Main/High 3.1),
          1/ 1024 (Main/Main 4),
          1/ 2048 (Main/High 4),
          1/ 4096 (Main/Main 4.1),
          1/ 8192 (Main/High 4.1),
          1/16384 (Main/Main 5),
          1/32768 (Main/High 5),
          1/65536 (Main/Main 5.1),
          1/131072 (Main/High 5.1),
          2/    1 (Main10/Main 1),
          2/    2 (Main10/High 1),
          2/    4 (Main10/Main 2),
          2/    8 (Main10/High 2),
          2/   16 (Main10/Main 2.1),
          2/   32 (Main10/High 2.1),
          2/   64 (Main10/Main 3),
          2/  128 (Main10/High 3),
          2/  256 (Main10/Main 3.1),
          2/  512 (Main10/High 3.1),
          2/ 1024 (Main10/Main 4),
          2/ 2048 (Main10/High 4),
          2/ 4096 (Main10/Main 4.1),
          2/ 8192 (Main10/High 4.1),
          2/16384 (Main10/Main 5),
          2/32768 (Main10/High 5),
          2/65536 (Main10/Main 5.1),
          2/131072 (Main10/High 5.1),
       4096/    1 (Main10HDR10/Main 1),
       4096/    2 (Main10HDR10/High 1),
       4096/    4 (Main10HDR10/Main 2),
       4096/    8 (Main10HDR10/High 2),
       4096/   16 (Main10HDR10/Main 2.1),
       4096/   32 (Main10HDR10/High 2.1),
       4096/   64 (Main10HDR10/Main 3),
       4096/  128 (Main10HDR10/High 3),
       4096/  256 (Main10HDR10/Main 3.1),
       4096/  512 (Main10HDR10/High 3.1),
       4096/ 1024 (Main10HDR10/Main 4),
       4096/ 2048 (Main10HDR10/High 4),
       4096/ 4096 (Main10HDR10/Main 4.1),
       4096/ 8192 (Main10HDR10/High 4.1),
       4096/16384 (Main10HDR10/Main 5),
       4096/32768 (Main10HDR10/High 5),
       4096/65536 (Main10HDR10/Main 5.1),
       4096/131072 (Main10HDR10/High 5.1),
       8192/    1 (Main10HDR10Plus/Main 1),
       8192/    2 (Main10HDR10Plus/High 1),
       8192/    4 (Main10HDR10Plus/Main 2),
       8192/    8 (Main10HDR10Plus/High 2),
       8192/   16 (Main10HDR10Plus/Main 2.1),
       8192/   32 (Main10HDR10Plus/High 2.1),
       8192/   64 (Main10HDR10Plus/Main 3),
       8192/  128 (Main10HDR10Plus/High 3),
       8192/  256 (Main10HDR10Plus/Main 3.1),
       8192/  512 (Main10HDR10Plus/High 3.1),
       8192/ 1024 (Main10HDR10Plus/Main 4),
       8192/ 2048 (Main10HDR10Plus/High 4),
       8192/ 4096 (Main10HDR10Plus/Main 4.1),
       8192/ 8192 (Main10HDR10Plus/High 4.1),
       8192/16384 (Main10HDR10Plus/Main 5),
       8192/32768 (Main10HDR10Plus/High 5),
       8192/65536 (Main10HDR10Plus/Main 5.1),

 Decoder "c2.android.hevc.decoder" supports
    aliases: [
      "OMX.google.hevc.decoder" ]
    attributes: 0x4: [
      encoder: 0,
      vendor: 0,
      software-only: 1,
      hw-accelerated: 0 ]
    owner: "codec2::software"
    rank: 512
    profile/levels: [
          1/524288 (Main/High 5.2),
          4/524288 (MainStill/High 5.2)
lawadr commented 6 months ago

The shield probably has hardware decoders for up to 5.1 and software decoding for 5.2. Seems like the same issue with the Fire TV Stick 4K - 2nd Gen (2023). 5.2 now transcodes instead of relying on the built-in software decoder.

I don't think this is the case because all decoders are checked for the maximum, including software decoders.

From the information that @VampiricAlien provided, the software decoder on the Shield can't even handle Main 10 profile, which is what we're looking at. It supports only up to 5.1 main tier for the Main profile, while the hardware decoder supports up to 5.1 high tier for both Main and Main 10.

From the information you've provided from the Fire TV Stick 4K - 2nd Gen (2023), the software decoder supports only up to 5.2 high tier for the Main profile (and not the Main 10 profile). The hardware decoder supports up to 5.1 high tier for both Main and Main 10, which is the same as the Shield.

If you are also talking about a Main 10 level 5.2 main tier video stream, like @VampiricAlien is, then neither the Fire TV Stick 4K or the Shield seems to be reporting support for this. This indicates nothing in the logic of the change is broken as such, just that both devices seem to support beyond what they claim.

The previous behaviour for the Android TV client was to accept any HEVC Main stream if any HEVC decoder exists (practically all devices), and HEVC Main 10 if profile level 5 main tier is supported for it. The behaviour now is base support for both Main and Main 10 on the maximum level supported by any decoder. Therefore transcoding would be expected based on given the source file and reported decoder support.

MichaelRUSF commented 6 months ago

Yeah, you are correct. I failed to notice that the software encoder was Main not Main10.

Current: Main 5.2 plays without transcoding Main10 5.2 transcodes

Without the level checks in the prior build, Main10 5.2 played without transcoding.

lawadr commented 6 months ago

Here are some solutions:

  1. Do nothing and report issues to the device manufacturers to fix their media configs
  2. Remove the limit when the device reports a specific level or higher, such as 5.1 high tier
  3. Remove the limit for specific device IDs
VampiricAlien commented 6 months ago

Here are some solutions:

1. Do nothing and report issues to the device manufacturers to fix their media configs

2. Remove the limit when the device reports a specific level or higher, such as 5.1 high tier

3. Remove the limit for specific device IDs

I don't see option 1 happening anytime soon, upgrade hardware should solved it but this might not be an option for everyone. Since the update, I never hand an issue with HEVC main 10 level 5.1. ( as you said that both devices seem to support beyond what they claim), I am open to temp solution if needed.

VampiricAlien commented 6 months ago

v0.16.6 doesn't fix this issue, is there a workaround?

lawadr commented 6 months ago

v0.16.6 doesn't fix this issue, is there a workaround?

I'm struggling to find any information about what profile levels are supported on the Shield. I can't find a source that it supports HEVC Main 10 5.2. My concern is that you can get your specific media to play back on it, but other valid 5.2 media will fail.

VampiricAlien commented 6 months ago

Tegra X1 (CPU) supports decode of 10-bit H.265 video streams, like you I can not find any more information out about levels.

Before the patch level 5.1 played without issue.

lawadr commented 6 months ago

Before the patch level 5.1 played without issue.

Hang on. Your original post says that your media file is Main10 level 5.2, not level 5.1. Does 5.1 work? It definitely should.

If you do still mean 5.2 as your original post states, are you sure the Shield handles all 5.2 media? Have you tried playing back a UHD/4k stream on it? Give this file a try: http://www.larmoire.info/jellyfish/media/jellyfish-200-mbps-4k-uhd-hevc-10bit.mkv

Most (if not all?) streaming devices don't support HEVC level 5.2 because UHD Blu-rays are only 5.1. I can't think of many use cases right now for a streaming device to handle more than that considering the lack of content better than a UHD Blu-ray out there. In fact, HEVC level 5.2 is a very odd choice for 1080p content.

thornbill commented 6 months ago

We also host copies of the jellyfish samples if needed: https://repo.jellyfin.org/jellyfish/

VampiricAlien commented 6 months ago

Before the patch level 5.1 played without issue.

Hang on. Your original post says that your media file is Main10 level 5.2, not level 5.1. Does 5.1 work? It definitely should.

If you do still mean 5.2 as your original post states, are you sure the Shield handles all 5.2 media? Have you tried playing back a UHD/4k stream on it? Give this file a try: http://www.larmoire.info/jellyfish/media/jellyfish-200-mbps-4k-uhd-hevc-10bit.mkv

Most (if not all?) streaming devices don't support HEVC level 5.2 because UHD Blu-rays are only 5.1. I can't think of many use cases right now for a streaming device to handle more than that considering the lack of content better than a UHD Blu-ray out there. In fact, HEVC level 5.2 is a very odd choice for 1080p content.

Sorry, level 5.2. was working before the patch. Level wasn't an issue so never though much of it until now. I've updated the Level to 5.0, this won't change the fact that many will transcode now.

0.16 Beta 4:  The source file is entirely compatible with this client, and the session is receiving the file without modifications.
0.16.6: The video codec's level is not supported

The 4k video file from the link: Reason for transcoding: The video's bitrate exceeds the limit (was on 120Mbit/s, now set to auto, no change) I think this is a device limit as I am unable to play it in the beta app.

Testing 4K files

Codec HEVC
Profile Main 10
Level 150
Resolution 3840x1920
Aspect ratio2:1
Interlaced No
Framerate 23.976025
Bitrate 14271 kbps
Bit depth 10 bit 

Reason for transcoding: The video's bitrate exceeds the limit. This plays in the beta app without transcoding.

I always have the beta app install for testing.

nielsvanvelzen commented 6 months ago

The video's bitrate exceeds the limit.

What is the bitrate in the app preferences set to?

VampiricAlien commented 6 months ago

The video's bitrate exceeds the limit.

What is the bitrate in the app preferences set to?

Was set to 120, now set to auto.

120Mbit/s is the highest, is this set by my the device or app?

lawadr commented 6 months ago

I've updated the Level to 5.0, this won't change the fact that many will transcode now.

What does this mean? You've updated what to 5.0?

The 4k video file from the link: Reason for transcoding: The video's bitrate exceeds the limit (was on 120Mbit/s, now set to auto, no change) I think this is a device limit as I am unable to play it in the beta app.

I think there's a 100mbit/s limit hardcoded in the client for direct played files, and 20mbit/s for transcoded streams. What I meant was to copy the file to the device, or put it on a USB stick or something, and try playing it in some local player to see if the hardware can do it. I'm pretty sure you'll find it won't play back properly, or at the very best it'll stutter badly. That's likely the reason the device doesn't advertise level 5.2.

Testing 4K files

Codec HEVC
Profile Main 10
Level 150
Resolution 3840x1920
Aspect ratio2:1
Interlaced No
Framerate 23.976025
Bitrate 14271 kbps
Bit depth 10 bit 

Reason for transcoding: The video's bitrate exceeds the limit. This plays in the beta app without transcoding.

That's a 5.0 file. We're trying to test for 5.2 support.

VampiricAlien commented 6 months ago

@lawadr I understand we're testing support for Level 5.2, The level 150 was to show it plays in the beta app without transcode but in 0.16.6 because of the bitrate it transcodes. Possibly a new issue.

The Video file played without problem in VLC (as expected) testing using device player, playback wasn't smooth in the beginning but came right in the middle.

I downloaded jellyfish-160-mbps-4k-uhd-hevc-10bit.mkv and give that a try, it plays better the other file, 40Mb/s less made a little deference. It would seem like you said it's hard coded to 100Mb/s.

Where do we go from here? We have tested Nvdia Shield android 11 device to find it supports up to HEVC level 5.1 and has a hard coded bitrate limited of 120mb/s.

further more, the app used to play anything HEVC @ level 5.2. I do not know how.

MichaelRUSF commented 6 months ago

First off let me say that 99.99% of my HEVC media is under Main10 5.1 and I have no issues playing them back. I was only able to find two files in my library that exceeded those limits, one HEVC Main 10 5.2 and one HEVC Main 10 6.1 file.

I’ve also been testing out this issue on different devices so let me limit this to my Sony X90J TV. It has a MediaTek MT5895, which supports “HEVC: 8K@60fps”. That should be at level 6.1 if I’m reading this table correctly.

With the level checks in place, I get limited to 5.2 level for both HEVC Main & Main10. Meaning any level higher than 5.2 gets transcoded, 5.2 and below direct plays. Both HEVC Main & Main10 6.1 sample media files will play directly with no issues if I bypass the level checks.

Dumpsys media.player comes back empty so I can’t tell what the TV is reporting as its capabilities, but it’s probably up to level 5.2 based on when transcoding begins. Even though I can play 6.1 Main and Main10 files directly.

To me, the ideal solution would be to have a user-adjustable menu. With the default option of auto, which would be set to the levels checks. Then the user could override it and choose their max level, very similar to how Plex handles h264 levels.

VampiricAlien commented 6 months ago

First off let me say that 99.99% of my HEVC media is under Main10 5.1 and I have no issues playing them back. I was only able to find two files in my library that exceeded those limits, one HEVC Main 10 5.2 and one HEVC Main 10 6.1 file.

I’ve also been testing out this issue on different devices so let me limit this to my Sony X90J TV. It has a MediaTek MT5895, which supports “HEVC: 8K@60fps”. That should be at level 6.1 if I’m reading this table correctly.

With the level checks in place, I get limited to 5.2 level for both HEVC Main & Main10. Meaning any level higher than 5.2 gets transcoded, 5.2 and below direct plays. Both HEVC Main & Main10 6.1 sample media files will play directly with no issues if I bypass the level checks.

Dumpsys media.player comes back empty so I can’t tell what the TV is reporting as its capabilities, but it’s probably up to level 5.2 based on when transcoding begins. Even though I can play 6.1 Main and Main10 files directly.

To me, the ideal solution would be to have a user-adjustable menu. With the default option of auto, which would be set to the levels checks. Then the user could override it and choose their max level, very similar to how Plex handles h264 levels.

This would be an acceptable solution to this issue, in app setting or server setting?

MichaelRUSF commented 6 months ago

@VampiricAlien That would be an app-based solution, but that's just an idea, no one is working on it. Would you mind attaching the entire dumpsys media.player for your shield? I'd like to know what's it reporting for other decoders. And which version of the shield do you have?

Also, you shouldn't use the auto bitrate option, stick with 120, and you'll get the best results. It's been removed as an option for the .17 release.

VampiricAlien commented 6 months ago
Client
  pid(4516), connId(1), status(0), looping(false)
 NuPlayer
  state(4), atEOS(0), looping(0), autoLoop(0)
 AudioOutput
  stream type(3), left - right volume(1.000000, 1.000000)
  msec per frame(0.000000), latency (-1)
  aux effect id(0), send level (0.000000)

 5 registered handlers:
  1: MediaClock: 0 messages processed
  2: NuPlayerDriver Looper: 7 messages processed
  3: generic: 2 messages processed
  16: <stale>
  17: <stale>

Decoder infos by media types:
=============================

Media type 'audio/3gpp':
  Decoder "OMX.google.amrnb.decoder" supports
    aliases: []
    attributes: 0: [
      encoder: 0,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 16
    profile/levels: []
    colors: []
    details: AMessage(what = 0x00000000) = {
        string bitrate-range = "4750-12200"
        string max-channel-count = "1"
        string sample-rate-ranges = "8000"
      }

Media type 'audio/amr-wb':
  Decoder "OMX.google.amrwb.decoder" supports
    aliases: []
    attributes: 0: [
      encoder: 0,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 16
    profile/levels: []
    colors: []
    details: AMessage(what = 0x00000000) = {
        string bitrate-range = "6600-23850"
        string max-channel-count = "1"
        string sample-rate-ranges = "16000"
      }

Media type 'audio/flac':
  Decoder "OMX.google.flac.decoder" supports
    aliases: []
    attributes: 0: [
      encoder: 0,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 16
    profile/levels: []
    colors: []
    details: AMessage(what = 0x00000000) = {
        string bitrate-range = "1-21000000"
        string max-channel-count = "8"
        string sample-rate-ranges = "1-655350"
      }

Media type 'audio/g711-alaw':
  Decoder "OMX.google.g711.alaw.decoder" supports
    aliases: []
    attributes: 0: [
      encoder: 0,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 16
    profile/levels: []
    colors: []
    details: AMessage(what = 0x00000000) = {
        string bitrate-range = "64000"
        string max-channel-count = "6"
        string sample-rate-ranges = "8000-48000"
      }

Media type 'audio/g711-mlaw':
  Decoder "OMX.google.g711.mlaw.decoder" supports
    aliases: []
    attributes: 0: [
      encoder: 0,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 16
    profile/levels: []
    colors: []
    details: AMessage(what = 0x00000000) = {
        string bitrate-range = "64000"
        string max-channel-count = "6"
        string sample-rate-ranges = "8000-48000"
      }

Media type 'audio/mp4a-latm':
  Decoder "OMX.google.aac.decoder" supports
    aliases: []
    attributes: 0: [
      encoder: 0,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 16
    profile/levels: [
          2/    0 (LC/??),
          5/    0 (HE/??),
         29/    0 (HE_PS/??),
         23/    0 (LD/??),
         39/    0 (ELD/??),
         20/    0 (ERScalable/??),
         42/    0 (XHE/??) ]
    colors: []
    details: AMessage(what = 0x00000000) = {
        string bitrate-range = "8000-960000"
        string max-channel-count = "8"
        string sample-rate-ranges = "7350,8000,11025,12000,16000,22050,24000,32000,44100,48000"
      }

Media type 'audio/mpeg':
  Decoder "OMX.google.mp3.decoder" supports
    aliases: []
    attributes: 0: [
      encoder: 0,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 16
    profile/levels: []
    colors: []
    details: AMessage(what = 0x00000000) = {
        string bitrate-range = "8000-320000"
        string max-channel-count = "2"
        string sample-rate-ranges = "8000,11025,12000,16000,22050,24000,32000,44100,48000"
      }

Media type 'audio/mpeg-L2':
  Decoder "OMX.Nvidia.mp2.decoder" supports
    aliases: []
    attributes: 0xa: [
      encoder: 0,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: []
    colors: []
    details: AMessage(what = 0x00000000) = {
        string bitrate-range = "8000-384000"
        string max-channel-count = "6"
        string sample-rate-ranges = "16000,22050,24000,32000,44100,48000"
      }

Media type 'audio/opus':
  Decoder "OMX.google.opus.decoder" supports
    aliases: []
    attributes: 0: [
      encoder: 0,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 16
    profile/levels: []
    colors: []
    details: AMessage(what = 0x00000000) = {
        string bitrate-range = "6000-510000"
        string max-channel-count = "8"
        string sample-rate-ranges = "8000,12000,16000,24000,48000"
      }

Media type 'audio/raw':
  Decoder "OMX.google.raw.decoder" supports
    aliases: []
    attributes: 0: [
      encoder: 0,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 16
    profile/levels: []
    colors: []
    details: AMessage(what = 0x00000000) = {
        string bitrate-range = "1-10000000"
        string max-channel-count = "8"
        string sample-rate-ranges = "8000-192000"
      }

Media type 'audio/vorbis':
  Decoder "OMX.google.vorbis.decoder" supports
    aliases: []
    attributes: 0: [
      encoder: 0,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 16
    profile/levels: []
    colors: []
    details: AMessage(what = 0x00000000) = {
        string bitrate-range = "32000-500000"
        string max-channel-count = "8"
        string sample-rate-ranges = "8000-96000"
      }

Media type 'audio/x-ms-wma':
  Decoder "OMX.Nvidia.wma.decoder" supports
    aliases: []
    attributes: 0xa: [
      encoder: 0,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: []
    colors: []
    details: AMessage(what = 0x00000000) = {
        string bitrate-range = "8000-384000"
        string max-channel-count = "6"
        string sample-rate-ranges = "16000,22050,24000,32000,44100,48000"
      }

Media type 'video/3gpp':
  Decoder "OMX.Nvidia.h263.decode" supports
    aliases: []
    attributes: 0xa: [
      encoder: 0,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: [
          1/   32 (Baseline/50) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x15 (YUV420SemiPlanar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        int32_t feature-adaptive-playback = 0
        string measured-frame-rate-176x144-range = "2335-2335"
        string measured-frame-rate-352x288-range = "1492-1950"
        string performance-point-1920x1080-range = "240-240"
        string size-range = "48x48-720x576"
      }
  Decoder "OMX.google.h263.decoder" supports
    aliases: []
    attributes: 0: [
      encoder: 0,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 528
    profile/levels: [
          1/    4 (Baseline/30),
          1/   16 (Baseline/45),
          8/    4 (ISWV2/30),
          8/   16 (ISWV2/45) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x13 (YUV420Planar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-384000"
        int32_t feature-adaptive-playback = 0
        string measured-frame-rate-176x144-range = "1122-1187"
        string measured-frame-rate-352x288-range = "720-820"
        string size-range = "2x2-352x288"
      }

Media type 'video/avc':
  Decoder "OMX.Nvidia.h264.decode" supports
    aliases: []
    attributes: 0xa: [
      encoder: 0,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: [
          1/32768 (Baseline/5.1),
      65536/32768 (ConstrainedBaseline/5.1),
          2/65536 (Main/5.2),
          8/65536 (High/5.2),
      524288/65536 (ConstrainedHigh/5.2) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x15 (YUV420SemiPlanar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-120000000"
        string block-size = "16x16"
        string blocks-per-second-range = "1-2000000"
        int32_t feature-adaptive-playback = 0
        int32_t feature-low-latency = 0
        string measured-frame-rate-1280x720-range = "811-811"
        string measured-frame-rate-1920x1088-range = "346-346"
        string measured-frame-rate-320x240-range = "2273-2273"
        string measured-frame-rate-720x480-range = "1413-1413"
        string performance-point-1920x1080-range = "240-240"
        string performance-point-3840x2160-range = "60-60"
        string size-range = "48x48-3840x2176"
      }
  Decoder "OMX.Nvidia.h264.decode.secure" supports
    aliases: []
    attributes: 0xa: [
      encoder: 0,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: [
          1/32768 (Baseline/5.1),
      65536/32768 (ConstrainedBaseline/5.1),
          2/65536 (Main/5.2),
          8/65536 (High/5.2),
      524288/65536 (ConstrainedHigh/5.2) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x15 (YUV420SemiPlanar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-120000000"
        string block-size = "16x16"
        string blocks-per-second-range = "1-2000000"
        int32_t feature-adaptive-playback = 0
        int32_t feature-secure-playback = 1
        string performance-point-1920x1080-range = "240-240"
        string performance-point-3840x2160-range = "60-60"
        string size-range = "48x48-3840x2176"
      }
  Decoder "OMX.google.h264.decoder" supports
    aliases: []
    attributes: 0: [
      encoder: 0,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 528
    profile/levels: [
      65536/65536 (ConstrainedBaseline/5.2),
          1/65536 (Baseline/5.2),
          2/65536 (Main/5.2),
      524288/65536 (ConstrainedHigh/5.2),
          8/65536 (High/5.2) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x13 (YUV420Planar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-48000000"
        string block-count-range = "1-32768"
        string block-size = "16x16"
        string blocks-per-second-range = "1-1966080"
        int32_t feature-adaptive-playback = 0
        string measured-frame-rate-1280x720-range = "86-96"
        string measured-frame-rate-1920x1080-range = "64-71"
        string measured-frame-rate-320x240-range = "782-782"
        string measured-frame-rate-720x480-range = "227-253"
        string size-range = "2x2-4080x4080"
      }

Media type 'video/dolby-vision':
  Decoder "OMX.Nvidia.DOVI.decode" supports
    aliases: []
    attributes: 0xa: [
      encoder: 0,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: [
         32/  256 (??/??),
        256/  256 (??/??),
        512/  256 (??/??),
         16/  256 (??/??) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x15 (YUV420SemiPlanar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-120000000"
        string block-size = "16x16"
        string blocks-per-second-range = "1-2000000"
        int32_t feature-adaptive-playback = 0
        string measured-frame-rate-1280x720-range = "1030-1030"
        string measured-frame-rate-1920x1088-range = "409-589"
        string measured-frame-rate-352x288-range = "2239-2239"
        string measured-frame-rate-640x368-range = "1950-1950"
        string performance-point-3840x2160-range = "60-60"
        string size-range = "144x144-3840x2176"
      }
  Decoder "OMX.Nvidia.DOVI.decode.secure" supports
    aliases: []
    attributes: 0xa: [
      encoder: 0,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: [
         32/  256 (??/??),
        256/  256 (??/??),
        512/  256 (??/??),
         16/  256 (??/??) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x15 (YUV420SemiPlanar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-120000000"
        string block-size = "16x16"
        string blocks-per-second-range = "1-2000000"
        int32_t feature-adaptive-playback = 0
        int32_t feature-secure-playback = 1
        string performance-point-3840x2160-range = "60-60"
        string size-range = "144x144-3840x2176"
      }

Media type 'video/hevc':
  Decoder "OMX.Nvidia.h265.decode" supports
    aliases: []
    attributes: 0xa: [
      encoder: 0,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: [
          1/131072 (Main/High 5.1),
          2/131072 (Main10/High 5.1),
       4096/131072 (Main10HDR10/High 5.1) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x15 (YUV420SemiPlanar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-120000000"
        string block-size = "16x16"
        string blocks-per-second-range = "1-2000000"
        int32_t feature-adaptive-playback = 0
        int32_t feature-low-latency = 0
        string measured-frame-rate-1280x720-range = "1030-1030"
        string measured-frame-rate-1920x1088-range = "409-589"
        string measured-frame-rate-352x288-range = "2239-2239"
        string measured-frame-rate-640x368-range = "1950-1950"
        string performance-point-3840x2160-range = "60-60"
        string size-range = "144x144-3840x2176"
      }
  Decoder "OMX.Nvidia.h265.decode.secure" supports
    aliases: []
    attributes: 0xa: [
      encoder: 0,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: [
          1/131072 (Main/High 5.1),
          2/131072 (Main10/High 5.1),
       4096/131072 (Main10HDR10/High 5.1) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x15 (YUV420SemiPlanar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-120000000"
        string block-size = "16x16"
        string blocks-per-second-range = "1-2000000"
        int32_t feature-adaptive-playback = 0
        int32_t feature-secure-playback = 1
        string performance-point-3840x2160-range = "60-60"
        string size-range = "144x144-3840x2176"
      }
  Decoder "OMX.google.hevc.decoder" supports
    aliases: []
    attributes: 0: [
      encoder: 0,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 528
    profile/levels: [
          1/65536 (Main/Main 5.1),
          4/65536 (MainStill/Main 5.1) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x13 (YUV420Planar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-10000000"
        string block-count-range = "1-196608"
        string block-size = "8x8"
        string blocks-per-second-range = "1-2000000"
        int32_t feature-adaptive-playback = 0
        string measured-frame-rate-1280x720-range = "120-140"
        string measured-frame-rate-1920x1080-range = "63-78"
        string measured-frame-rate-352x288-range = "584-590"
        string measured-frame-rate-640x360-range = "306-319"
        string size-range = "2x2-4096x4096"
      }

Media type 'video/mp4v-es':
  Decoder "OMX.Nvidia.mp4.decode" supports
    aliases: []
    attributes: 0xa: [
      encoder: 0,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: [
          1/  128 (Simple/5),
      32768/  128 (AdvancedSimple/5) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x15 (YUV420SemiPlanar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-10000000"
        string block-size = "16x16"
        string blocks-per-second-range = "1-244800"
        int32_t feature-adaptive-playback = 0
        string measured-frame-rate-176x144-range = "2635-2635"
        string measured-frame-rate-480x368-range = "1738-1738"
        string performance-point-1920x1080-range = "240-240"
        string size-range = "48x48-1920x1088"
      }
  Decoder "OMX.google.mpeg4.decoder" supports
    aliases: []
    attributes: 0: [
      encoder: 0,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 528
    profile/levels: [
          1/   16 (Simple/3) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x13 (YUV420Planar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-384000"
        string block-size = "16x16"
        string blocks-per-second-range = "12-11880"
        int32_t feature-adaptive-playback = 0
        string measured-frame-rate-176x144-range = "1140-1194"
        string size-range = "2x2-352x288"
      }

Media type 'video/mpeg2':
  Decoder "OMX.Nvidia.mpeg2v.decode" supports
    aliases: []
    attributes: 0xa: [
      encoder: 0,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: [
          0/    1 (Simple/ML),
          1/    3 (Main/HL) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x15 (YUV420SemiPlanar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-120000000"
        string block-size = "16x16"
        string blocks-per-second-range = "1-2000000"
        int32_t feature-adaptive-playback = 0
        string performance-point-1920x1080-range = "240-240"
        string performance-point-3840x2160-range = "60-60"
        string size-range = "32x32-3840x2176"
      }

Media type 'video/wvc1':
  Decoder "OMX.Nvidia.vc1.decode" supports
    aliases: []
    attributes: 0xa: [
      encoder: 0,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: []
    colors: [
      0x7f420888 (YUV420Flexible),
      0x15 (YUV420SemiPlanar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-120000000"
        string block-size = "16x16"
        string blocks-per-second-range = "1-783360"
        int32_t feature-adaptive-playback = 0
        string performance-point-1920x1080-range = "240-240"
        string size-range = "32x32-3840x2176"
      }

Media type 'video/x-motion-jpeg':
  Decoder "OMX.Nvidia.mjpeg.decoder" supports
    aliases: []
    attributes: 0xa: [
      encoder: 0,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: []
    colors: [
      0x7f420888 (YUV420Flexible),
      0x15 (YUV420SemiPlanar) ]
    details: AMessage(what = 0x00000000) = {
        string block-size = "16x16"
        int32_t feature-adaptive-playback = 0
        string performance-point-1920x1080-range = "30-30"
      }

Media type 'video/x-ms-wmv':
  Decoder "OMX.Nvidia.vc1.decode" supports
    aliases, attributes, owner, rank: see above
    profile/levels: []
    colors: [
      0x7f420888 (YUV420Flexible),
      0x15 (YUV420SemiPlanar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-120000000"
        string block-size = "16x16"
        string blocks-per-second-range = "1-783360"
        int32_t feature-adaptive-playback = 0
        string performance-point-1920x1080-range = "240-240"
        string size-range = "32x32-3840x2176"
      }

Media type 'video/x-vnd.on2.vp8':
  Decoder "OMX.Nvidia.vp8.decode" supports
    aliases: []
    attributes: 0xa: [
      encoder: 0,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: []
    colors: [
      0x7f420888 (YUV420Flexible),
      0x15 (YUV420SemiPlanar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-120000000"
        string block-size = "16x16"
        string blocks-per-second-range = "1-783360"
        int32_t feature-adaptive-playback = 0
        string measured-frame-rate-1280x720-range = "536-536"
        string measured-frame-rate-1920x1088-range = "300-339"
        string measured-frame-rate-320x192-range = "2057-2057"
        string measured-frame-rate-640x368-range = "1438-1438"
        string performance-point-1920x1080-range = "240-240"
        string performance-point-3840x2160-range = "60-60"
        string size-range = "48x48-3840x2176"
      }
  Decoder "OMX.google.vp8.decoder" supports
    aliases: []
    attributes: 0: [
      encoder: 0,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 528
    profile/levels: []
    colors: [
      0x7f420888 (YUV420Flexible),
      0x13 (YUV420Planar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-40000000"
        string block-count-range = "1-16384"
        string block-size = "16x16"
        string blocks-per-second-range = "1-1000000"
        int32_t feature-adaptive-playback = 0
        string max-concurrent-instances = "27"
        string measured-frame-rate-1280x720-range = "67-76"
        string measured-frame-rate-1920x1080-range = "26-29"
        string measured-frame-rate-320x180-range = "990-1087"
        string measured-frame-rate-640x360-range = "324-351"
        string size-range = "2x2-2048x2048"
      }

Media type 'video/x-vnd.on2.vp9':
  Decoder "OMX.Nvidia.vp9.decode" supports
    aliases: []
    attributes: 0xa: [
      encoder: 0,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: [
          1/  512 (0/5.1) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x15 (YUV420SemiPlanar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-120000000"
        string block-size = "16x16"
        string blocks-per-second-range = "1-2000000"
        int32_t feature-adaptive-playback = 0
        string measured-frame-rate-1280x720-range = "643-643"
        string measured-frame-rate-1920x1088-range = "319-319"
        string measured-frame-rate-320x192-range = "3400-3500"
        string measured-frame-rate-640x368-range = "1532-1532"
        string performance-point-3840x2160-range = "60-60"
        string size-range = "144x144-3840x2176"
      }
  Decoder "OMX.Nvidia.vp9.decode.secure" supports
    aliases: []
    attributes: 0xa: [
      encoder: 0,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: [
          1/  512 (0/5.1) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x15 (YUV420SemiPlanar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-120000000"
        string block-size = "16x16"
        string blocks-per-second-range = "1-2000000"
        int32_t feature-adaptive-playback = 0
        int32_t feature-secure-playback = 1
        string performance-point-3840x2160-range = "60-60"
        string size-range = "144x144-3840x2176"
      }
  Decoder "OMX.google.vp9.decoder" supports
    aliases: []
    attributes: 0: [
      encoder: 0,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 528
    profile/levels: [
          1/  256 (0/5),
          4/  256 (2/5),
       4096/  256 (2HDR/5),
      16384/  256 (2HDRPlus/5) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x13 (YUV420Planar) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-40000000"
        string block-count-range = "1-16384"
        string block-size = "16x16"
        string blocks-per-second-range = "1-500000"
        int32_t feature-adaptive-playback = 0
        string measured-frame-rate-1280x720-range = "94-103"
        string measured-frame-rate-1920x1080-range = "52-57"
        string measured-frame-rate-320x180-range = "682-753"
        string measured-frame-rate-640x360-range = "287-313"
        string size-range = "2x2-2048x2048"
      }

Encoder infos by media types:
=============================

Media type 'audio/3gpp':
  Encoder "OMX.google.amrnb.encoder" supports
    aliases: []
    attributes: 0x1: [
      encoder: 1,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 16
    profile/levels: []
    colors: []
    details: AMessage(what = 0x00000000) = {
        string bitrate-range = "4750-12200"
        string feature-bitrate-modes = "CBR"
        string max-channel-count = "1"
        string sample-rate-ranges = "8000"
      }

Media type 'audio/amr-wb':
  Encoder "OMX.google.amrwb.encoder" supports
    aliases: []
    attributes: 0x1: [
      encoder: 1,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 16
    profile/levels: []
    colors: []
    details: AMessage(what = 0x00000000) = {
        string bitrate-range = "6600-23850"
        string feature-bitrate-modes = "CBR"
        string max-channel-count = "1"
        string sample-rate-ranges = "16000"
      }

Media type 'audio/flac':
  Encoder "OMX.google.flac.encoder" supports
    aliases: []
    attributes: 0x1: [
      encoder: 1,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 16
    profile/levels: []
    colors: []
    details: AMessage(what = 0x00000000) = {
        string bitrate-range = "1-21000000"
        string complexity-default = "5"
        string complexity-range = "0-8"
        string feature-bitrate-modes = "CQ"
        string max-channel-count = "2"
        string sample-rate-ranges = "1-655350"
      }

Media type 'audio/mp4a-latm':
  Encoder "OMX.google.aac.encoder" supports
    aliases: []
    attributes: 0x1: [
      encoder: 1,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 16
    profile/levels: [
          2/    0 (LC/??),
          5/    0 (HE/??),
         29/    0 (HE_PS/??),
         23/    0 (LD/??),
         39/    0 (ELD/??) ]
    colors: []
    details: AMessage(what = 0x00000000) = {
        string bitrate-range = "8000-960000"
        string max-channel-count = "6"
        string sample-rate-ranges = "8000,11025,12000,16000,22050,24000,32000,44100,48000"
      }

Media type 'image/vnd.android.heic':
  Encoder "OMX.Nvidia.h265.encoder" supports
    aliases: []
    attributes: 0xb: [
      encoder: 1,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: [
          1/32768 (??/??) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x13 (YUV420Planar),
      0x15 (YUV420SemiPlanar),
      0x7f000789 (Surface),
      0x7ff00100 (??),
      0x7ff00101 (??),
      0x7ff00102 (??),
      0x7ff00103 (??),
      0x7ff00104 (??),
      0x7ff00105 (??) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-50000000"
        string block-size = "16x16"
        string blocks-per-second-range = "1-783360"
        string feature-bitrate-modes = "VBR,CBR,CQ"
        string performance-point-3840x2160-range = "30-30"
        string quality-default = "45"
        string quality-range = "0-100"
        string quality-scale = "linear"
        string size-range = "96x96-3840x2176"
      }

Media type 'video/3gpp':
  Encoder "OMX.google.h263.encoder" supports
    aliases: []
    attributes: 0x1: [
      encoder: 1,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 528
    profile/levels: [
          1/   16 (Baseline/45) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x13 (YUV420Planar),
      0x15 (YUV420SemiPlanar),
      0x7f000789 (Surface) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "16x16"
        string bitrate-range = "1-128000"
        string measured-frame-rate-176x144-range = "643-656"
        string size-range = "176x144-176x144"
      }

Media type 'video/avc':
  Encoder "OMX.Nvidia.h264.encoder" supports
    aliases: []
    attributes: 0xb: [
      encoder: 1,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: [
          8/65536 (High/5.2),
          2/65536 (Main/5.2),
          1/65536 (Baseline/5.2) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x13 (YUV420Planar),
      0x15 (YUV420SemiPlanar),
      0x7f000789 (Surface) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-50000000"
        string block-size = "16x16"
        string blocks-per-second-range = "1-783360"
        string feature-bitrate-modes = "VBR,CBR"
        string measured-frame-rate-1280x720-range = "130-192"
        string measured-frame-rate-1920x1080-range = "70-95"
        string measured-frame-rate-320x240-range = "760-902"
        string measured-frame-rate-720x480-range = "280-387"
        string performance-point-1920x1080-range = "240-240"
        string performance-point-3840x2160-range = "30-30"
        string size-range = "48x48-3840x2176"
      }
  Encoder "OMX.google.h264.encoder" supports
    aliases: []
    attributes: 0x1: [
      encoder: 1,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 528
    profile/levels: [
      65536/ 4096 (ConstrainedBaseline/4.1),
          1/ 4096 (Baseline/4.1),
          2/ 4096 (Main/4.1) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x13 (YUV420Planar),
      0x15 (YUV420SemiPlanar),
      0x7f000789 (Surface) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-12000000"
        string block-count-range = "1-8192"
        string block-size = "16x16"
        string blocks-per-second-range = "1-245760"
        int32_t feature-intra-refresh = 0
        string measured-frame-rate-1280x720-range = "88-112"
        string measured-frame-rate-1920x1080-range = "45-56"
        string measured-frame-rate-320x240-range = "490-610"
        string measured-frame-rate-720x480-range = "170-200"
        string size-range = "16x16-2048x2048"
      }

Media type 'video/hevc':
  Encoder "OMX.Nvidia.h265.encoder" supports
    aliases, attributes, owner, rank: see above
    profile/levels: [
          1/32768 (Main/High 5) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x13 (YUV420Planar),
      0x15 (YUV420SemiPlanar),
      0x7f000789 (Surface),
      0x7ff00100 (??),
      0x7ff00101 (??),
      0x7ff00102 (??),
      0x7ff00103 (??),
      0x7ff00104 (??),
      0x7ff00105 (??) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-50000000"
        string block-size = "16x16"
        string blocks-per-second-range = "1-783360"
        string feature-bitrate-modes = "VBR,CBR,CQ"
        string measured-frame-rate-1280x720-range = "135-171"
        string measured-frame-rate-1920x1080-range = "65-80"
        string measured-frame-rate-320x240-range = "850-982"
        string measured-frame-rate-3840x2160-range = "18-22"
        string measured-frame-rate-720x480-range = "300-364"
        string performance-point-3840x2160-range = "30-30"
        string quality-default = "45"
        string quality-range = "0-100"
        string quality-scale = "linear"
        string size-range = "96x96-3840x2176"
      }

Media type 'video/mp4v-es':
  Encoder "OMX.google.mpeg4.encoder" supports
    aliases: []
    attributes: 0x1: [
      encoder: 1,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 528
    profile/levels: [
          4/    8 (Core/2) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x13 (YUV420Planar),
      0x15 (YUV420SemiPlanar),
      0x7f000789 (Surface) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "16x16"
        string bitrate-range = "1-64000"
        string block-size = "16x16"
        string blocks-per-second-range = "12-1485"
        string measured-frame-rate-176x144-range = "689-754"
        string size-range = "16x16-176x144"
      }

Media type 'video/x-vnd.on2.vp8':
  Encoder "OMX.Nvidia.vp8.encoder" supports
    aliases: []
    attributes: 0xb: [
      encoder: 1,
      vendor: 1,
      software-only: 0,
      hw-accelerated: 1 ]
    owner: "default"
    rank: 256
    profile/levels: [
          1/    1 (Main/V0) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x13 (YUV420Planar),
      0x15 (YUV420SemiPlanar),
      0x7f000789 (Surface) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-50000000"
        string block-size = "16x16"
        string blocks-per-second-range = "1-783360"
        string feature-bitrate-modes = "VBR,CBR"
        string measured-frame-rate-1280x720-range = "114-145"
        string measured-frame-rate-320x180-range = "841-854"
        string measured-frame-rate-640x360-range = "363-421"
        string performance-point-3840x2160-range = "30-30"
        string size-range = "48x48-3840x2176"
      }
  Encoder "OMX.google.vp8.encoder" supports
    aliases: []
    attributes: 0x1: [
      encoder: 1,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 528
    profile/levels: [
          1/    1 (Main/V0),
          1/    2 (Main/V1),
          1/    4 (Main/V2),
          1/    8 (Main/V3) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x13 (YUV420Planar),
      0x15 (YUV420SemiPlanar),
      0x7f000789 (Surface) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-40000000"
        string block-count-range = "1-16384"
        string block-size = "16x16"
        string feature-bitrate-modes = "VBR,CBR"
        string measured-frame-rate-1280x720-range = "35-36"
        string measured-frame-rate-1920x1080-range = "28-28"
        string measured-frame-rate-320x180-range = "242-253"
        string measured-frame-rate-640x360-range = "114-116"
        string size-range = "2x2-2048x2048"
      }

Media type 'video/x-vnd.on2.vp9':
  Encoder "OMX.google.vp9.encoder" supports
    aliases: []
    attributes: 0x1: [
      encoder: 1,
      vendor: 0,
      software-only: 0,
      hw-accelerated: 0 ]
    owner: "default"
    rank: 528
    profile/levels: [
          1/  128 (0/4.1) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x13 (YUV420Planar),
      0x15 (YUV420SemiPlanar),
      0x7f000789 (Surface) ]
    details: AMessage(what = 0x00000000) = {
        string alignment = "2x2"
        string bitrate-range = "1-40000000"
        string block-count-range = "1-3600"
        string block-size = "16x16"
        string feature-bitrate-modes = "VBR,CBR"
        string size-range = "2x2-2048x2048"
      }

 No media recorder client

 Files opened and/or mapped:
  /proc/3375/fd/8 -> /data/app/~~mKbM3aLmd0dExMDREFTz0w==/flar2.homebutton-9BZuD8VrbsDMcgAzCy0Dyg==/base.apk
sif:/ $ 

2019 shield Tegra X1

unrelated, OMX.google.vorbis.decoder, the device has vorbis support but I have notice the app transcode the audio.

VampiricAlien commented 4 months ago

@MichaelRUSF Have been testing different device that says it supports 5.2 but still trancecodes, not sure if this is any help to you

Decoder "c2.android.hevc.decoder" supports
    aliases: [
      "OMX.google.hevc.decoder" ]
    attributes: 0x4: [
      encoder: 0,
      vendor: 0,
      software-only: 1,
      hw-accelerated: 0 ]
    owner: "codec2::software"
    rank: 512
    profile/levels: [
          1/524288 (Main/High 5.2),
          4/524288 (MainStill/High 5.2) ]
    colors: [
      0x7f420888 (YUV420Flexible),
      0x13 (YUV420Planar),
      0x15 (YUV420SemiPlanar),
      0x14 (YUV420PackedPlanar),
      0x27 (YUV420PackedSemiPlanar) ]
    details: AMessage(what = 0x00000000) = {
        string measured-frame-rate-1280x720-range = "28-29"
        string measured-frame-rate-1920x1080-range = "20-20"
        string measured-frame-rate-352x288-range = "105-106"
        string measured-frame-rate-640x360-range = "59-60"
        string measured-frame-rate-720x480-range = "56-57"
        string alignment = "2x2"
        string bitrate-range = "1-5000000"
        string block-count-range = "1-65536"
        string block-size = "8x8"
        string blocks-per-second-range = "1-491520"
        int32_t feature-adaptive-playback = 0
        string size-range = "2x2-2048x2048"
      }
williamthrilliam commented 4 weeks ago

Can confirm HEVC main 10 level 5.2 does not direct play on the shield pro using the jellyfin app. I can use the external player "just player" and it works just fine.

Logs:

[2024-08-16 19:29:36.933 -05:00] [INF] "/usr/lib/jellyfin-ffmpeg/ffmpeg" "-analyzeduration 200M -probesize 1G -init_hw_device vaapi=va:,kernel_driver=i915,driver=iHD -init_hw_device qsv=qs@va -filter_hw_device qs -hwaccel vaapi -hwaccel_output_format vaapi -noautorotate -i file:\"/downloads/done/Empire.Strikes.Back.4K80.2160p.UHD.no-DNR.35mm.x265-v1.0/03 Empire.Strikes.Back.4K80.2160p.UHD.no-DNR.35mm.x265-v1.0.mkv\" -noautoscale -map_metadata -1 -map_chapters -1 -threads 0 -map 0:0 -map 0:2 -map -0:s -codec:v:0 hevc_qsv -tag:v:0 hvc1 -low_power 1 -preset veryslow -b:v 66645189 -maxrate 66645189 -bufsize 133290378 -profile:v:0 main -level 50 -g:v:0 72 -keyint_min:v:0 72 -vf \"setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709,scale_vaapi=format=nv12:extra_hw_frames=24,hwmap=derive_device=qsv,format=qsv\" -codec:a:0 copy -copyts -avoid_negative_ts disabled -max_muxing_queue_size 2048 -f hls -max_delay 5000000 -hls_time 3 -hls_segment_type mpegts -start_number 0 -hls_segment_filename \"/var/lib/jellyfin/transcodes/73bcedeaebcc82e53f2ab9946dee9eb6%d.ts\" -hls_playlist_type vod -hls_list_size 0 -y \"/var/lib/jellyfin/transcodes/73bcedeaebcc82e53f2ab9946dee9eb6.m3u8\""
[2024-08-16 19:29:41.479 -05:00] [INF] Stopping ffmpeg process with q command for "/var/lib/jellyfin/transcodes/73bcedeaebcc82e53f2ab9946dee9eb6.m3u8"
[2024-08-16 19:29:41.644 -05:00] [INF] FFmpeg exited with code 0

FFMPEG

Stream #0:0(eng): Video: hevc (Main 10), yuv420p10le(tv, bt709), 3840x2160 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn (default)
    Metadata:
      BPS             : 52982644
      DURATION        : 02:05:59.302000000
      NUMBER_OF_FRAMES: 181242
      NUMBER_OF_BYTES : 50063976014
      _STATISTICS_WRITING_APP: mkvmerge v82.0 ('I'm The President') 64-bit
      _STATISTICS_WRITING_DATE_UTC: 2024-02-12 17:38:32
      _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
  Stream #0:1(eng): Audio: dts (DTS-HD MA), 48000 Hz, stereo, s16p (default)
    Metadata:
      title           : 35mm Mix (Laserdisc Sourced, Adjusted by Hairy Hen to match the 35mm optical sound)
      BPS             : 929200
      DURATION        : 02:04:53.206000000
      NUMBER_OF_FRAMES: 702488
      NUMBER_OF_BYTES : 870336168
      _STATISTICS_WRITING_APP: mkvmerge v82.0 ('I'm The President') 64-bit
      _STATISTICS_WRITING_DATE_UTC: 2024-02-12 17:38:32
      _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
---
Stream mapping:
  Stream #0:0 -> #0:0 (hevc (native) -> hevc (hevc_qsv))
  Stream #0:2 -> #0:1 (copy)
Press [q] to stop, [?] for help
libva info: VA-API version 1.22.0
libva info: Trying to open /usr/lib/jellyfin-ffmpeg/lib/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_22
libva info: va_openDriver() returns 0
libva info: VA-API version 1.22.0
libva info: Trying to open /usr/lib/jellyfin-ffmpeg/lib/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_22
libva info: va_openDriver() returns 0
Output #0, hls, to '/var/lib/jellyfin/transcodes/73bcedeaebcc82e53f2ab9946dee9eb6.m3u8':
  Metadata:
    encoder         : Lavf60.3.100
  Stream #0:0: Video: hevc (hvc1 / 0x31637668), qsv(tv, bt709, progressive), 3840x2160 [SAR 1:1 DAR 16:9], q=2-31, 66645 kb/s, 23.98 fps, 90k tbn (default)
    Metadata:
      encoder         : Lavc60.3.100 hevc_qsv
    Side data:
      cpb: bitrate max/min/avg: 66645189/0/66645189 buffer size: 133290378 vbv_delay: N/A
  Stream #0:1: Audio: ac3, 48000 Hz, stereo, fltp, 384 kb/s (default)
frame=    0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A speed=   0x 
nwg5817 commented 3 weeks ago

Is there any fix in the works? Do we have to use external players on the Shield now?

Can we please take option 3 in the short term, the shield is ubiquitous as is the fire stick. That or an option to manually select hevc level? I remember that option existing at some point... Maybe on the JF tizen fork? That or it was on android tv/jf Plex app.