Log inRegister an accountBrowse CSDbHelp & documentationFacts & StatisticsThe forumsAvailable RSS-feeds on CSDbSupport CSDb Commodore 64 Scene Database
You are not logged in - nap
CSDb User Forums


Forums > CSDb Entries > Release id #172720 : Capture Tester V1.1
2018-12-19 12:32
0xDB

Registered: Aug 2015
Posts: 27
Release id #172720 : Capture Tester V1.1

capture of "Capture Tester": https://www.youtube.com/watch?v=43pENaKP3G8
capture of "noop-tro-2018": https://www.youtube.com/watch?v=RiL0ipbCr24

(Note: The captures feature the vertical stripes VIC2 hardware interference bug because when I made them I did not know about the "LumaFix64" project.)

equipment used:
* PAL C64
* s-video+rca cable from retrokabel.de (cable has a builtin resistor on the chroma line)
* cheap LogiLink AV-Grabber USB (id from lsusb: Fushicai USBTV007 Video Grabber [EasyCAP])
* arch gnu/linux PC

the problem:
The "EasyCAP" grabber only records 720x576@25fps PAL and there is no option to change resolution or framerate. The C64 outputs approximately 288lines@50fps. In the captured unprocessed video, two C64 frames are placed in a single EasyCAPed frame, one frame on every odd line, another frame on every even line.

Googleing about that problem, the suggested solution is to de-interlace the captured frames to get the original 50fps back. To test any de-interlacing for correctness (no temporal blurring and correct image sequence and frame numbers in the result) I wrote the Capture Tester program.

My problem was that the presented de-interlacing solutions online used scripts for a software called avisynth and I could not find any way to make those scripts work under gnu/linux (all the required software to do that easily appeared to be abandoned).

So I cobbled up a capture solution using ffmpeg,ffplay(for preview during capture),v4l2ctrl,vapoursynth(for de-interlacing and resizing) and avidemux(for cutting):
It consists of two bash scripts, a vapoursynth script and a settings file to configure the capture stick.



script "capture.sh":
#!/bin/bash

echo "delete previous capture..."
rm ./out/c64_capture.mp4

echo "starting capture..."
ffmpeg -f v4l2 -i /dev/video0 -f pulse -i default -c:v libx264 -framerate 25 -preset ultrafast -c:a aac -f tee -map 0:v -map 1:a "./out/c64_capture.mp4|[f=nut]pipe:" | ffplay pipe: &

# load improved settings (only has an effect if ffmpeg is already reading from /dev/video0 otherwise it always reverts to default settings)
echo "loading improved stick settings..."
# wait a bit to make sure ffmpeg and ffplay are already running
sleep 1
# (loading the settings shows error messages on console but the settings are changed as evident by looking at the captured video)
v4l2ctrl -d /dev/video0 -l stick_settings &

FFMPEGPID=`ps T | grep ffmpeg | awk '{ print $1 }'`
FFPLAYPID=`ps T | grep ffplay | awk '{ print $1 }'`

read -p "...................press any key to stop..................." -n1 -s

kill $FFMPEGPID
sleep 1
kill $FFPLAYPID


file "stick_settings" (initially generated with "v4l2ctrl -d /dev/video0 -s stick_settings" then edited):
9963776:                     Brightness:500
9963777:                       Contrast:500
9963778:                     Saturation:750
9963779:                            Hue:0
9963803:                      Sharpness:128


vapoursynth script "vapoursynth_c64.vpy":
import vapoursynth as vs
core = vs.get_core()
clip = core.ffms2.Source(source="./out/c64_capture.mp4")
clip = core.std.SeparateFields(clip=clip, tff=1) # also interleaves after separation
clip = core.std.Crop(clip=clip, left=12, right=24, top=4, bottom=4)
# scale up high for fine control over jitter removal
clip = core.resize.Spline36(clip=clip, width=2160, height=1728)
# get rid of line jitter between frames, by panning the odds
evens = core.std.SelectEvery(clip=clip, cycle=2, offsets=0)
odds = core.std.SelectEvery(clip=clip, cycle=2, offsets=1)
odds = core.std.AddBorders(clip=odds, bottom=2)
odds = core.std.Crop(clip=odds, top=2)
# put frames back together
clip = core.std.Interleave((odds,evens))
# cut off jitter
clip = core.std.Crop(clip=clip, bottom=2)
# resize to 1080p
clip = core.resize.Spline36(clip=clip, width=1350, height=1080, format=vs.YUV420P16)
clip.set_output()


