Mercurial > libdvdnav.hg
changeset 350:950749fdce4a src
read_multichannel_ext() uses getbits() instead of relying on endianness-specific bitfields
author | nicodvb |
---|---|
date | Sat, 03 May 2008 08:04:34 +0000 |
parents | 8a711d89e294 |
children | c2218d2a9387 |
files | dvdread/ifo_read.c dvdread/ifo_types.h |
diffstat | 2 files changed, 29 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- a/dvdread/ifo_read.c Sat May 03 07:50:09 2008 +0000 +++ b/dvdread/ifo_read.c Sat May 03 08:04:34 2008 +0000 @@ -139,6 +139,34 @@ fprintf(stderr, "\r\nLANG: %c%c, x: %x\r\n", aa->lang_code>>8, aa->lang_code&0xFF, aa->lang_code); } +static void read_multichannel_ext(multichannel_ext_t *me) { + getbits_state_t state; + uint8_t buf[sizeof(multichannel_ext_t)]; + + memcpy(buf, me, sizeof(multichannel_ext_t)); + if (!dvdread_getbits_init(&state, buf)) abort(); + me->zero1 = dvdread_getbits(&state, 7); + me->ach0_gme = dvdread_getbits(&state, 1); + me->zero2 = dvdread_getbits(&state, 7); + me->ach1_gme = dvdread_getbits(&state, 1); + me->zero3 = dvdread_getbits(&state, 4); + me->ach2_gv1e = dvdread_getbits(&state, 1); + me->ach2_gv2e = dvdread_getbits(&state, 1); + me->ach2_gm1e = dvdread_getbits(&state, 1); + me->ach2_gm2e = dvdread_getbits(&state, 1); + me->zero4 = dvdread_getbits(&state, 4); + me->ach3_gv1e = dvdread_getbits(&state, 1); + me->ach3_gv2e = dvdread_getbits(&state, 1); + me->ach3_gmAe = dvdread_getbits(&state, 1); + me->ach3_se2e = dvdread_getbits(&state, 1); + me->zero5 = dvdread_getbits(&state, 4); + me->ach4_gv1e = dvdread_getbits(&state, 1); + me->ach4_gv2e = dvdread_getbits(&state, 1); + me->ach4_gmBe = dvdread_getbits(&state, 1); + me->ach4_seBe = dvdread_getbits(&state, 1); +} + + ifo_handle_t *ifoOpen(dvd_reader_t *dvd, int title) { ifo_handle_t *ifofile; @@ -510,6 +538,7 @@ CHECK_ZERO(vtsi_mat->vts_subp_attr[i]); for(i = 0; i < 8; i++) { + read_multichannel_ext(&vtsi_mat->vts_mu_audio_attr[i]); CHECK_ZERO0(vtsi_mat->vts_mu_audio_attr[i].zero1); CHECK_ZERO0(vtsi_mat->vts_mu_audio_attr[i].zero2); CHECK_ZERO0(vtsi_mat->vts_mu_audio_attr[i].zero3);
--- a/dvdread/ifo_types.h Sat May 03 07:50:09 2008 +0000 +++ b/dvdread/ifo_types.h Sat May 03 08:04:34 2008 +0000 @@ -128,7 +128,6 @@ * MultiChannel Extension */ typedef struct { -#ifdef WORDS_BIGENDIAN unsigned int zero1 : 7; unsigned int ach0_gme : 1; @@ -152,31 +151,6 @@ unsigned int ach4_gv2e : 1; unsigned int ach4_gmBe : 1; unsigned int ach4_seBe : 1; -#else - unsigned char ach0_gme : 1; - unsigned char zero1 : 7; - - unsigned char ach1_gme : 1; - unsigned char zero2 : 7; - - unsigned char ach2_gm2e : 1; - unsigned char ach2_gm1e : 1; - unsigned char ach2_gv2e : 1; - unsigned char ach2_gv1e : 1; - unsigned char zero3 : 4; - - unsigned char ach3_se2e : 1; - unsigned char ach3_gmAe : 1; - unsigned char ach3_gv2e : 1; - unsigned char ach3_gv1e : 1; - unsigned char zero4 : 4; - - unsigned char ach4_seBe : 1; - unsigned char ach4_gmBe : 1; - unsigned char ach4_gv2e : 1; - unsigned char ach4_gv1e : 1; - unsigned char zero5 : 4; -#endif uint8_t zero6[19]; } ATTRIBUTE_PACKED multichannel_ext_t;