kodi
ifo_types.h
1 /*
2  * Copyright (C) 2000, 2001 Björn Englund <d4bjorn@dtek.chalmers.se>,
3  * Håkan Hjort <d95hjort@dtek.chalmers.se>
4  *
5  * This file is part of libdvdread.
6  *
7  * libdvdread is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * libdvdread is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with libdvdread; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21 
22 #pragma once
23 
24 //#include <inttypes.h>
25 #include "dvd_reader.h"
26 
27 
28 #undef ATTRIBUTE_PACKED
29 
30 #if defined(__GNUC__)
31 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
32 #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) && !defined(__clang__)
33 #define ATTRIBUTE_PACKED __attribute__((packed, gcc_struct))
34 #else
35 #define ATTRIBUTE_PACKED __attribute__((packed))
36 #endif
37 #define PRAGMA_PACK 0
38 #endif
39 #endif
40 
41 #if !defined(ATTRIBUTE_PACKED)
42 #define ATTRIBUTE_PACKED
43 #define PRAGMA_PACK 1
44 #endif
45 
46 #if PRAGMA_PACK
47 #pragma pack(1)
48 #endif
49 
50 
61 typedef struct {
62  uint8_t hour;
63  uint8_t minute;
64  uint8_t second;
65  uint8_t frame_u; /* The two high bits are the frame rate. */
66 } ATTRIBUTE_PACKED dvd_time_t;
67 
71 typedef struct {
72  uint8_t bytes[8];
73 } ATTRIBUTE_PACKED vm_cmd_t;
74 #define COMMAND_DATA_SIZE 8U
75 
76 
80 typedef struct {
81  unsigned char mpeg_version : 2;
82  unsigned char video_format : 2;
83  unsigned char display_aspect_ratio : 2;
84  unsigned char permitted_df : 2;
85 
86  unsigned char line21_cc_1 : 1;
87  unsigned char line21_cc_2 : 1;
88  unsigned char unknown1 : 1;
89  unsigned char bit_rate : 1;
90 
91  unsigned char picture_size : 2;
92  unsigned char letterboxed : 1;
93  unsigned char film_mode : 1;
94 } ATTRIBUTE_PACKED video_attr_t;
95 
99 typedef struct {
100  unsigned char audio_format : 3;
101  unsigned char multichannel_extension : 1;
102  unsigned char lang_type : 2;
103  unsigned char application_mode : 2;
104 
105  unsigned char quantization : 2;
106  unsigned char sample_frequency : 2;
107  unsigned char unknown1 : 1;
108  unsigned char channels : 3;
109  uint16_t lang_code;
110  uint8_t lang_extension;
111  uint8_t code_extension;
112  uint8_t unknown3;
113  union {
114  struct ATTRIBUTE_PACKED {
115  unsigned char unknown4 : 1;
116  unsigned char channel_assignment : 3;
117  unsigned char version : 2;
118  unsigned char mc_intro : 1; /* probably 0: true, 1:false */
119  unsigned char mode : 1; /* Karaoke mode 0: solo 1: duet */
120  } karaoke;
121  struct ATTRIBUTE_PACKED {
122  unsigned char unknown5 : 4;
123  unsigned char dolby_encoded : 1; /* suitable for surround decoding */
124  unsigned char unknown6 : 3;
125  } surround;
126  } ATTRIBUTE_PACKED app_info;
127 } ATTRIBUTE_PACKED audio_attr_t;
128 
129 
133 typedef struct {
134  unsigned char zero1 : 7;
135  unsigned char ach0_gme : 1;
136 
137  unsigned char zero2 : 7;
138  unsigned char ach1_gme : 1;
139 
140  unsigned char zero3 : 4;
141  unsigned char ach2_gv1e : 1;
142  unsigned char ach2_gv2e : 1;
143  unsigned char ach2_gm1e : 1;
144  unsigned char ach2_gm2e : 1;
145 
146  unsigned char zero4 : 4;
147  unsigned char ach3_gv1e : 1;
148  unsigned char ach3_gv2e : 1;
149  unsigned char ach3_gmAe : 1;
150  unsigned char ach3_se2e : 1;
151 
152  unsigned char zero5 : 4;
153  unsigned char ach4_gv1e : 1;
154  unsigned char ach4_gv2e : 1;
155  unsigned char ach4_gmBe : 1;
156  unsigned char ach4_seBe : 1;
157  uint8_t zero6[19];
158 } ATTRIBUTE_PACKED multichannel_ext_t;
159 
160 
164 typedef struct {
165  /*
166  * type: 0 not specified
167  * 1 language
168  * 2 other
169  * coding mode: 0 run length
170  * 1 extended
171  * 2 other
172  * language: indicates language if type == 1
173  * lang extension: if type == 1 contains the lang extension
174  */
175  unsigned char code_mode : 3;
176  unsigned char zero1 : 3;
177  unsigned char type : 2;
178  uint8_t zero2;
179  uint16_t lang_code;
180  uint8_t lang_extension;
181  uint8_t code_extension;
182 } ATTRIBUTE_PACKED subp_attr_t;
183 
184 
185 
189 typedef struct {
190  uint16_t nr_of_pre;
191  uint16_t nr_of_post;
192  uint16_t nr_of_cell;
193  uint16_t last_byte;
194  vm_cmd_t *pre_cmds;
195  vm_cmd_t *post_cmds;
196  vm_cmd_t *cell_cmds;
197 } ATTRIBUTE_PACKED pgc_command_tbl_t;
198 #define PGC_COMMAND_TBL_SIZE 8U
199 
203 typedef uint8_t pgc_program_map_t;
204 
208 typedef struct {
209  unsigned char block_mode : 2;
210  unsigned char block_type : 2;
211  unsigned char seamless_play : 1;
212  unsigned char interleaved : 1;
213  unsigned char stc_discontinuity : 1;
214  unsigned char seamless_angle : 1;
215  unsigned char zero_1 : 1;
216  unsigned char playback_mode : 1;
217  unsigned char restricted : 1;
218  unsigned char cell_type : 5;
219  uint8_t still_time;
220  uint8_t cell_cmd_nr;
221  dvd_time_t playback_time;
222  uint32_t first_sector;
223  uint32_t first_ilvu_end_sector;
224  uint32_t last_vobu_start_sector;
225  uint32_t last_sector;
226 } ATTRIBUTE_PACKED cell_playback_t;
227 
228 #define BLOCK_TYPE_NONE 0x0
229 #define BLOCK_TYPE_ANGLE_BLOCK 0x1
230 
231 #define BLOCK_MODE_NOT_IN_BLOCK 0x0
232 #define BLOCK_MODE_FIRST_CELL 0x1
233 #define BLOCK_MODE_IN_BLOCK 0x2
234 #define BLOCK_MODE_LAST_CELL 0x3
235 
239 typedef struct {
240  uint16_t vob_id_nr;
241  uint8_t zero_1;
242  uint8_t cell_nr;
243 } ATTRIBUTE_PACKED cell_position_t;
244 
248 typedef struct {
249  unsigned char zero : 7; /* 25-31 */
250  unsigned char video_pres_mode_change : 1; /* 24 */
251 
252  unsigned char karaoke_audio_pres_mode_change : 1; /* 23 */
253  unsigned char angle_change : 1;
254  unsigned char subpic_stream_change : 1;
255  unsigned char audio_stream_change : 1;
256  unsigned char pause_on : 1;
257  unsigned char still_off : 1;
258  unsigned char button_select_or_activate : 1;
259  unsigned char resume : 1; /* 16 */
260 
261  unsigned char chapter_menu_call : 1; /* 15 */
262  unsigned char angle_menu_call : 1;
263  unsigned char audio_menu_call : 1;
264  unsigned char subpic_menu_call : 1;
265  unsigned char root_menu_call : 1;
266  unsigned char title_menu_call : 1;
267  unsigned char backward_scan : 1;
268  unsigned char forward_scan : 1; /* 8 */
269 
270  unsigned char next_pg_search : 1; /* 7 */
271  unsigned char prev_or_top_pg_search : 1;
272  unsigned char time_or_chapter_search : 1;
273  unsigned char go_up : 1;
274  unsigned char stop : 1;
275  unsigned char title_play : 1;
276  unsigned char chapter_search_or_play : 1;
277  unsigned char title_or_time_play : 1; /* 0 */
278 } ATTRIBUTE_PACKED user_ops_t;
279 
283 typedef struct {
284  uint16_t zero_1;
285  uint8_t nr_of_programs;
286  uint8_t nr_of_cells;
287  dvd_time_t playback_time;
288  user_ops_t prohibited_ops;
289  uint16_t audio_control[8]; /* New type? */
290  uint32_t subp_control[32]; /* New type? */
291  uint16_t next_pgc_nr;
292  uint16_t prev_pgc_nr;
293  uint16_t goup_pgc_nr;
294  uint8_t pg_playback_mode;
295  uint8_t still_time;
296  uint32_t palette[16]; /* New type struct {zero_1, Y, Cr, Cb} ? */
297  uint16_t command_tbl_offset;
298  uint16_t program_map_offset;
299  uint16_t cell_playback_offset;
300  uint16_t cell_position_offset;
301  pgc_command_tbl_t *command_tbl;
302  pgc_program_map_t *program_map;
303  cell_playback_t *cell_playback;
304  cell_position_t *cell_position;
305  int ref_count;
306 } ATTRIBUTE_PACKED pgc_t;
307 #define PGC_SIZE 236U
308 
312 typedef struct {
313  uint8_t entry_id;
314  unsigned char block_mode : 2;
315  unsigned char block_type : 2;
316  unsigned char zero_1 : 4;
317  uint16_t ptl_id_mask;
318  uint32_t pgc_start_byte;
319  pgc_t *pgc;
320 } ATTRIBUTE_PACKED pgci_srp_t;
321 #define PGCI_SRP_SIZE 8U
322 
326 typedef struct {
327  uint16_t nr_of_pgci_srp;
328  uint16_t zero_1;
329  uint32_t last_byte;
330  pgci_srp_t *pgci_srp;
331  int ref_count;
332 } ATTRIBUTE_PACKED pgcit_t;
333 #define PGCIT_SIZE 8U
334 
338 typedef struct {
339  uint16_t lang_code;
340  uint8_t lang_extension;
341  uint8_t exists;
342  uint32_t lang_start_byte;
343  pgcit_t *pgcit;
344 } ATTRIBUTE_PACKED pgci_lu_t;
345 #define PGCI_LU_SIZE 8U
346 
350 typedef struct {
351  uint16_t nr_of_lus;
352  uint16_t zero_1;
353  uint32_t last_byte;
354  pgci_lu_t *lu;
355 } ATTRIBUTE_PACKED pgci_ut_t;
356 #define PGCI_UT_SIZE 8U
357 
361 typedef struct {
362  uint16_t vob_id;
363  uint8_t cell_id;
364  uint8_t zero_1;
365  uint32_t start_sector;
366  uint32_t last_sector;
367 } ATTRIBUTE_PACKED cell_adr_t;
368 
372 typedef struct {
373  uint16_t nr_of_vobs; /* VOBs */
374  uint16_t zero_1;
375  uint32_t last_byte;
376  cell_adr_t *cell_adr_table; /* No explicit size given. */
377 } ATTRIBUTE_PACKED c_adt_t;
378 #define C_ADT_SIZE 8U
379 
383 typedef struct {
384  uint32_t last_byte;
385  uint32_t *vobu_start_sectors;
386 } ATTRIBUTE_PACKED vobu_admap_t;
387 #define VOBU_ADMAP_SIZE 4U
388 
389 
390 
391 
401 typedef struct {
402  char vmg_identifier[12];
403  uint32_t vmg_last_sector;
404  uint8_t zero_1[12];
405  uint32_t vmgi_last_sector;
406  uint8_t zero_2;
407  uint8_t specification_version;
408  uint32_t vmg_category;
409  uint16_t vmg_nr_of_volumes;
410  uint16_t vmg_this_volume_nr;
411  uint8_t disc_side;
412  uint8_t zero_3[19];
413  uint16_t vmg_nr_of_title_sets; /* Number of VTSs. */
414  char provider_identifier[32];
415  uint64_t vmg_pos_code;
416  uint8_t zero_4[24];
417  uint32_t vmgi_last_byte;
418  uint32_t first_play_pgc;
419  uint8_t zero_5[56];
420  uint32_t vmgm_vobs; /* sector */
421  uint32_t tt_srpt; /* sector */
422  uint32_t vmgm_pgci_ut; /* sector */
423  uint32_t ptl_mait; /* sector */
424  uint32_t vts_atrt; /* sector */
425  uint32_t txtdt_mgi; /* sector */
426  uint32_t vmgm_c_adt; /* sector */
427  uint32_t vmgm_vobu_admap; /* sector */
428  uint8_t zero_6[32];
429 
430  video_attr_t vmgm_video_attr;
431  uint8_t zero_7;
432  uint8_t nr_of_vmgm_audio_streams; /* should be 0 or 1 */
433  audio_attr_t vmgm_audio_attr;
434  audio_attr_t zero_8[7];
435  uint8_t zero_9[17];
436  uint8_t nr_of_vmgm_subp_streams; /* should be 0 or 1 */
437  subp_attr_t vmgm_subp_attr;
438  subp_attr_t zero_10[27]; /* XXX: how much 'padding' here? */
439 } ATTRIBUTE_PACKED vmgi_mat_t;
440 
441 typedef struct {
442  unsigned char zero_1 : 1;
443  unsigned char multi_or_random_pgc_title : 1; /* 0: one sequential pgc title */
444  unsigned char jlc_exists_in_cell_cmd : 1;
445  unsigned char jlc_exists_in_prepost_cmd : 1;
446  unsigned char jlc_exists_in_button_cmd : 1;
447  unsigned char jlc_exists_in_tt_dom : 1;
448  unsigned char chapter_search_or_play : 1; /* UOP 1 */
449  unsigned char title_or_time_play : 1; /* UOP 0 */
450 } ATTRIBUTE_PACKED playback_type_t;
451 
455 typedef struct {
456  playback_type_t pb_ty;
457  uint8_t nr_of_angles;
458  uint16_t nr_of_ptts;
459  uint16_t parental_id;
460  uint8_t title_set_nr;
461  uint8_t vts_ttn;
462  uint32_t title_set_sector;
463 } ATTRIBUTE_PACKED title_info_t;
464 
468 typedef struct {
469  uint16_t nr_of_srpts;
470  uint16_t zero_1;
471  uint32_t last_byte;
472  title_info_t *title;
473 } ATTRIBUTE_PACKED tt_srpt_t;
474 #define TT_SRPT_SIZE 8U
475 
476 
481 #define PTL_MAIT_NUM_LEVEL 8
482 typedef uint16_t pf_level_t[PTL_MAIT_NUM_LEVEL];
483 
487 typedef struct {
488  uint16_t country_code;
489  uint16_t zero_1;
490  uint16_t pf_ptl_mai_start_byte;
491  uint16_t zero_2;
492  pf_level_t *pf_ptl_mai; /* table of (nr_of_vtss + 1), video_ts is first */
493 } ATTRIBUTE_PACKED ptl_mait_country_t;
494 #define PTL_MAIT_COUNTRY_SIZE 8U
495 
499 typedef struct {
500  uint16_t nr_of_countries;
501  uint16_t nr_of_vtss;
502  uint32_t last_byte;
503  ptl_mait_country_t *countries;
504 } ATTRIBUTE_PACKED ptl_mait_t;
505 #define PTL_MAIT_SIZE 8U
506 
510 typedef struct {
511  uint32_t last_byte;
512  uint32_t vts_cat;
513 
514  video_attr_t vtsm_vobs_attr;
515  uint8_t zero_1;
516  uint8_t nr_of_vtsm_audio_streams; /* should be 0 or 1 */
517  audio_attr_t vtsm_audio_attr;
518  audio_attr_t zero_2[7];
519  uint8_t zero_3[16];
520  uint8_t zero_4;
521  uint8_t nr_of_vtsm_subp_streams; /* should be 0 or 1 */
522  subp_attr_t vtsm_subp_attr;
523  subp_attr_t zero_5[27];
524 
525  uint8_t zero_6[2];
526 
527  video_attr_t vtstt_vobs_video_attr;
528  uint8_t zero_7;
529  uint8_t nr_of_vtstt_audio_streams;
530  audio_attr_t vtstt_audio_attr[8];
531  uint8_t zero_8[16];
532  uint8_t zero_9;
533  uint8_t nr_of_vtstt_subp_streams;
534  subp_attr_t vtstt_subp_attr[32];
535 } ATTRIBUTE_PACKED vts_attributes_t;
536 #define VTS_ATTRIBUTES_SIZE 542U
537 #define VTS_ATTRIBUTES_MIN_SIZE 356U
538 
542 typedef struct {
543  uint16_t nr_of_vtss;
544  uint16_t zero_1;
545  uint32_t last_byte;
546  vts_attributes_t *vts;
547  uint32_t *vts_atrt_offsets; /* offsets table for each vts_attributes */
548 } ATTRIBUTE_PACKED vts_atrt_t;
549 #define VTS_ATRT_SIZE 8U
550 
554 typedef struct {
555  uint32_t last_byte; /* offsets are relative here */
556  uint16_t offsets[100]; /* == nr_of_srpts + 1 (first is disc title) */
557 #if 0
558  uint16_t unknown; /* 0x48 ?? 0x48 words (16bit) info following */
559  uint16_t zero_1;
560 
561  uint8_t type_of_info; /* ?? 01 == disc, 02 == Title, 04 == Title part */
562  uint8_t unknown1;
563  uint8_t unknown2;
564  uint8_t unknown3;
565  uint8_t unknown4; /* ?? always 0x30 language?, text format? */
566  uint8_t unknown5;
567  uint16_t offset; /* from first */
568 
569  char text[12]; /* ended by 0x09 */
570 #endif
571 } ATTRIBUTE_PACKED txtdt_t;
572 
576 typedef struct {
577  uint16_t lang_code;
578  uint8_t zero_1;
579  uint8_t
580  char_set; /* 0x00 reserved Unicode, 0x01 ISO 646, 0x10 JIS Roman & JIS Kanji, 0x11 ISO 8859-1, 0x12 Shift JIS Kanji */
581  uint32_t txtdt_start_byte; /* prt, rel start of vmg_txtdt_mgi */
582  txtdt_t *txtdt;
583 } ATTRIBUTE_PACKED txtdt_lu_t;
584 #define TXTDT_LU_SIZE 8U
585 
589 typedef struct {
590  char disc_name[12];
591  uint16_t unknown1;
592  uint16_t nr_of_language_units;
593  uint32_t last_byte;
594  txtdt_lu_t *lu;
595 } ATTRIBUTE_PACKED txtdt_mgi_t;
596 #define TXTDT_MGI_SIZE 20U
597 
598 
608 typedef struct {
609  char vts_identifier[12];
610  uint32_t vts_last_sector;
611  uint8_t zero_1[12];
612  uint32_t vtsi_last_sector;
613  uint8_t zero_2;
614  uint8_t specification_version;
615  uint32_t vts_category;
616  uint16_t zero_3;
617  uint16_t zero_4;
618  uint8_t zero_5;
619  uint8_t zero_6[19];
620  uint16_t zero_7;
621  uint8_t zero_8[32];
622  uint64_t zero_9;
623  uint8_t zero_10[24];
624  uint32_t vtsi_last_byte;
625  uint32_t zero_11;
626  uint8_t zero_12[56];
627  uint32_t vtsm_vobs; /* sector */
628  uint32_t vtstt_vobs; /* sector */
629  uint32_t vts_ptt_srpt; /* sector */
630  uint32_t vts_pgcit; /* sector */
631  uint32_t vtsm_pgci_ut; /* sector */
632  uint32_t vts_tmapt; /* sector */
633  uint32_t vtsm_c_adt; /* sector */
634  uint32_t vtsm_vobu_admap; /* sector */
635  uint32_t vts_c_adt; /* sector */
636  uint32_t vts_vobu_admap; /* sector */
637  uint8_t zero_13[24];
638 
639  video_attr_t vtsm_video_attr;
640  uint8_t zero_14;
641  uint8_t nr_of_vtsm_audio_streams; /* should be 0 or 1 */
642  audio_attr_t vtsm_audio_attr;
643  audio_attr_t zero_15[7];
644  uint8_t zero_16[17];
645  uint8_t nr_of_vtsm_subp_streams; /* should be 0 or 1 */
646  subp_attr_t vtsm_subp_attr;
647  subp_attr_t zero_17[27];
648  uint8_t zero_18[2];
649 
650  video_attr_t vts_video_attr;
651  uint8_t zero_19;
652  uint8_t nr_of_vts_audio_streams;
653  audio_attr_t vts_audio_attr[8];
654  uint8_t zero_20[17];
655  uint8_t nr_of_vts_subp_streams;
656  subp_attr_t vts_subp_attr[32];
657  uint16_t zero_21;
658  multichannel_ext_t vts_mu_audio_attr[8];
659  /* XXX: how much 'padding' here, if any? */
660 } ATTRIBUTE_PACKED vtsi_mat_t;
661 
665 typedef struct {
666  uint16_t pgcn;
667  uint16_t pgn;
668 } ATTRIBUTE_PACKED ptt_info_t;
669 
673 typedef struct {
674  uint16_t nr_of_ptts;
675  ptt_info_t *ptt;
676 } ATTRIBUTE_PACKED ttu_t;
677 
681 typedef struct {
682  uint16_t nr_of_srpts;
683  uint16_t zero_1;
684  uint32_t last_byte;
685  ttu_t *title;
686  uint32_t *ttu_offset; /* offset table for each ttu */
687 } ATTRIBUTE_PACKED vts_ptt_srpt_t;
688 #define VTS_PTT_SRPT_SIZE 8U
689 
690 
694 /* Should this be bit field at all or just the uint32_t? */
695 typedef uint32_t map_ent_t;
696 
700 typedef struct {
701  uint8_t tmu; /* Time unit, in seconds */
702  uint8_t zero_1;
703  uint16_t nr_of_entries;
704  map_ent_t *map_ent;
705 } ATTRIBUTE_PACKED vts_tmap_t;
706 #define VTS_TMAP_SIZE 4U
707 
711 typedef struct {
712  uint16_t nr_of_tmaps;
713  uint16_t zero_1;
714  uint32_t last_byte;
715  vts_tmap_t *tmap;
716  uint32_t *tmap_offset; /* offset table for each tmap */
717 } ATTRIBUTE_PACKED vts_tmapt_t;
718 #define VTS_TMAPT_SIZE 8U
719 
720 
721 #if PRAGMA_PACK
722 #pragma pack()
723 #endif
724 
725 
732 typedef struct {
733  /* VMGI */
734  vmgi_mat_t *vmgi_mat;
735  tt_srpt_t *tt_srpt;
736  pgc_t *first_play_pgc;
737  ptl_mait_t *ptl_mait;
738  vts_atrt_t *vts_atrt;
739  txtdt_mgi_t *txtdt_mgi;
740 
741  /* Common */
742  pgci_ut_t *pgci_ut;
743  c_adt_t *menu_c_adt;
744  vobu_admap_t *menu_vobu_admap;
745 
746  /* VTSI */
747  vtsi_mat_t *vtsi_mat;
748  vts_ptt_srpt_t *vts_ptt_srpt;
749  pgcit_t *vts_pgcit;
750  vts_tmapt_t *vts_tmapt;
751  c_adt_t *vts_c_adt;
752  vobu_admap_t *vts_vobu_admap;
753 } ifo_handle_t;
754 
unsigned char zero4
reserved
Definition: ifo_types.h:146
unsigned char zero2
reserved
Definition: ifo_types.h:137
unsigned char playback_mode
When set, enter StillMode after each VOBU.
Definition: ifo_types.h:216
unsigned char zero3
reserved
Definition: ifo_types.h:140
Common.
Definition: ifo_types.h:61
unsigned char zero1
reserved
Definition: ifo_types.h:134
uint8_t still_time
for karaoke, reserved otherwise
Definition: ifo_types.h:219
The following structure defines an IFO file.
Definition: ifo_types.h:732
unsigned char restricted
?? drop out of fastforward?
Definition: ifo_types.h:217