Enabling 1080p video on the Shuttle X27D HTPC

I recently bought a Shuttle X27D to use as a Home Theater PC (HTPC). The reviews of this hardware run from disappointing to average, but I’m reasonably happy with it. It’s quiet (just one small fan for the GPU, and none for CPU, case, or power supply), uses little power (I measured it at 32 W in full operation), and the analog audio jack on the motherboard has no discernable noise in the audio stream (unlike my Dell Vostro 1500 laptop).

Unfortunately, the Intel 945G graphics processor can’t reliably handle 720p @24 frames video. I tested with a downloaded copy of Sita Sings the Blues, and it dropped frames as the animated fireworks exploded during the title sequence. It was fine with most of the rest of the film. Still, it means I’m likely to stick to upscaled 480p video. Which is far better for my bandwidth usage.

Naturally, I ran into some problems setting it up.

First, I discovered that Ubuntu 8.10 Intrepid amd64 won’t run on this hardware. The kernel panics as soon as you boot the Live CD. Ubuntu 9.04 beta works, and of course i386 is fine. Benchmarks of the Atom 330 suggest that the 32-bit kernel is actually faster on this CPU for integer operations, so I just went with 32-bit. Since I wanted to use this as the family Skype device, that was probably the better choice anyway.

The biggest reason I bought a Shuttle X27D was because it has a DVI port that I could connect to my TV. I have a Panasonic TX-37LZD70 37″ LCD HDTV which is capable of up to 1080p video (1920×1080) when using an HDMI input. I connected them via a DVI-to-HDMI adaptor (it’s just a difference in pinout, and lack of an audio signal). Unfortunately Ubuntu booted in 720p mode (1280×720 50 Hz). xrandr reported a variety of other modes available, but none of them worked with my TV except for 640×480.

media@gozer:~$ xrandr
Screen 0: minimum 320 x 200, current 1280 x 720, maximum 1680 x 1050
VGA disconnected (normal left inverted right x axis y axis)
TMDS-1 connected 1280x720+0+0 (normal left inverted right x axis y axis) 697mm x 392mm
   1280x720       50.0 +   60.0*
   1680x1050      60.0
   1600x1024      60.2
   1400x1050      60.0
   1280x1024      60.0
   1440x900       59.9
   1280x960       60.0
   1360x768       59.8
   1152x864       60.0
   1024x768       60.0
   800x600        60.3     56.2
   640x480        59.9

I started playing with xrandr, and eventually discovered that the TV isn’t giving complete resolution information in the EDID it offers digitally.

media@gozer:~$ xrandr --prop
Screen 0: minimum 320 x 200, current 1280 x 720, maximum 1680 x 1050
VGA disconnected (normal left inverted right x axis y axis)
TMDS-1 connected 1280x720+0+0 (normal left inverted right x axis y axis) 697mm x 392mm
        EDID_DATA:
                00ffffffffffff0034a92ac149040000
                2f110103800000780adaffa3584aa229
                17494b00000001010101010101010101
                010101010101011d00bc52d01e20b828
                5540b9882100001e011d007251d01e20
                6e285500b9882100001e000000fc0050
                414e41534f4e49432d54560a000000fd
                00173d0f440f000a2020202020200187
                0203207250938414051f102012031102
                16071506012309070166030c00200080
                011d80d0721c1620102c2580b9882100
                009e8c0ad090204031200c405500b988
                21000018011d8018711c1620582c2500
                b9882100009e8c0ad08a20e02d10103e
                9600b98821000018023a80d072382d40
                102c4580b98821000018000000000050

Decoding this by hand revealed that the TV is only announcing 1280×720 graphics modes. Some DVD players are willing to try to force graphics modes they don’t know will work, but a PC wisely does not do this without manual intervention.

By this point I’d learned a lot about setting display modes in X and tried creating modes myself, using gtf and cvt.

xrandr --newmode "1920x1080_50.00" 141.50 1920 2032 2232 2544 1080 1083 1088 1114 -hsync +vsync
xrandr --addmode TMDS-1 1920x1080_50.00
xrandr --output TMDS-1 --mode "1920x1080_50.00"

This didn’t work because the mode I was trying to create was too large for the maximum listed by xrandr. It turns out that this isn’t a hard setting, but is calculated when X starts based on the maximum resolution of the available displays. It is the size of the frame buffer X uses for the total display area of all displays. Anyone having to set up dual monitors usually has to increase this in order to have two displays side by side. So I modified /etc/X11/xorg.conf and restarted X.

Section "Screen"
        Identifier      "Default Screen"
        Monitor         "Configured Monitor"
        Device          "Configured Video Device"
        Subsection "Display"
                Virtual 1920 1080
        Endsubsection
EndSection

Now the new mode worked, but was shifted to the right on my TV. This happened for all the modeline calculations I was able to produce with both gtf and cvt. So I gave up and installed DTDCalculator in my Windows virtual machine. It calculated a different set of modelines which worked perfectly on the first try. I set up modes for 24 Hz, 50 Hz, and 60 Hz.

