Shop OBEX P1 Docs P2 Docs Learn Events
Movie on the propeller — Parallax Forums

Movie on the propeller

Dr_AculaDr_Acula Posts: 5,484
edited 2011-06-25 19:25 in Propeller 1
I know movies have been done before, but this is a demo of a movie playing on the propeller chip on a TV screen http://www.youtube.com/user/DoctorVernAcula#p/a/u/0/qVb8d7ls8Tg

This uses Kye's SD driver code and a 128x96 bitmap driver from Baggers.

No sound as yet, but I think Rayman has a movie player with sound and maybe this can be added?

The propeller boots up into the new TV version of Kyedos (thanks Oldbitcollector) with a fairly small font in green on black. The movie is played by running a compiled binary file "tvmovie.exe" which is simply a propeller .binary renamed to .exe.

The color algorithm takes an RGB value and converts to 86 TV colors. Colors below a certain saturation are converted to gray scale, and colors with very high or very low luminance are converted to white and black.

The TV has contrast/brightness etc adjustable, and at default values, the saturation is about 0.7 for fully saturated colors when comparing with a calibrated VGA palatte. I've set grayscale at 0.25 and you can see this in the movie when the turtle is coming out of the cave, the sides of the cave are just at the threshold of grayscale vs color.

The color processing algorithm is a compromise between what looks good for movies, for outdoor pictures and for faces.
Private Function RGB_to_PropTV(ByVal R As Byte, ByVal G As Byte, ByVal B As Byte)
        Dim PropByte As Byte
        Dim MyColor As Color
        Dim H, S, L As Double
        Dim NewH, NewS, NewL As Double
        Dim PropHue As Integer
        Dim PropLum As Double
        MyColor = Color.FromArgb(255, R, G, B) ' 0-255 for each value
        H = MyColor.GetHue ' 0-359
        S = MyColor.GetSaturation ' 0-1
        L = MyColor.GetBrightness ' 0-1
        NewH = H
        NewS = S
        NewL = L
        If S > 0.25 Then ' some color present
            NewS = 1 ' fully saturated colors
        Else
            NewS = 0 ' gray scale
        End If
        If L > 0.84 Then ' a very bright color is almost white
            NewS = 0 ' gray scale and white
            NewL = 1
        End If
        If L < 0.16 Then ' black
            NewS = 0 ' grayscale and black
            NewL = 0
        End If
        NewH = 0.5 + H / 22.5 ' round to 0-15
        NewH = Int(NewH) ' round
        NewH = NewH * 22.5 ' convert back to degrees
        NewH = NewH / 360 ' convert to 0-1
        If NewS = 0 Then ' grayscale
            NewL = NewL * 5 + 0.5 ' round to 5 discrete steps and add 0.5 offset so integer works
            NewL = Int(NewL)
            NewL = NewL / 5 ' convert back to 0-1
            PropByte = 2 + NewL * 5 ' gray values hex 02,03,04,05,06,07
        Else
            Select Case NewH * 16 ' there probably is a mathematical formula for this
                Case 11 To 12 : PropHue = 0
                Case 10 To 11 : PropHue = 1
                Case 9 To 10 : PropHue = 2
                Case 8 To 9 : PropHue = 3
                Case 7 To 8 : PropHue = 4
                Case 6 To 7 : PropHue = 5
                Case 5 To 6 : PropHue = 6
                Case 4 To 5 : PropHue = 7
                Case 3 To 4 : PropHue = 8
                Case 2 To 3 : PropHue = 9
                Case 1 To 2 : PropHue = 10
                Case 0 To 1 : PropHue = 11
                Case 15 To 16 : PropHue = 12
                Case 14 To 15 : PropHue = 13
                Case 13 To 14 : PropHue = 14
                Case 12 To 13 : PropHue = 15
            End Select
            PropLum = L ' original L value
            ' black and white already converted to gray scale so value will be 
            ' 0.16 to 0.84. There are 5 discrete steps here which is 1 more than the gray scale
            PropLum = PropLum - 0.16 ' remove the black, range is now 0 to 2/3
            PropLum = PropLum * 7.5 ' 5/(2/3) is 15/2 = 7.5 so range 0 to 5
            PropLum = Int(PropLum) ' scale to an integer
            If PropLum > 4 Then PropLum = 4 ' now a value 0,1,2,3,4
            If PropLum < 0 Then PropLum = 0
            PropByte = PropHue * 16 + PropLum + 10 ' convert to propeller value
        End If
        Return PropByte
    End Function

I have an idea that it might be possible to convert this to Spin and then be able to load standard .bmp bitmap files rather than having to pre-process them on a PC.

A few questions for those that have so helpfully contributed code:

@OBC - do you by any chance have a text driver where the text is a bit bigger. Somewhere between 20-40 columns?
@Rayman - when you add sound, how do you keep the audio and video in sync?
@Baggers - this is 128x96 with 16x16 tiles. Is it possible to change to 8x8 tiles, then gradually increase the number of pixels? Any chance of going to 160x120? Also, 128x96 ix 4:3 but there are black bars on the screen. I tried changing vertical tiles from 6 to 7 and it did seem to get rid of the bars.
@anyone - is there a 4 color TV driver out there - I'm thinking of a 320x240 gray scale as for the VGA GUI.

This is all great fun! Thanks to all the great people on the forum and the spirit of open-source and creating things collaboratively.
Sign In or Register to comment.