Augmented Device Profiles -- what / why are they used -- causing Chromecast 'not powerful enough'

I’m having trouble casting a particular video to Chromecast, resulting in a ‘This server is not powerful enough to convert video’. I have all my quality settings set to ‘Original’ and ‘DirectPlay’. I get the same error casting to Chromecast from the Plex web app and my android devices.

This same video can be cast correctly to Chromecast using Universal Media Server; it has a bitrate at about 21.4Mbps. I have a Chromecast 2.

When looking in the media server logs, I see this:

INFO - [Chromecast] [MDE] Augmented profile: { "directPlay": { "mp4": { "mimeType": "video/mp4; codecs=\"avc1.42E01E\"", "video": { "codecs": { "h264": {} }, "maxBitDepth": 8, "maxFrameRate": 60, "maxLevel": 42, ....

Note the 42.

Here’s the failure sequence:

WARN - [Chromecast] [MDE] Invalid profile property; level: 50 > 42
Mar 13, 2017 11:44:29.596 [0x312bf400] VERBOSE - [Chromecast] [MDE] Analyzing video direct stream
Mar 13, 2017 11:44:29.636 [0x34063400] DEBUG - Created thumbnail of size 1280x720, has pixels: 1
Mar 13, 2017 11:44:29.650 [0x2f467400] WARN - [Chromecast] [MDE] Invalid profile property; level: 50 > 42
Mar 13, 2017 11:44:29.687 [0x359f3400] DEBUG - Created thumbnail of size 300x450, has pixels: 1
Mar 13, 2017 11:44:29.739 [0x2f177400] DEBUG - Completed after connection close: [192.168.2.103:46650] 200 GET /photo/:/transcode?url=http%3A%2F%2F127.0.0.1%3A32400%2Flibrary%2Fmetadata%2F1034%2Fthumb%2F1489420490%3FX-Plex-Token%3Dxxxxxxxxxxxxxxxxxxxxebb-4c0d-82da-17bbb279cd37&width=300&height=450&minSize=1 (17 live) TLS GZIP 2250ms 129 bytes (pipelined: 2)
Mar 13, 2017 11:44:29.747 [0x3357b400] VERBOSE - [Chromecast] [MDE] Analyzing audio direct stream
Mar 13, 2017 11:44:29.783 [0x31fdb400] VERBOSE - [Chromecast] [MDE] Analyzing playability
Mar 13, 2017 11:44:29.852 [0x312bf400] WARN - [Chromecast] [MDE] Unable to play; server unable to transcode video
Mar 13, 2017 11:44:29.936 [0x365c3400] INFO - [Chromecast] [MDE] Finished analysis of 1080 (mp4, h264, aac, 50, high)
Mar 13, 2017 11:44:30.005 [0x359f3400] INFO - [Chromecast] canPlay: false
Mar 13, 2017 11:44:30.038 [0x2ec1b400] DEBUG - Completed: [192.168.2.103:46658] 200 GET /photo/:/transcode?url=http%3A%2F%2F127.0.0.1%3A32400%2Flibrary%2Fmetadata%2F1034%2Fart%2F1489420490%3FX-Plex-Token%3Dxxxxxxxxxxxxxxxxxxxxc7a-4cf5-a376-cd449c006f45&width=1920&height=1080 (17 live) TLS GZIP 958ms 195848 bytes (pipelined: 1)
Mar 13, 2017 11:44:30.080 [0x34943400] INFO - [Chromecast] canDirectPlay: false
Mar 13, 2017 11:44:30.148 [0x34c33400] INFO - [Chromecast] canDirectStreamVideo: false
Mar 13, 2017 11:44:30.215 [0x2f467400] INFO - [Chromecast] canDirectStreamAudio: true
Mar 13, 2017 11:44:30.288 [0x33bef400] INFO - [Chromecast] bitrate: 21416
Mar 13, 2017 11:44:30.359 [0x34063400] INFO - [Chromecast] videoResolution: 1080
Mar 13, 2017 11:44:30.438 [0x34943400] WARN - [Chromecast] [PDE] Unable to play item; This server is not powerful enough to convert video.

The first line, level: 50 > 42, indicates that the analysis of the video stream yielded a level of 50, whereas this ‘Augmented profile’ is fixed at 42. Note that no matter what I put in my Chromecast.xml, this augmented profile supercedes whatever settings I have in there. I even removed my Chromecast.xml file from my Profiles folder and it still gives the same error.

Just for kicks, I tried this, too, in my Chromecast.xml file:

VideoCodec name="h264"> Limitations> UpperBound name="video.bitDepth" value="8" /> UpperBound name="video.maxLevel" value="50" /> UpperBound name="video.bitrate" value="40000" isRequired="false" /> /Limitations> /VideoCodec>

Questions:

Why is the maxLevel always augmented at 42?
Why isn’t the setting in the Chromecast.xml used when casting?
And where is the 50 coming from in the analysis? The video has these properties:

Video ID : 1 Format : AVC Format/Info : Advanced Video Codec Format profile : High@L4 Format settings, CABAC : Yes Format settings, ReFrames : 7 frames Codec ID : avc1 Codec ID/Info : Advanced Video Coding Duration : 2 h 4 min Bit rate : 21.2 Mb/s Width : 1 920 pixels Height : 960 pixels Display aspect ratio : 2.000 Frame rate mode : Variable Frame rate : 23.976 FPS Minimum frame rate : 11.987 FPS Maximum frame rate : 23.981 FPS Color space : YUV Chroma subsampling : 4:2:0 Bit depth : 8 bits

Note this is related to this post, too, without any answers:

Note that in the above example, even when maxLevel is set to 50 in my Chromecast.xml, ‘42’ is still used from the Augmented Profile and causes the error.

Also, I have many movies that work great using the same encoding profile as the one that is being analyzed as maxLevel @ 50.

One more point – I can play the file fine casting to Chromecast using BubbleUPnP player (Android) with Plex as the media server. The device-type in the Log File is Generic, not Chromecast.

I don’t understand why the client app makes a difference; it works for BubbleUPnP, doesn’t work for Plex app (Android) or Plex Web, all casting to the same Chromecast device.

Format profile : High@L4
Format settings, ReFrames : 7 frames
Duration : 2 h 4 min
Bit rate : 21.2 Mb/s
Width : 1 920 pixels
Height : 960 pixels

This file is invalid.
Level 4.0 allows for 5 reference frames with a picture dimension of 1920x960 px, your file uses 7
To decode such a video, the decoder needs more RAM than the Chromecast has available for video decoding.

Plex assessed the real level of the file, based on its encoding parameters and came to the correct conclusion: level 5.0
The Chromecast is only specified up to level 4.2, therefore Plex decides to transcode.

Maybe your file uses the full number of 7 reference frames only a very few times, so all you see are some very minor picture distortions when you force this file onto your chromecast with BubbleUPnP.

It doesn’t change the fact that your file is invalid.
If you feed Plex invalid files, the results are sometimes not what you expect.

Otto –

Thanks for your detailed and authoritative answer – makes complete sense. I am re-encoding with 5 reference frames and will report back if this doesn’t fix it.

Really appreciate your help!

AFAIK ffmpeg has a parameter which makes it restrict its parameters to keep them within a particular ‘Level’. You should use it. Or simply revert to one of the predefined compression presets.

@KenWP said:
I am re-encoding with 5 reference frames and will report back if this doesn’t fix it.

I forgot where the exact boundary is.
I only remember that 1920x1080 = 4 ref frames
and 1920x800 = 5 ref frames
It could very well be that your picture dimensions of 1920x960 only allow for 4 ref frames.

I’d err on the safe side and make that ‘4’ reference frames
(or tell the encoder to enforce the restrictions of Level 4.2, as mentioned above. That way you don’t have to do the math yourself every time you encode a file).

FYI – I’m using Vidcoder’s front end to Handbrake; didn’t see an option to specify a level.

Anyway, 5 ref frames still caused plex to evaluate it to level 5, which didn’t work on the Chromecast. 4 ref frames are working fine and I’m going back to reencoding the videos accordingly.