I've got a rough (but working) mplayer vo built for PS3 using spu-medialib. It's very experimental and needs a lot of work. It has some issues that need to be worked out, but it seems to work (spoken cautiously) for a good variety of sources. It can't play Matroska file (.mkv), but I'm not sure that's due to the vo. I can't get them to keep proper time even with -vo null on the PS3.
I had to make some changes to spu-medialib to make it all work:
Changes I needed:
modified include files to handle c or c++
modified print statements to identify program (yuvs or yuvc) for debugging
Added creation of libspuml.a to Makefile. Contains yuvscaler.o & yuv2rgb.o for linking with mplayer (or whatever)
added install (and uninstall) to copy spu_yuv2rgb, spu_yuvscaler, libspuml.a, and include files to standard location (e.g. /usr/local/bin, /usr/local/lib64, /usr/local/include) – needs to be cleaned up & standard location/naming needs to be determined.
To do:
unsolo: Consider modifying the while loop in spu_yuv2rgb.c & spu_yuvscaler.c so that sending msg=UPDATE won't flip the buffers and cause an implied RUN (maybe move the flip statements to within the if(msg==RUN) block and then change the while loop to wait for next msg after update. No big deal either way, 'cause I'm not currently using it (msg=UPDATE)
Create proper shared library (as requested) with a more reasonable proper name
Add a debug variable to enable/squash print statements (clean up mplayer output)
Notes regarding vo_fbdev_spu
Info:
Needs to be direct rendered (use -dr)
Needs to be double buffered (use -double)
Must run fullscreen (not working with X yet)
Some video codecs WON'T double buffer (matroska formats?)
Some video broken if you don't double buffer (IPB thing – read code)
Most video scales fine, but some is just plain weird – my fault I'm sure, but haven't found it yet.
To do:
Needs a better name => fbdev_spu :(
Update configure to recognize spu-medialib automatically. After standard locations are decided for spu-medialib install, then script can check for it
Modify screen resolutions. Right now, you have to use ps3videomode first to set appropriate resolution.
Scaling is off for some video
Need to understand scaler better & re-write vo to be more friendly to it – crashes easily with unusual src sizes
Currently waiting on yuvscaler to finish before starting yuv2rgb. Need to change this, but timing & audio sync is a concern.
Implement windows to run in X!!!!!!!!
Add vo help text
Fix the many todo: messages in the code!!!!!
vo installation:
make spu-medialib library & spu* files and install:
wgarrett@localhost ~/spu-medialib/spu-medialib $ make lib
g++ -m64 -I../libfb -Iyuv2rgb -Iyuvscaler -Ispu_utils -I../../libfb/asm -O2 -c yuvscaler/yuvscaler.c -o yuvscaler.o
g++ -m64 -I../libfb -Iyuv2rgb -Iyuvscaler -Ispu_utils -I../../libfb/asm -O2 -c yuv2rgb/yuv2rgb.c -o yuv2rgb.o
ar rcs libspuml.a yuvscaler.o yuv2rgb.o
wgarrett@localhost ~/spu-medialib/spu-medialib $ make spu
spu-elf-gcc -std=c99 -O2 -fno-exceptions -g -Ispu_utils yuv2rgb/spu_yuv2rgb.c -o spu_yuv2rgb
spu-elf-gcc -std=c99 -O2 -fno-exceptions -g -Ispu_utils yuvscaler/spu_yuvscaler.c -o spu_yuvscaler
su and make install:
localhost spu-medialib # make install
mkdir -p /usr/local/bin /usr/local/include /usr/local/lib64
cp -v spu_yuvscaler spu_yuv2rgb /usr/local/bin/
`spu_yuvscaler' -> `/usr/local/bin/spu_yuvscaler'
`spu_yuv2rgb' -> `/usr/local/bin/spu_yuv2rgb'
cp -v libspuml.a /usr/local/lib64/
`libspumll.a' -> `/usr/local/lib64/libspuml.a'
cp -v spu_utils/spu_control.h yuv2rgb/yuv2rgb.h yuvscaler/yuvscaler.h /usr/local/include/
`spu_utils/spu_control.h' -> `/usr/local/include/spu_control.h'
`yuv2rgb/yuv2rgb.h' -> `/usr/local/include/yuv2rgb.h'
`yuvscaler/yuvscaler.h' -> `/usr/local/include/yuvscaler.h'
cp -v ../libfb/libfb.h /usr/local/include/
`../libfb/libfb.h' -> `/usr/local/include/libfb.h'
Patch mplayer and then make normally with --enable-fbdev_spu added to configure:
wgarrett@localhost ~/mplayer $ ./configure --enable-mga --enable-joystick –enable-fbdev_spu
Set appropriate video mode:
$ ps3videomode -v 3 -f
Run mplayer with -vo fbdev_spu and -dr for direct rendering and -double for double buffering:
$ mplayer -vo fbdev_spu:options video.mpg -dr -double
options=noscale & full
noscale forces no scaling whatsoever
full forces video to largest size for current screen res
More info and patches for testing to follow! :)
mplayer video output (vo)
Moderator: unsolo
Re: mplayer video output (vo)
...Update...
Have provided copies of the patch to unsolo for review. With his feedback, a few things have already been corrected.
Fixed:
implemented a workaround to prevent scaler crashes
buffers changed to be aligned by 16 - fixed strange scaling artifacts
Bugs & additional todo:
need to center image in screen (currently at 0x0 – upper left)
implement range checking for framebuffer – might cause a bad crash if you force noscale and video is too large for framebuffer. With scaling enabled (default), the vo will adjust the size down to within the framebuffer's limits
Have provided copies of the patch to unsolo for review. With his feedback, a few things have already been corrected.
Fixed:
implemented a workaround to prevent scaler crashes
buffers changed to be aligned by 16 - fixed strange scaling artifacts
Bugs & additional todo:
need to center image in screen (currently at 0x0 – upper left)
implement range checking for framebuffer – might cause a bad crash if you force noscale and video is too large for framebuffer. With scaling enabled (default), the vo will adjust the size down to within the framebuffer's limits
Correction
Correction of earlier post:
This:
Some video codecs WON'T double buffer (matroska formats?)
Some video broken if you don't double buffer (IPB thing – read code)
Should have been:
Some video codecs WON'T direct render (matroska formats?)
Some video broken if you don't direct render (IPB thing – read code)
This:
Some video codecs WON'T double buffer (matroska formats?)
Some video broken if you don't double buffer (IPB thing – read code)
Should have been:
Some video codecs WON'T direct render (matroska formats?)
Some video broken if you don't direct render (IPB thing – read code)
Re: mplayer video output (vo)
Hi, can you release the work you have done so far? I like to support you in your affords ... but atm I am a little blind folded.wgarrett wrote: I had to make some changes to spu-medialib to make it all work:
More info and patches for testing to follow! :)
Thanks
Protheus
Hi again.
I made a integrated yuv420 scaler and argb converter in one spe, it seems to be working well enough for >> 24FPS for now (many ways to make it faster).
However there are some edge artifacts when scaling to 1080p tho all other modes does not have these according to my initial studies i think this is a buffer issue somewhere i have overlooked.
I made a integrated yuv420 scaler and argb converter in one spe, it seems to be working well enough for >> 24FPS for now (many ways to make it faster).
However there are some edge artifacts when scaling to 1080p tho all other modes does not have these according to my initial studies i think this is a buffer issue somewhere i have overlooked.
Don't do it alone.
mplayer vo using spu-medialib
I've sent the latest copy of the vo to unsolo for testing. It's still rough and needs a lot of work, but it seems to work.
I don't have svn access yet, so if unsolo tests it, and he wants to make it available on svn, it's ok with me.
Here's the current version of the README:
Notes:
needs to do direct rendering, but you don't have
to specify -dr on the command line because vo will
enable it automatically if it can
non dr video broken - know why, but haven't gotten there yet
needs to double buffer, but you don't have to specify that either (-double)
doesn't do windows - takes over framebuffer for now
h264 issues:
currently not working
video currently doesn't direct render unless u post process with -vf pp
broken on PS3 (regardless of vo) - too slow & audio strange
try with -demuxer 35 -lavdopts fast:threads=2 for improvement, but
still not usable
try with -vo null and still broken (see, it's not vo's fault :) )
configure now autodetects fbdev_spu
works with:
'f' for fullscreen scaling toggle
'space' for pausing
'. for single frame stepping
use -vo fbdev_spu:snapshot to save a .yuv file of current
buffers on pause
Dependencies:
spu-medialib & ps3fb must be installed
must be able to find:
libspe2.h
spu-medialib/spu_control.h
spu-medialib/yuv2argb_scaler.h
ps3fb/libps3fb.h
libspu-medialib.a
libps3lib.a
Installation:
install ps3fb
install spu-medialib
get & patch fresh mplayer
svn co svn://svn.mplayerhq.hu/mplayer/trunk mplayer
cd mplayer & patch:
$ patch -p0 < mplayer-vo_fbdev_spu.patch
patching file libvo/video_out.c
patching file libvo/vo_fbdev_spu.c
patching file configure
make normally (./configure; make; make install)
Usage:
$ ps3videomode
$ mplayer -vo fbdev_spu /lost/video/watchme.mpg
I don't have svn access yet, so if unsolo tests it, and he wants to make it available on svn, it's ok with me.
Here's the current version of the README:
Notes:
needs to do direct rendering, but you don't have
to specify -dr on the command line because vo will
enable it automatically if it can
non dr video broken - know why, but haven't gotten there yet
needs to double buffer, but you don't have to specify that either (-double)
doesn't do windows - takes over framebuffer for now
h264 issues:
currently not working
video currently doesn't direct render unless u post process with -vf pp
broken on PS3 (regardless of vo) - too slow & audio strange
try with -demuxer 35 -lavdopts fast:threads=2 for improvement, but
still not usable
try with -vo null and still broken (see, it's not vo's fault :) )
configure now autodetects fbdev_spu
works with:
'f' for fullscreen scaling toggle
'space' for pausing
'. for single frame stepping
use -vo fbdev_spu:snapshot to save a .yuv file of current
buffers on pause
Dependencies:
spu-medialib & ps3fb must be installed
must be able to find:
libspe2.h
spu-medialib/spu_control.h
spu-medialib/yuv2argb_scaler.h
ps3fb/libps3fb.h
libspu-medialib.a
libps3lib.a
Installation:
install ps3fb
install spu-medialib
get & patch fresh mplayer
svn co svn://svn.mplayerhq.hu/mplayer/trunk mplayer
cd mplayer & patch:
$ patch -p0 < mplayer-vo_fbdev_spu.patch
patching file libvo/video_out.c
patching file libvo/vo_fbdev_spu.c
patching file configure
make normally (./configure; make; make install)
Usage:
$ ps3videomode
$ mplayer -vo fbdev_spu /lost/video/watchme.mpg