After
finishing my blog yesterday, I decided to use another technique to
solve my problem.
So
I know the read speed was not good, I wanted to isolate the problem,
or try to exclude a problem by testing, individual components.
So
I wrote a small test program for libdvdcss, by doing this I hit nail
on the head, this was where speed problem was.
First
run it showed about 64kb/s a bit more then when I
was benchmarking
from mplayer.
Corrected
a few mistakes and I was at 200kb/s.
The
experimented with my read ahead cache implantation, and I was soon at
800kb/s.
With
bit more work I managed to get it up to 24000 kb/s, this is
really
close to the
copy
speed I got yesterday from
DVD to HD.
So
I think we can say the speed problem is solved.
The
problem with mplayer is that it tries to read one by one block, but
CD has spin up, it has to find the sector
where block is located,
and
this for every time you read one block, this is not efficient.
sb600sata.device
or
sata device driver for X1000, does not try to pre buffer, this is the
problem. So this is way I need to do that in mplayer/libdvdcss.
So
what I try to do is, avoid any one block reads by pre fetching
blocks, as mplayer mostly reads blocks in sequential order this
pretty easy to do, so next reads is going to be really quick, until
the read offset is outside the buffer and it has to fill the pre
fetch
buffer.
Also
because its in memory, I do not need to foreword the IO read to the
DVD read process I created, it can simply just copy the data from the
buffer, so
no need to wait for task switch, signals and stuff like that.
I
call my pre buffering stuff "Evil" because it was quickly proto typed,
as future note it should be moved into the dvdcss struct, so etch dvd
device can have its own pre fetch buffer.
Anyway
its not a problem for mplayer as I think there is only one process
reading at any given time, from
one device, I'm shore this might not be case for other operating
systems.
Way
I think this is not problem is because libdvdcss is not a shared
library, the the pre fetch buffer is pretty mush private to mplayer
as its static linked.
Well done! (Yeah I know I'm about 2 years too late, but only just found your blog...)
ReplyDeleteWell thank you, I don't spend to much time waiting for people to comment, as you can understand, as only noticed you comment today in 2018.
ReplyDelete