# HG changeset patch # User nicodvb # Date 1210532845 0 # Node ID abca84921371b60ec4f7fcf359e492f4a354021c # Parent 3d8edef37c7ee34e900032a0e0e51c5a3caf69b6 read_cell_playback() removes another conditional bitfield. We're almost there! diff -r 3d8edef37c7e -r abca84921371 dvdread/ifo_read.c --- a/dvdread/ifo_read.c Sun May 11 09:43:48 2008 +0000 +++ b/dvdread/ifo_read.c Sun May 11 19:07:25 2008 +0000 @@ -228,6 +228,35 @@ ps->pgc_start_byte = dvdread_getbits(&state, 32); } +static void read_cell_playback(cell_playback_t *cp) { + getbits_state_t state; + uint8_t buf[sizeof(cell_playback_t)]; + + memcpy(buf, cp, sizeof(cell_playback_t)); + if (!dvdread_getbits_init(&state, buf)) abort(); + cp->block_mode = dvdread_getbits(&state, 2); + cp->block_type = dvdread_getbits(&state, 2); + cp->seamless_play = dvdread_getbits(&state, 1); + cp->interleaved = dvdread_getbits(&state, 1); + cp->stc_discontinuity = dvdread_getbits(&state, 1); + cp->seamless_angle = dvdread_getbits(&state, 1); + cp->playback_mode = dvdread_getbits(&state, 1); + cp->restricted = dvdread_getbits(&state, 1); + cp->unknown2 = dvdread_getbits(&state, 6); + cp->still_time = dvdread_getbits(&state, 8); + cp->cell_cmd_nr = dvdread_getbits(&state, 8); + + cp->playback_time.hour = dvdread_getbits(&state, 8); + cp->playback_time.minute = dvdread_getbits(&state, 8); + cp->playback_time.second = dvdread_getbits(&state, 8); + cp->playback_time.frame_u = dvdread_getbits(&state, 8); + + cp->first_sector = dvdread_getbits(&state, 32); + cp->first_ilvu_end_sector = dvdread_getbits(&state, 32); + cp->last_vobu_start_sector = dvdread_getbits(&state, 32); + cp->last_sector = dvdread_getbits(&state, 32); +} + ifo_handle_t *ifoOpen(dvd_reader_t *dvd, int title) { ifo_handle_t *ifofile; @@ -724,11 +753,7 @@ return 0; for(i = 0; i < nr; i++) { - B2N_32(cell_playback[i].first_sector); - B2N_32(cell_playback[i].first_ilvu_end_sector); - B2N_32(cell_playback[i].last_vobu_start_sector); - B2N_32(cell_playback[i].last_sector); - + read_cell_playback(&cell_playback[i]); /* Changed < to <= because this was false in the movie 'Pi'. */ CHECK_VALUE(cell_playback[i].last_vobu_start_sector <= cell_playback[i].last_sector); diff -r 3d8edef37c7e -r abca84921371 dvdread/ifo_types.h --- a/dvdread/ifo_types.h Sun May 11 09:43:48 2008 +0000 +++ b/dvdread/ifo_types.h Sun May 11 19:07:25 2008 +0000 @@ -203,29 +203,15 @@ * Cell Playback Information. */ typedef struct { -#ifdef WORDS_BIGENDIAN unsigned int block_mode : 2; unsigned int block_type : 2; unsigned int seamless_play : 1; unsigned int interleaved : 1; unsigned int stc_discontinuity: 1; unsigned int seamless_angle : 1; - unsigned int playback_mode : 1; /**< When set, enter StillMode after each VOBU */ unsigned int restricted : 1; /**< ?? drop out of fastforward? */ unsigned int unknown2 : 6; -#else - unsigned char seamless_angle : 1; - unsigned char stc_discontinuity: 1; - unsigned char interleaved : 1; - unsigned char seamless_play : 1; - unsigned char block_type : 2; - unsigned char block_mode : 2; - - unsigned char unknown2 : 6; - unsigned char restricted : 1; - unsigned char playback_mode : 1; -#endif uint8_t still_time; uint8_t cell_cmd_nr; dvd_time_t playback_time;