No subject


Tue Aug 25 22:50:44 CEST 2009


approaches. The info in the IFO will be correct for most dvds, but there are
some dvds where the time map (VTS_TMAPTI) is corrupt or missing (5% of my
collection). I imagine there are some dvds that have similar issues with
VTS_VOBU_ADMAP (have not seen any yet).

That said, the div-by-zero errors shows that the VOB PCI pack is not always
correct (again, about 5% of my collection. some overlap with the prior 5%).
However, I think other info in the VOB PCI pack can be used to correct this
corruption (vobu_s_ptm; vobu_e_ptm; vobu_se_e_ptm). I'm assuming that
DirectDVD simply didn't bother enough to fix them (especially when
considering that div-by-zero freezes the app).

Unfortunately, scanning the VOB files for this data is a project beyond my
current ability/time.

So in its place, I devised an approach that uses the IFOs only. It's not
ideal, and will probably not work for poorly-authored DVDs. I'm hoping that
segment is small (< 1%). For those DVDs, I think there is no other recourse
other than to do VOB PCI pack analysis.

The IFO approach works as follows:
* Try the time_maps (should work for 95% of dvds)
  - for a given time, find the entry in the time_map table (VTS_TMAPTI)
    The time_map will break down a pgc into intervals of n seconds.
    Unfortunately n is generally 4 seconds, so...
  - lookup the corresponding sectors in the ad_map table (VTS_VOBU_ADMAP)
    The tmap sectors will produce a range in ad_map of 6 - 10 VOBUs.
  - do time interpolation over the 6 - 10 to get the time
    6 - 10 will be small enough that time interpolation will be accurate
* If there is no good time_map, try the ad_map (should work for the
remaining 5% of dvds)
  - for a given time, find the cell in the pgc
  - get the sector bounds of the cell
  - lookup the corresponding sectors from the ad_map table (VTS_VOBU_ADMAP)
    Unfortunately, the ad_map range will be much larger: a few hundred to a
few thousand VOBUs.
  - do time interpoloation over the range
    time interpolation is not ideal, as the range is very large
    however, VOBUs are sized between .4 and 1.5 seconds. Within a given
cell, they appear to be reasonably consistent (i.e.: VOBUs may hover around
15 frames)
* If there is no good ad_map, then just use the cell (same as
dvdnav_time_search)
  - for a given time, find the cell in the pgc
  - get the sector bounds of the cell
  - do time interpolation over the sector bounds
    this will rarely be accurate. It is there to handle the outlyer dvds (<
1%).

Here's a specific example for the time_map approach. It tries to find an
@sector for a @time of 5 seconds
1. look at VTS_TMAPTI
    @time_interval = 4
    Entries =  tmap_idx  sector   time
                                0     711      4
                                1    1776      8
                                2    2790     12

    since 5 seconds is between 4 and 8, @time is between tmap_idx 0 and 1
    @sector_bgn = 711
    @sector_end = 1776

2. look at VTS_VOBU_ADMAP
    Entries = vobu  sector
                       0          0
                       1        43
                        etc.
                       9       711
                      10      831
                      11      948
                      12    1080
                      13    1213
                      14    1349
                      15    1493
                      16    1642
                      17    1776
    @vobu_bgn = 9
    @vobu_end = 17

3. interpolate
    there are 8 vobus between 9 and 17
    5 is 1/4 of the way between 4 and 8
    1/4 of the way between 9 and 17 is 11
    so, @sector = 948


More information about the DVDnav-discuss mailing list