This is an old revision of the document!

Video Manager Group IFO (VMGI)

The VMGI is the primary IFO containing all the metadata about the entire DVD. Or, aka IFO zero.

Files are a normal IFO file, the first one on the disc, being VIDEO_TS.IFO and VIDEO_TS.BUP.

Here are the headers that are generic to all IFOs:

And here is some data that is specific to the VMG IFO:


See ifoOpenVMGI() in ifo_read.h.

See vmgi_mat_t struct in ifo_types.h.

ifo_handle_t *ifo_zero;
ifo_zero = ifoOpen(dvdread_dvd, 0);


  • Example: DVDVIDEO-VMG
char *id;
id = ifo_zero->vmgi_mat->vmg_identifier;

Last sector of VMG set

The last sector of the BUP.

uint32t i;
i = ifo_zero->vmgi_mat->vmg_last_sector;

Last sector of IFO

Current IFO? Not sure…

uint32t i;
i = ifo_zero->vmgi_mat->vmgi_last_sector;

Version number

uint8t i;
i = ifo_zero->vmgi_mat->specification_version;

VMG category

uint32_t i;
i = ifo_zero->vmgi_mat->vmg_category;

Number of volumes

Not sure if I've seen this one yet, where it is positvely set (todo: search IFOs). It's the number of volumes for an entire set of the DVDs that this one is a part of a collection.

uint16_t i;
i = ifo_zero->vmgi_mat->vmg_nr_of_volumes

Volume number

uint16_t i;
i = ifo_zero->vmgi_mat->vmg_this_volume_nr;

Disc side

This should obviously be a 1 or a 2.

uint8t i;
i = ifo_zero->vmgi_mat->disc_side;

Number of title sets

Number of VTSs, aka IFOs. For debugging, this number should match the actual amount of IFOs on a DVD.

uint16_t i;
i = ifo_zero->vmgi_mat->vmg_nr_of_title_sets;

Provider ID

Example: DEFENDERS_OF_THE_EARTH_V2D2A. Often blank. 32 characters not including a NULL terminator.

char *id;
id = ifo_zero->vmgi_mat->provider_identifier;


Dunno what this one is. 8-bytes.

uint64_t i;
i = ifo_zero->vmgi_mat->vmg_pos_code;

Last byte of VMG IFO (IFO Zero)

uint32_t i;
i = ifo_zero->vmgi_mat->vmgi_last_byte;

Start address of first PGC

First Play program chain.

uint32_t i;
i = ifo_zero->vmgi_mat->first_play_pgc;

Start sector of menu VOB

Dunno what this is yet.

uint32_t i;
i = ifo_zero->vmgi_mat->vmgm_vobs;

Sector pointer to TT_SRPT, table of titles

uint32_t i;
i = ifo_zero->vmgi_mat->tt_srpt;

Sector pointer to Menu Program Chain Table (VMGM_PGCI_UT)

uint32_t i;
i = ifo_zero->vmgi_mat->vmgm_pgci_ut;

Sector pointer to Parental Management masks (VMG_PTL_MAIT)

uint32_t i;
i = ifo_zero->vmgi_mat->ptl_mait;

Sector pointer to copies of VTS audio/sub-picture attributes (VMG_VTS_ATRT)

uint32_t i;
i = ifo_zero->vmgi_mat->vts_atrt;

Sector pointer to VMG_TXTDT_MG

Text data. No idea what this one is.

uint32_t i;
i = ifo_zero->vmgi_mat->txtdt_mgi;

Sector pointer to menu cell address table (VMGM_C_ADT)

uint32_t i;
i = ifo_zero->vmgi_mat->vmgm_c_adt;

Sector pointer to menu VOBU address map (VMGM_VOBU_ADMAP)

uint32_t i;
i = ifo_zero->vmgi_mat->vmgm_vobu_admap;

Video attributes of menu VOBs (VMGM_VOBS)

video_attr_t *a;
a = ifo_zero->vmgi_mat->vmgm_video_attr;

Number of audio streams in menu VOBs (VMGM_VOBS)

Should be 0 or 1 (debugging checks).

uint8_t i;
i = ifo_zero->vmgi_mat->nr_of_vmgm_audio_streams;

Audio attributes of menu VOBs (VMGM_VOBS)

For channels the most common integer value (from my findings) is 0 or 1. Need to find out if that means integer + 1 (so, 0 = mono, 1 = stereo) or what.

audio_attr_t *a;
a = ifo_zero->vmgi_mat->vmgm_audio_attr;

Number of subpicture streams in menu VOBs (VMGM_VOBS)

Should be 0 or 1 (debugging checks).

uint8_t i;
i = ifo_zero->vmgi_mat->nr_of_vmgm_subp_streams;

Subpicture attributes of menu VOBs (VMGM_VOBS)

subp_attr_t *a;
a = ifo_zero->vmgi_mat->vmgm_subp_attr;