Video Manager Group IFO (VMGI)

The VMGI is the primary IFO containing all the metadata about the entire DVD. Or as I often call it, IFO zero.

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

VMG IFO Contents: libdvdread

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;