comparison dvdread/nav_read.c @ 20981:22cb9d5f1e21

Rename libdvdread to dvdread. We really only include only the dvdread subdirectory of libdvdread. This will also allow getting rid of some local modifications.
author diego
date Sat, 18 Nov 2006 00:33:01 +0000
parents libdvdread/nav_read.c@1a4fcea7ab53
children de28f9e8cb00
comparison
equal deleted inserted replaced
20980:70ca50bcc4a8 20981:22cb9d5f1e21
1 /*
2 * Copyright (C) 2000, 2001, 2002, 2003 Håkan Hjort <d95hjort@dtek.chalmers.se>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */
18
19 #include "config.h"
20
21 #include <stdio.h>
22 #include <string.h>
23 #include <inttypes.h>
24
25 #include "bswap.h"
26 #include "nav_types.h"
27 #include "nav_read.h"
28 #include "dvdread_internal.h"
29
30 void navRead_PCI(pci_t *pci, unsigned char *buffer) {
31 int i, j;
32
33 CHECK_VALUE(sizeof(pci_t) == PCI_BYTES - 1); // -1 for substream id
34
35 memcpy(pci, buffer, sizeof(pci_t));
36
37 /* Endian conversions */
38
39 /* pci pci_gi */
40 B2N_32(pci->pci_gi.nv_pck_lbn);
41 B2N_16(pci->pci_gi.vobu_cat);
42 B2N_32(pci->pci_gi.vobu_s_ptm);
43 B2N_32(pci->pci_gi.vobu_e_ptm);
44 B2N_32(pci->pci_gi.vobu_se_e_ptm);
45
46 /* pci nsml_agli */
47 for(i = 0; i < 9; i++)
48 B2N_32(pci->nsml_agli.nsml_agl_dsta[i]);
49
50 /* pci hli hli_gi */
51 B2N_16(pci->hli.hl_gi.hli_ss);
52 B2N_32(pci->hli.hl_gi.hli_s_ptm);
53 B2N_32(pci->hli.hl_gi.hli_e_ptm);
54 B2N_32(pci->hli.hl_gi.btn_se_e_ptm);
55
56 /* pci hli btn_colit */
57 for(i = 0; i < 3; i++)
58 for(j = 0; j < 2; j++)
59 B2N_32(pci->hli.btn_colit.btn_coli[i][j]);
60
61 /* NOTE: I've had to change the structure from the disk layout to get
62 * the packing to work with Sun's Forte C compiler. */
63
64 /* pci hli btni */
65 for(i = 0; i < 36; i++) {
66 char tmp[sizeof(pci->hli.btnit[i])], swap;
67 memcpy(tmp, &(pci->hli.btnit[i]), sizeof(pci->hli.btnit[i]));
68 /* Byte 4 to 7 are 'rotated' was: ABCD EFGH IJ is: ABCG DEFH IJ */
69 swap = tmp[6];
70 tmp[6] = tmp[5];
71 tmp[5] = tmp[4];
72 tmp[4] = tmp[3];
73 tmp[3] = swap;
74
75 /* Then there are the two B2N_24(..) calls */
76 #ifndef WORDS_BIGENDIAN
77 swap = tmp[0];
78 tmp[0] = tmp[2];
79 tmp[2] = swap;
80
81 swap = tmp[4];
82 tmp[4] = tmp[6];
83 tmp[6] = swap;
84 #endif
85 memcpy(&(pci->hli.btnit[i]), tmp, sizeof(pci->hli.btnit[i]));
86 }
87
88
89 #ifndef NDEBUG
90 /* Asserts */
91
92 /* pci pci gi */
93 CHECK_VALUE(pci->pci_gi.zero1 == 0);
94
95 /* pci hli hli_gi */
96 CHECK_VALUE(pci->hli.hl_gi.zero1 == 0);
97 CHECK_VALUE(pci->hli.hl_gi.zero2 == 0);
98 CHECK_VALUE(pci->hli.hl_gi.zero3 == 0);
99 CHECK_VALUE(pci->hli.hl_gi.zero4 == 0);
100 CHECK_VALUE(pci->hli.hl_gi.zero5 == 0);
101
102 /* Are there buttons defined here? */
103 if((pci->hli.hl_gi.hli_ss & 0x03) != 0) {
104 CHECK_VALUE(pci->hli.hl_gi.btn_ns != 0);
105 CHECK_VALUE(pci->hli.hl_gi.btngr_ns != 0);
106 } else {
107 CHECK_VALUE((pci->hli.hl_gi.btn_ns != 0 && pci->hli.hl_gi.btngr_ns != 0)
108 || (pci->hli.hl_gi.btn_ns == 0 && pci->hli.hl_gi.btngr_ns == 0));
109 }
110
111 /* pci hli btnit */
112 for(i = 0; i < pci->hli.hl_gi.btngr_ns; i++) {
113 for(j = 0; j < (36 / pci->hli.hl_gi.btngr_ns); j++) {
114 int n = (36 / pci->hli.hl_gi.btngr_ns) * i + j;
115 CHECK_VALUE(pci->hli.btnit[n].zero1 == 0);
116 CHECK_VALUE(pci->hli.btnit[n].zero2 == 0);
117 CHECK_VALUE(pci->hli.btnit[n].zero3 == 0);
118 CHECK_VALUE(pci->hli.btnit[n].zero4 == 0);
119 CHECK_VALUE(pci->hli.btnit[n].zero5 == 0);
120 CHECK_VALUE(pci->hli.btnit[n].zero6 == 0);
121
122 if (j < pci->hli.hl_gi.btn_ns) {
123 CHECK_VALUE(pci->hli.btnit[n].x_start <= pci->hli.btnit[n].x_end);
124 CHECK_VALUE(pci->hli.btnit[n].y_start <= pci->hli.btnit[n].y_end);
125 CHECK_VALUE(pci->hli.btnit[n].up <= pci->hli.hl_gi.btn_ns);
126 CHECK_VALUE(pci->hli.btnit[n].down <= pci->hli.hl_gi.btn_ns);
127 CHECK_VALUE(pci->hli.btnit[n].left <= pci->hli.hl_gi.btn_ns);
128 CHECK_VALUE(pci->hli.btnit[n].right <= pci->hli.hl_gi.btn_ns);
129 //vmcmd_verify(pci->hli.btnit[n].cmd);
130 } else {
131 int k;
132 CHECK_VALUE(pci->hli.btnit[n].btn_coln == 0);
133 CHECK_VALUE(pci->hli.btnit[n].auto_action_mode == 0);
134 CHECK_VALUE(pci->hli.btnit[n].x_start == 0);
135 CHECK_VALUE(pci->hli.btnit[n].y_start == 0);
136 CHECK_VALUE(pci->hli.btnit[n].x_end == 0);
137 CHECK_VALUE(pci->hli.btnit[n].y_end == 0);
138 CHECK_VALUE(pci->hli.btnit[n].up == 0);
139 CHECK_VALUE(pci->hli.btnit[n].down == 0);
140 CHECK_VALUE(pci->hli.btnit[n].left == 0);
141 CHECK_VALUE(pci->hli.btnit[n].right == 0);
142 for (k = 0; k < 8; k++)
143 CHECK_VALUE(pci->hli.btnit[n].cmd.bytes[k] == 0); //CHECK_ZERO?
144 }
145 }
146 }
147 #endif /* !NDEBUG */
148 }
149
150 void navRead_DSI(dsi_t *dsi, unsigned char *buffer) {
151 int i;
152
153 CHECK_VALUE(sizeof(dsi_t) == DSI_BYTES - 1); // -1 for substream id
154
155 memcpy(dsi, buffer, sizeof(dsi_t));
156
157 /* Endian conversions */
158
159 /* dsi dsi gi */
160 B2N_32(dsi->dsi_gi.nv_pck_scr);
161 B2N_32(dsi->dsi_gi.nv_pck_lbn);
162 B2N_32(dsi->dsi_gi.vobu_ea);
163 B2N_32(dsi->dsi_gi.vobu_1stref_ea);
164 B2N_32(dsi->dsi_gi.vobu_2ndref_ea);
165 B2N_32(dsi->dsi_gi.vobu_3rdref_ea);
166 B2N_16(dsi->dsi_gi.vobu_vob_idn);
167
168 /* dsi sml pbi */
169 B2N_16(dsi->sml_pbi.category);
170 B2N_32(dsi->sml_pbi.ilvu_ea);
171 B2N_32(dsi->sml_pbi.ilvu_sa);
172 B2N_16(dsi->sml_pbi.size);
173 B2N_32(dsi->sml_pbi.vob_v_s_s_ptm);
174 B2N_32(dsi->sml_pbi.vob_v_e_e_ptm);
175
176 /* dsi sml agli */
177 for(i = 0; i < 9; i++) {
178 B2N_32(dsi->sml_agli.data[ i ].address);
179 B2N_16(dsi->sml_agli.data[ i ].size);
180 }
181
182 /* dsi vobu sri */
183 B2N_32(dsi->vobu_sri.next_video);
184 for(i = 0; i < 19; i++)
185 B2N_32(dsi->vobu_sri.fwda[i]);
186 B2N_32(dsi->vobu_sri.next_vobu);
187 B2N_32(dsi->vobu_sri.prev_vobu);
188 for(i = 0; i < 19; i++)
189 B2N_32(dsi->vobu_sri.bwda[i]);
190 B2N_32(dsi->vobu_sri.prev_video);
191
192 /* dsi synci */
193 for(i = 0; i < 8; i++)
194 B2N_16(dsi->synci.a_synca[i]);
195 for(i = 0; i < 32; i++)
196 B2N_32(dsi->synci.sp_synca[i]);
197
198
199 /* Asserts */
200
201 /* dsi dsi gi */
202 CHECK_VALUE(dsi->dsi_gi.zero1 == 0);
203 }
204