xrandr --newmode "1920x1080_24.00" 74.25 1920 2558 2602 2750 1080 1084 1089 1125 -HSync +Vsync
xrandr --newmode "1920x1080_50.00" 148.50 1920 2448 2492 2640 1080 1084 1089 1125 -HSync +Vsync
xrandr --newmode "1920x1080_60.00" 148.50 1920 2008 2052 2200 1080 1084 1089 1125 -HSync +Vsync
xrandr --addmode TMDS-1 1920x1080_24.00
xrandr --addmode TMDS-1 1920x1080_50.00
xrandr --addmode TMDS-1 1920x1080_60.00

Now I can switch to any of the new modes, and I have full 1080p video! The last thing I want to do is make this change permanent. There are several ways to do this. The best way is to edit xorg.conf:

Section "Device"
        Identifier      "Configured Video Device"
        Option "Monitor-TMDS-1" "Configured Monitor"
EndSection

Section "Monitor"
        Identifier      "Configured Monitor"
        ModeLine "1920x1080_60.00" 148.50  1920 2008 2052 2200  1080 1084 1089 1125  -hsync +vsync
        ModeLine "1920x1080_50.00" 148.50  1920 2448 2492 2640  1080 1084 1089 1125  -hsync +vsync
        ModeLine "1920x1080_24.00" 74.25  1920 2558 2602 2750  1080 1084 1089 1125  -hsync +vsync
        Option "PreferredMode" "1920x1080_60.00"
EndSection

Section "Screen"
        Identifier      "Default Screen"
        Monitor         "Configured Monitor"
        Device          "Configured Video Device"
        Subsection "Display"
                Virtual 1920 1080
        Endsubsection
EndSection

This sets up the larger virtual frame buffer, creates the new resolutions, and tells X that the display TMDS-1 (the DVI port on this graphics card) should use the settings for “Configured Monitor” (normally only the first detected device will use these).

Another way to do this is to edit either /etc/xprofile or ~/.profile for your user. This is a shell script that is executed as X starts. If you want just your user to have these changes, use the latter. If you want all users including the login greeter to have them, use the former.

#!/bin/bash
# 2009-04-10 tyler - add missing 1080p video modes to DVI output

xrandr --newmode "1920x1080_24.00" 74.25  1920 2558 2602 2750  1080 1084 1089 1125  -HSync +Vsync
xrandr --newmode "1920x1080_50.00" 148.50  1920 2448 2492 2640  1080 1084 1089 1125  -HSync +Vsync
xrandr --newmode "1920x1080_60.00" 148.50  1920 2008 2052 2200  1080 1084 1089 1125  -HSync +Vsync

xrandr --addmode TMDS-1 1920x1080_24.00
xrandr --addmode TMDS-1 1920x1080_50.00
xrandr --addmode TMDS-1 1920x1080_60.00

xrandr --output TMDS-1 --mode "1920x1080_60.00"

If you’ll excuse me, I’m going to get back to watching all my favourite shows without commercials.

Tags: , , ,

  1. bob’s avatar

    I appreciate the info here. I purchased a X27D for a media pc. Running Mythbuntu JJ from live cd won’t display smooth HD on a VGA CRT. A bit of spelunking reveals “Intel XvMC decoder disabled” in Xorg.0.conf. A bit of surfing led me to
    http://www.x.org/wiki/IntelGraphicsDriver
    & to
    http://xorg.freedesktop.org/archive/individual/driver/
    where I downloaded xf86-video-intel-2.7.1.tar.bz2 dated 12-May-2009; don’t know if this will fix XvMC or not. I was hoping to run the X27D from cd…oh well. Now I’ll have to see if I can get it to boot from usb hard drive; if not, will have to find a 2.5 old laptop pata to either pata or sata converter to use existing laptop hard drives I have. If I have to buy a new hard drive, I’ll be up to the price of a Dell Studio Hybrid. This is yet another case of “so close, yet so far”.

    Reply

    1. tyler’s avatar

      Bob, I think you’ll find this hardware is simply incapable of smooth 1080p HD. Even 720p can be choppy depending on the video. This GPU is very underpowered, and offloads a lot of work to the CPU. That would be fine with a Core 2 Duo, but with an Atom the CPU is also too underpowered. I really only use this PC for 480p video, but upscaled to 1080p.

      Reply

    2. TTM’s avatar

      Okay, I admit it, it was the virtual thing that I needed to make my new HDTV work. I owe you a beer.

      Reply

    3. Jose Miguel’s avatar

      Thanks.

      After updating my debian testing macbook, I stopped having full hd resolution on my external display. Due to your post I was able to fix it. I’m working on a spanish translation to post it soon in m blog (jm2dev.com).

      Reply

    4. Fernando’s avatar

      I have this PC connected to my samsung 37″ TV working perfectly decoding FullHD Videos on WinXp with CoreAVC.
      But connected with VGA + Analog Audio

      Reply

      1. tyler’s avatar

        You’re very lucky, then. All of the reviews, even those that tested with Windows, were unable to get 1080p to play without dropping frames. Are you sure this is the same Shuttle X27D?

        Reply

      2. Pete’s avatar

        Thank you very much!
        Time to sit back and relax now ^_^

        Reply

Reply to tyler Cancel reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.