Mercurial > libdvdnav.hg
comparison dvdread/ifo_read.c @ 363:abca84921371 src
read_cell_playback() removes another conditional bitfield.
We're almost there!
author | nicodvb |
---|---|
date | Sun, 11 May 2008 19:07:25 +0000 |
parents | 3d8edef37c7e |
children | 23607807ff65 |
comparison
equal
deleted
inserted
replaced
362:3d8edef37c7e | 363:abca84921371 |
---|---|
224 ps->block_mode = dvdread_getbits(&state, 2); | 224 ps->block_mode = dvdread_getbits(&state, 2); |
225 ps->block_type = dvdread_getbits(&state, 2); | 225 ps->block_type = dvdread_getbits(&state, 2); |
226 ps->unknown1 = dvdread_getbits(&state, 4); | 226 ps->unknown1 = dvdread_getbits(&state, 4); |
227 ps->ptl_id_mask = dvdread_getbits(&state, 16); | 227 ps->ptl_id_mask = dvdread_getbits(&state, 16); |
228 ps->pgc_start_byte = dvdread_getbits(&state, 32); | 228 ps->pgc_start_byte = dvdread_getbits(&state, 32); |
229 } | |
230 | |
231 static void read_cell_playback(cell_playback_t *cp) { | |
232 getbits_state_t state; | |
233 uint8_t buf[sizeof(cell_playback_t)]; | |
234 | |
235 memcpy(buf, cp, sizeof(cell_playback_t)); | |
236 if (!dvdread_getbits_init(&state, buf)) abort(); | |
237 cp->block_mode = dvdread_getbits(&state, 2); | |
238 cp->block_type = dvdread_getbits(&state, 2); | |
239 cp->seamless_play = dvdread_getbits(&state, 1); | |
240 cp->interleaved = dvdread_getbits(&state, 1); | |
241 cp->stc_discontinuity = dvdread_getbits(&state, 1); | |
242 cp->seamless_angle = dvdread_getbits(&state, 1); | |
243 cp->playback_mode = dvdread_getbits(&state, 1); | |
244 cp->restricted = dvdread_getbits(&state, 1); | |
245 cp->unknown2 = dvdread_getbits(&state, 6); | |
246 cp->still_time = dvdread_getbits(&state, 8); | |
247 cp->cell_cmd_nr = dvdread_getbits(&state, 8); | |
248 | |
249 cp->playback_time.hour = dvdread_getbits(&state, 8); | |
250 cp->playback_time.minute = dvdread_getbits(&state, 8); | |
251 cp->playback_time.second = dvdread_getbits(&state, 8); | |
252 cp->playback_time.frame_u = dvdread_getbits(&state, 8); | |
253 | |
254 cp->first_sector = dvdread_getbits(&state, 32); | |
255 cp->first_ilvu_end_sector = dvdread_getbits(&state, 32); | |
256 cp->last_vobu_start_sector = dvdread_getbits(&state, 32); | |
257 cp->last_sector = dvdread_getbits(&state, 32); | |
229 } | 258 } |
230 | 259 |
231 ifo_handle_t *ifoOpen(dvd_reader_t *dvd, int title) { | 260 ifo_handle_t *ifoOpen(dvd_reader_t *dvd, int title) { |
232 ifo_handle_t *ifofile; | 261 ifo_handle_t *ifofile; |
233 | 262 |
722 | 751 |
723 if(!(DVDReadBytes(ifofile->file, cell_playback, size))) | 752 if(!(DVDReadBytes(ifofile->file, cell_playback, size))) |
724 return 0; | 753 return 0; |
725 | 754 |
726 for(i = 0; i < nr; i++) { | 755 for(i = 0; i < nr; i++) { |
727 B2N_32(cell_playback[i].first_sector); | 756 read_cell_playback(&cell_playback[i]); |
728 B2N_32(cell_playback[i].first_ilvu_end_sector); | |
729 B2N_32(cell_playback[i].last_vobu_start_sector); | |
730 B2N_32(cell_playback[i].last_sector); | |
731 | |
732 /* Changed < to <= because this was false in the movie 'Pi'. */ | 757 /* Changed < to <= because this was false in the movie 'Pi'. */ |
733 CHECK_VALUE(cell_playback[i].last_vobu_start_sector <= | 758 CHECK_VALUE(cell_playback[i].last_vobu_start_sector <= |
734 cell_playback[i].last_sector); | 759 cell_playback[i].last_sector); |
735 CHECK_VALUE(cell_playback[i].first_sector <= | 760 CHECK_VALUE(cell_playback[i].first_sector <= |
736 cell_playback[i].last_vobu_start_sector); | 761 cell_playback[i].last_vobu_start_sector); |