script "transcode.sh":
#!/bin/bash
echo "extract audio..."
ffmpeg -i ./out/c64_capture.mp4 -c:a copy ./out/c64_capture_audio.aac
echo "transcode video..."
vspipe --y4m vapoursynth_c64.vpy - | ffmpeg -i pipe: -c:v libx264 -preset ultrafast -c:a aac ./out/c64_capture_video.mp4
echo "merge video and audio"
ffmpeg -i ./out/c64_capture_video.mp4 -i ./out/c64_capture_audio.aac -c:v copy -c:a copy ./out/c64_capture_deinterlaced.mp4
echo "remove intermediate files..."
rm ./out/c64_capture_audio.aac
rm ./out/c64_capture_video.mp4
echo "done"


To capture a C64 video, I first run the capture script (which captures via ffmpeg and opens an ffplay window for preview(not deinterlaced yet) and loads better than default settings file for the capture stick). And afterwards de-interlace and resize with the transcode script. Then I cut using avidemux.

Two specific questions I have:
1) Is there a way I can get vapoursynth to de-interlace and preview in realtime? (e.g. for playing games in a window without recording) All my attempts at reading directly from /dev/video0 in the vapoursynth script failed, also tried pipe-ing through a fifo pipe.
2) How can I get a sharper output? (seems a bit blurry, wondering if "LumaFix64" would help with that, the "sharpness" control in the stick_settings seems to only have little effect)

Apart from those two question all thoughts and improvement suggestions are welcome.
 
... 13 posts hidden. Click here to view all posts....
 
2019-01-02 10:16
0xDB

Registered: Aug 2015
Posts: 27
Thx encore, I hope it works for you as well.

I've installed a LumaFix64 in the meantime and while I found I could not fully eliminate all the vertical stripes with it (just a somewhat balanced state between dark and bright stripes that almost but not quite cancel each other out... spent at least 4h playing with the regulators), I get a slightly sharper picture by not using the spline algorithm for scaling and instead (who'da thunk it :P) use simple nearest neighbor scaling.

Overall, image quality still looks worse than on CRT TV.
2019-01-05 13:10
0xDB

Registered: Aug 2015
Posts: 27
Trying to optimize some more, I decided to try drawing a grid (poorly emulating the grill in a CRT) over the source image, like this:
VID=/dev/video0
ffplay -f v4l2 -i $VID -vf 'setfield=prog,separatefields,fps=50,crop=680:270:16:4,scale=1360:1080:sws_flags =neighbor,drawgrid=0:0:4:4:0x303030:1:1'

The pixels do not seem to be perfectly aligned... there is ghost image which disturbs the color information of the individual pixels, best seen in the white square which should be 8x8 pixels but it appears as 7x8 with the 8th column being almost black and a ghost pixel column to the left of it, bleeding into the border. Perhaps chroma information is not interpreted correctly.

image:
2019-01-24 13:32
Golara
Account closed

Registered: Jan 2018
Posts: 212
Hey, I think you might find this useful.
https://github.com/Yoshqu/usbtv-retro
2019-01-24 13:40
chatGPZ

Registered: Dec 2001
Posts: 11119
while you are at it, it would be super awesome to get more/better captures/screenshots of various test programs in the VICE repo: https://sourceforge.net/p/vice-emu/code/HEAD/tree/testprogs/VIC.. - eg "split-tests", "videomode", "spritesplit", "modesplit"

<3
2019-01-24 17:46
0xDB

Registered: Aug 2015
Posts: 27
Thanks Golara, that works well: https://youtu.be/sna6Khh03G0

updated "capture.sh" (with the new kernel module, separation/recombination of fields is no longer necessary)
#!/bin/bash
VID=/dev/video2

echo "delete previous capture..."
rm ./out/c64_capture.mp4

# set s-video retro input
v4l2-ctl -d $VID -i 2
# set pal standard
v4l2-ctl -d $VID -s pal

echo "starting capture..."
ffmpeg -f v4l2 -i $VID -f pulse -i default -vf fps=50,crop=680:540:16:4,scale=1360:1080:sws_flags=neighbor -c:v libx264 -framerate 50 -preset ultrafast -c:a aac -f tee -map 0:v -map 1:a "./out/c64_capture.mp4|[f=nut]pipe:" | ffplay pipe: &

# load improved settings (only has an effect if ffmpeg is already reading from $VID otherwise it always reverts to default settings)
echo "loading improved stick settings..."
# wait a bit to make sure ffmpeg and ffplay are already running
sleep 1
# (loading the settings shows error messages on console but the settings are changed as evident by looking at the captured video)
v4l2ctrl -d $VID -l stick_settings2 &

