Mercurial > libdvdread4.hg
annotate nav_read.c @ 46:4f40782ab5fc src
Expose the dvd_stat_t struct.
The commits that brought in the DVDFileStat() function from libdvdread
0.9.7 incorrectly made the stat struct opaque. This can't be done because
the API does not use any allocation or deallocation code. So callers of
DVDFileStat cannot declare stat structs. Since we are attempting to
maintain the API compatibility w/ those releases of libdvdread, the
struct has been brought into the header. Thanks again to Rathann for
bringing this issue to the dvdnav list. And thanks to the original
bug reportera(O. Rolland) to fedora.
author | erik |
---|---|
date | Mon, 07 Dec 2009 03:50:20 +0000 |
parents | c743d79f187b |
children |
rev | line source |
---|---|
3 | 1 /* |
22 | 2 * Copyright (C) 2000, 2001, 2002, 2003 HÃ¥kan Hjort <d95hjort@dtek.chalmers.se> |
3 | 3 * |
21
4aa618ae094f
Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents:
20
diff
changeset
|
4 * This file is part of libdvdread. |
4aa618ae094f
Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents:
20
diff
changeset
|
5 * |
4aa618ae094f
Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents:
20
diff
changeset
|
6 * libdvdread is free software; you can redistribute it and/or modify |
3 | 7 * it under the terms of the GNU General Public License as published by |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
21
4aa618ae094f
Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents:
20
diff
changeset
|
11 * libdvdread is distributed in the hope that it will be useful, |
3 | 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
21
4aa618ae094f
Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents:
20
diff
changeset
|
16 * You should have received a copy of the GNU General Public License along |
4aa618ae094f
Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents:
20
diff
changeset
|
17 * with libdvdread; if not, write to the Free Software Foundation, Inc., |
4aa618ae094f
Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents:
20
diff
changeset
|
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
3 | 19 */ |
20 | |
21 #include "config.h" | |
22 | |
23 #include <stdio.h> | |
24 #include <stdlib.h> | |
25 #include <string.h> | |
26 #include <inttypes.h> | |
27 | |
28 #include "bswap.h" | |
33
c743d79f187b
Move installed headers into dvdread directory to make them easier to
reimar
parents:
27
diff
changeset
|
29 #include "dvdread/nav_types.h" |
c743d79f187b
Move installed headers into dvdread directory to make them easier to
reimar
parents:
27
diff
changeset
|
30 #include "dvdread/nav_read.h" |
3 | 31 #include "dvdread_internal.h" |
33
c743d79f187b
Move installed headers into dvdread directory to make them easier to
reimar
parents:
27
diff
changeset
|
32 #include "dvdread/bitreader.h" |
3 | 33 |
34 #define getbits_init dvdread_getbits_init | |
35 #define getbits dvdread_getbits | |
36 | |
37 void navRead_PCI(pci_t *pci, unsigned char *buffer) { | |
38 int32_t i, j; | |
39 getbits_state_t state; | |
40 if (!getbits_init(&state, buffer)) abort(); /* Passed NULL pointers */ | |
41 | |
42 /* pci pci_gi */ | |
43 pci->pci_gi.nv_pck_lbn = getbits(&state, 32 ); | |
44 pci->pci_gi.vobu_cat = getbits(&state, 16 ); | |
45 pci->pci_gi.zero1 = getbits(&state, 16 ); | |
46 pci->pci_gi.vobu_uop_ctl.zero = getbits(&state, 7 ); | |
47 pci->pci_gi.vobu_uop_ctl.video_pres_mode_change = getbits(&state, 1 ); | |
48 | |
20 | 49 pci->pci_gi.vobu_uop_ctl.karaoke_audio_pres_mode_change = getbits(&state, 1 ); |
3 | 50 pci->pci_gi.vobu_uop_ctl.angle_change = getbits(&state, 1 ); |
51 pci->pci_gi.vobu_uop_ctl.subpic_stream_change = getbits(&state, 1 ); | |
52 pci->pci_gi.vobu_uop_ctl.audio_stream_change = getbits(&state, 1 ); | |
53 pci->pci_gi.vobu_uop_ctl.pause_on = getbits(&state, 1 ); | |
54 pci->pci_gi.vobu_uop_ctl.still_off = getbits(&state, 1 ); | |
55 pci->pci_gi.vobu_uop_ctl.button_select_or_activate = getbits(&state, 1 ); | |
56 pci->pci_gi.vobu_uop_ctl.resume = getbits(&state, 1 ); | |
57 | |
20 | 58 pci->pci_gi.vobu_uop_ctl.chapter_menu_call = getbits(&state, 1 ); |
3 | 59 pci->pci_gi.vobu_uop_ctl.angle_menu_call = getbits(&state, 1 ); |
60 pci->pci_gi.vobu_uop_ctl.audio_menu_call = getbits(&state, 1 ); | |
61 pci->pci_gi.vobu_uop_ctl.subpic_menu_call = getbits(&state, 1 ); | |
62 pci->pci_gi.vobu_uop_ctl.root_menu_call = getbits(&state, 1 ); | |
63 pci->pci_gi.vobu_uop_ctl.title_menu_call = getbits(&state, 1 ); | |
64 pci->pci_gi.vobu_uop_ctl.backward_scan = getbits(&state, 1 ); | |
65 pci->pci_gi.vobu_uop_ctl.forward_scan = getbits(&state, 1 ); | |
66 | |
20 | 67 pci->pci_gi.vobu_uop_ctl.next_pg_search = getbits(&state, 1 ); |
3 | 68 pci->pci_gi.vobu_uop_ctl.prev_or_top_pg_search = getbits(&state, 1 ); |
69 pci->pci_gi.vobu_uop_ctl.time_or_chapter_search = getbits(&state, 1 ); | |
70 pci->pci_gi.vobu_uop_ctl.go_up = getbits(&state, 1 ); | |
71 pci->pci_gi.vobu_uop_ctl.stop = getbits(&state, 1 ); | |
72 pci->pci_gi.vobu_uop_ctl.title_play = getbits(&state, 1 ); | |
73 pci->pci_gi.vobu_uop_ctl.chapter_search_or_play = getbits(&state, 1 ); | |
74 pci->pci_gi.vobu_uop_ctl.title_or_time_play = getbits(&state, 1 ); | |
20 | 75 pci->pci_gi.vobu_s_ptm = getbits(&state, 32 ); |
76 pci->pci_gi.vobu_e_ptm = getbits(&state, 32 ); | |
77 pci->pci_gi.vobu_se_e_ptm = getbits(&state, 32 ); | |
3 | 78 pci->pci_gi.e_eltm.hour = getbits(&state, 8 ); |
79 pci->pci_gi.e_eltm.minute = getbits(&state, 8 ); | |
80 pci->pci_gi.e_eltm.second = getbits(&state, 8 ); | |
81 pci->pci_gi.e_eltm.frame_u = getbits(&state, 8 ); | |
82 for(i = 0; i < 32; i++) | |
83 pci->pci_gi.vobu_isrc[i] = getbits(&state, 8 ); | |
84 | |
85 /* pci nsml_agli */ | |
86 for(i = 0; i < 9; i++) | |
87 pci->nsml_agli.nsml_agl_dsta[i] = getbits(&state, 32 ); | |
88 | |
89 /* pci hli hli_gi */ | |
90 pci->hli.hl_gi.hli_ss = getbits(&state, 16 ); | |
20 | 91 pci->hli.hl_gi.hli_s_ptm = getbits(&state, 32 ); |
3 | 92 pci->hli.hl_gi.hli_e_ptm = getbits(&state, 32 ); |
93 pci->hli.hl_gi.btn_se_e_ptm = getbits(&state, 32 ); | |
94 pci->hli.hl_gi.zero1 = getbits(&state, 2 ); | |
95 pci->hli.hl_gi.btngr_ns = getbits(&state, 2 ); | |
96 pci->hli.hl_gi.zero2 = getbits(&state, 1 ); | |
97 pci->hli.hl_gi.btngr1_dsp_ty = getbits(&state, 3 ); | |
98 pci->hli.hl_gi.zero3 = getbits(&state, 1 ); | |
99 pci->hli.hl_gi.btngr2_dsp_ty = getbits(&state, 3 ); | |
100 pci->hli.hl_gi.zero4 = getbits(&state, 1 ); | |
101 pci->hli.hl_gi.btngr3_dsp_ty = getbits(&state, 3 ); | |
102 pci->hli.hl_gi.btn_ofn = getbits(&state, 8 ); | |
103 pci->hli.hl_gi.btn_ns = getbits(&state, 8 ); | |
20 | 104 pci->hli.hl_gi.nsl_btn_ns = getbits(&state, 8 ); |
3 | 105 pci->hli.hl_gi.zero5 = getbits(&state, 8 ); |
106 pci->hli.hl_gi.fosl_btnn = getbits(&state, 8 ); | |
107 pci->hli.hl_gi.foac_btnn = getbits(&state, 8 ); | |
108 | |
109 /* pci hli btn_colit */ | |
110 for(i = 0; i < 3; i++) | |
111 for(j = 0; j < 2; j++) | |
20 | 112 pci->hli.btn_colit.btn_coli[i][j] = getbits(&state, 32 ); |
3 | 113 |
114 /* NOTE: I've had to change the structure from the disk layout to get | |
115 * the packing to work with Sun's Forte C compiler. */ | |
20 | 116 |
3 | 117 /* pci hli btni */ |
118 for(i = 0; i < 36; i++) { | |
119 pci->hli.btnit[i].btn_coln = getbits(&state, 2 ); | |
120 pci->hli.btnit[i].x_start = getbits(&state, 10 ); | |
121 pci->hli.btnit[i].zero1 = getbits(&state, 2 ); | |
122 pci->hli.btnit[i].x_end = getbits(&state, 10 ); | |
123 | |
124 pci->hli.btnit[i].auto_action_mode = getbits(&state, 2 ); | |
125 pci->hli.btnit[i].y_start = getbits(&state, 10 ); | |
126 pci->hli.btnit[i].zero2 = getbits(&state, 2 ); | |
127 pci->hli.btnit[i].y_end = getbits(&state, 10 ); | |
128 | |
129 pci->hli.btnit[i].zero3 = getbits(&state, 2 ); | |
130 pci->hli.btnit[i].up = getbits(&state, 6 ); | |
131 pci->hli.btnit[i].zero4 = getbits(&state, 2 ); | |
132 pci->hli.btnit[i].down = getbits(&state, 6 ); | |
133 pci->hli.btnit[i].zero5 = getbits(&state, 2 ); | |
134 pci->hli.btnit[i].left = getbits(&state, 6 ); | |
135 pci->hli.btnit[i].zero6 = getbits(&state, 2 ); | |
136 pci->hli.btnit[i].right = getbits(&state, 6 ); | |
137 /* pci vm_cmd */ | |
138 for(j = 0; j < 8; j++) | |
139 pci->hli.btnit[i].cmd.bytes[j] = getbits(&state, 8 ); | |
140 } | |
141 | |
142 | |
143 #ifndef NDEBUG | |
144 /* Asserts */ | |
145 | |
20 | 146 /* pci pci gi */ |
3 | 147 CHECK_VALUE(pci->pci_gi.zero1 == 0); |
148 | |
149 /* pci hli hli_gi */ | |
150 CHECK_VALUE(pci->hli.hl_gi.zero1 == 0); | |
151 CHECK_VALUE(pci->hli.hl_gi.zero2 == 0); | |
152 CHECK_VALUE(pci->hli.hl_gi.zero3 == 0); | |
153 CHECK_VALUE(pci->hli.hl_gi.zero4 == 0); | |
154 CHECK_VALUE(pci->hli.hl_gi.zero5 == 0); | |
155 | |
156 /* Are there buttons defined here? */ | |
157 if((pci->hli.hl_gi.hli_ss & 0x03) != 0) { | |
20 | 158 CHECK_VALUE(pci->hli.hl_gi.btn_ns != 0); |
159 CHECK_VALUE(pci->hli.hl_gi.btngr_ns != 0); | |
3 | 160 } else { |
20 | 161 CHECK_VALUE((pci->hli.hl_gi.btn_ns != 0 && pci->hli.hl_gi.btngr_ns != 0) |
27
98951f8ec89c
cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents:
26
diff
changeset
|
162 || (pci->hli.hl_gi.btn_ns == 0 && pci->hli.hl_gi.btngr_ns == 0)); |
3 | 163 } |
164 | |
165 /* pci hli btnit */ | |
166 for(i = 0; i < pci->hli.hl_gi.btngr_ns; i++) { | |
167 for(j = 0; j < (36 / pci->hli.hl_gi.btngr_ns); j++) { | |
168 int n = (36 / pci->hli.hl_gi.btngr_ns) * i + j; | |
169 CHECK_VALUE(pci->hli.btnit[n].zero1 == 0); | |
170 CHECK_VALUE(pci->hli.btnit[n].zero2 == 0); | |
171 CHECK_VALUE(pci->hli.btnit[n].zero3 == 0); | |
172 CHECK_VALUE(pci->hli.btnit[n].zero4 == 0); | |
173 CHECK_VALUE(pci->hli.btnit[n].zero5 == 0); | |
174 CHECK_VALUE(pci->hli.btnit[n].zero6 == 0); | |
20 | 175 |
176 if (j < pci->hli.hl_gi.btn_ns) { | |
26 | 177 CHECK_VALUE(pci->hli.btnit[n].x_start <= pci->hli.btnit[n].x_end); |
178 CHECK_VALUE(pci->hli.btnit[n].y_start <= pci->hli.btnit[n].y_end); | |
179 CHECK_VALUE(pci->hli.btnit[n].up <= pci->hli.hl_gi.btn_ns); | |
180 CHECK_VALUE(pci->hli.btnit[n].down <= pci->hli.hl_gi.btn_ns); | |
181 CHECK_VALUE(pci->hli.btnit[n].left <= pci->hli.hl_gi.btn_ns); | |
182 CHECK_VALUE(pci->hli.btnit[n].right <= pci->hli.hl_gi.btn_ns); | |
183 /* vmcmd_verify(pci->hli.btnit[n].cmd); */ | |
3 | 184 } else { |
26 | 185 int k; |
186 CHECK_VALUE(pci->hli.btnit[n].btn_coln == 0); | |
187 CHECK_VALUE(pci->hli.btnit[n].auto_action_mode == 0); | |
188 CHECK_VALUE(pci->hli.btnit[n].x_start == 0); | |
189 CHECK_VALUE(pci->hli.btnit[n].y_start == 0); | |
190 CHECK_VALUE(pci->hli.btnit[n].x_end == 0); | |
191 CHECK_VALUE(pci->hli.btnit[n].y_end == 0); | |
192 CHECK_VALUE(pci->hli.btnit[n].up == 0); | |
193 CHECK_VALUE(pci->hli.btnit[n].down == 0); | |
194 CHECK_VALUE(pci->hli.btnit[n].left == 0); | |
195 CHECK_VALUE(pci->hli.btnit[n].right == 0); | |
196 for (k = 0; k < 8; k++) | |
197 CHECK_VALUE(pci->hli.btnit[n].cmd.bytes[k] == 0); /* CHECK_ZERO? */ | |
3 | 198 } |
199 } | |
200 } | |
201 #endif /* !NDEBUG */ | |
202 } | |
203 | |
204 void navRead_DSI(dsi_t *dsi, unsigned char *buffer) { | |
205 int i; | |
206 getbits_state_t state; | |
207 if (!getbits_init(&state, buffer)) abort(); /* Passed NULL pointers */ | |
208 | |
209 /* dsi dsi gi */ | |
210 dsi->dsi_gi.nv_pck_scr = getbits(&state, 32 ); | |
211 dsi->dsi_gi.nv_pck_lbn = getbits(&state, 32 ); | |
212 dsi->dsi_gi.vobu_ea = getbits(&state, 32 ); | |
213 dsi->dsi_gi.vobu_1stref_ea = getbits(&state, 32 ); | |
214 dsi->dsi_gi.vobu_2ndref_ea = getbits(&state, 32 ); | |
215 dsi->dsi_gi.vobu_3rdref_ea = getbits(&state, 32 ); | |
216 dsi->dsi_gi.vobu_vob_idn = getbits(&state, 16 ); | |
217 dsi->dsi_gi.zero1 = getbits(&state, 8 ); | |
218 dsi->dsi_gi.vobu_c_idn = getbits(&state, 8 ); | |
219 dsi->dsi_gi.c_eltm.hour = getbits(&state, 8 ); | |
220 dsi->dsi_gi.c_eltm.minute = getbits(&state, 8 ); | |
221 dsi->dsi_gi.c_eltm.second = getbits(&state, 8 ); | |
222 dsi->dsi_gi.c_eltm.frame_u = getbits(&state, 8 ); | |
223 | |
224 /* dsi sml pbi */ | |
225 dsi->sml_pbi.category = getbits(&state, 16 ); | |
226 dsi->sml_pbi.ilvu_ea = getbits(&state, 32 ); | |
227 dsi->sml_pbi.ilvu_sa = getbits(&state, 32 ); | |
228 dsi->sml_pbi.size = getbits(&state, 16 ); | |
229 dsi->sml_pbi.vob_v_s_s_ptm = getbits(&state, 32 ); | |
230 dsi->sml_pbi.vob_v_e_e_ptm = getbits(&state, 32 ); | |
231 for(i = 0; i < 8; i++) { | |
232 dsi->sml_pbi.vob_a[i].stp_ptm1 = getbits(&state, 32 ); | |
233 dsi->sml_pbi.vob_a[i].stp_ptm2 = getbits(&state, 32 ); | |
234 dsi->sml_pbi.vob_a[i].gap_len1 = getbits(&state, 32 ); | |
235 dsi->sml_pbi.vob_a[i].gap_len2 = getbits(&state, 32 ); | |
236 } | |
237 | |
238 /* dsi sml agli */ | |
239 for(i = 0; i < 9; i++) { | |
240 dsi->sml_agli.data[ i ].address = getbits(&state, 32 ); | |
241 dsi->sml_agli.data[ i ].size = getbits(&state, 16 ); | |
242 } | |
243 | |
244 /* dsi vobu sri */ | |
245 dsi->vobu_sri.next_video = getbits(&state, 32 ); | |
246 for(i = 0; i < 19; i++) | |
247 dsi->vobu_sri.fwda[i] = getbits(&state, 32 ); | |
248 dsi->vobu_sri.next_vobu = getbits(&state, 32 ); | |
249 dsi->vobu_sri.prev_vobu = getbits(&state, 32 ); | |
250 for(i = 0; i < 19; i++) | |
251 dsi->vobu_sri.bwda[i] = getbits(&state, 32 ); | |
252 dsi->vobu_sri.prev_video = getbits(&state, 32 ); | |
253 | |
254 /* dsi synci */ | |
255 for(i = 0; i < 8; i++) | |
256 dsi->synci.a_synca[i] = getbits(&state, 16 ); | |
257 for(i = 0; i < 32; i++) | |
258 dsi->synci.sp_synca[i] = getbits(&state, 32 ); | |
259 | |
20 | 260 |
3 | 261 /* Asserts */ |
262 | |
263 /* dsi dsi gi */ | |
264 CHECK_VALUE(dsi->dsi_gi.zero1 == 0); | |
265 } |