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);