FFMPEGPID=`ps T | grep ffmpeg | awk '{ print $1 }'`
FFPLAYPID=`ps T | grep ffplay | awk '{ print $1 }'`
read -p "...................press any key to stop..................." -n1 -s
#echo ".................ffmpegpid: $FFMPEGPID"
#echo ".................ffplaypid: $FFPLAYPID"
kill $FFMPEGPID
sleep 1
kill $FFPLAYPID
@Groepaz, could you provide a disk image with all the test programs you'd like to get captured? I will then run and capture them in sequence.
2019-01-24 17:49
chatGPZ

Registered: Dec 2001
Posts: 11119
would a zip with all prg files be ok? its quite a bunch :)
2019-01-24 17:58
0xDB

Registered: Aug 2015
Posts: 27
Yes, zip works too.
2019-01-24 18:01
chatGPZ

Registered: Dec 2001
Posts: 11119
ok, will look through them
2019-01-24 20:19
Golara
Account closed

Registered: Jan 2018
Posts: 212
My buddy from work showed his buddy's youtube channel cuz he's programming some atari stuff and though i'd like it. He wrote that capture driver. Glad it works with C64 too.
2019-07-04 18:35
Golara
Account closed

Registered: Jan 2018
Posts: 212
Well, I wanted to try it myself. I bought a EasyCap, but unfortunately it has a different chip than yours and that custom driver doesn't work. I'm not sure if it's even possible to tell what chip is inside these cheap capture dongles before buying, they all look the same but from googling I see there are at least 4 different variants.

My dongle seems to capture really bad 25FPS video, like it is trying to average the colors between two fields. De-interlacing after capture like you do seems impossible.



Here's a closeup of the static raster bar.

Seems like the lines of the raster bar are repeated twice, which is correct, though there's some color bleed (blue going into top gray and into bottom black). Moving objects however don't look like 2 separate fields combined into one frame. The sprite is moving in Y and X every frame (each second line should be offset in X, right ?)


Here's some info about the device:
lsusb
Bus 003 Device 003: ID 258a:001f

v4l2-ctl --list-devices
AV TO USB2.0 (usb-0000:01:00.0-9):
	/dev/video2
	/dev/video3

Failed to open /dev/video0: No such file or directory

ffmpeg -f v4l2 -list_formats all -i /dev/video2
[video4linux2,v4l2 @ 0x5649ef38a8c0] Raw       :     yuyv422 :           YUYV 4:2:2 : 720x480 720x576 640x480 320x240 160x120
/dev/video2: Immediate exit requested


This is how I capture:
ffmpeg -f v4l2 -framerate 25 -video_size 720x576 -i /dev/video2 -c:v copy testcap25_2.avi


Any tips ?

EDIT: Picture from capture test.
Previous - 1 | 2 | 3 - Next
RefreshSubscribe to this thread:

You need to be logged in to post in the forum.

Search the forum:
Search   for   in  
All times are CET.
Search CSDb
Advanced
Users Online
Acidchild/Padua
Matt
McMeatLoaf
Jetboy/Elysium
Exile/Anubis
Guests online: 145
Top Demos
1 Next Level  (9.8)
2 Mojo  (9.7)
3 Coma Light 13  (9.7)
4 Edge of Disgrace  (9.6)
5 Comaland 100%  (9.6)
6 No Bounds  (9.6)
7 Uncensored  (9.6)
8 Wonderland XIV  (9.6)
9 Memento Mori  (9.6)
10 Bromance  (9.5)
Top onefile Demos
1 It's More Fun to Com..  (9.7)
2 Party Elk 2  (9.7)
3 Cubic Dream  (9.6)
4 Copper Booze  (9.5)
5 TRSAC, Gabber & Pebe..  (9.5)
6 Rainbow Connection  (9.5)
7 Wafer Demo  (9.5)
8 Dawnfall V1.1  (9.5)
9 Quadrants  (9.5)
10 Daah, Those Acid Pil..  (9.5)
Top Groups
1 Nostalgia  (9.3)
2 Oxyron  (9.3)
3 Booze Design  (9.3)
4 Censor Design  (9.3)
5 Crest  (9.3)
Top Fullscreen Graphicians
1 Carrion  (9.8)
2 Joe  (9.8)
3 Duce  (9.8)
4 Mirage  (9.7)
5 Facet  (9.7)

Home - Disclaimer
Copyright © No Name 2001-2024
Page generated in: 0.057 sec.