Mercurial > mplayer.hg
annotate stream/vcd_read_darwin.h @ 22616:09dc129234a0
Matroska seeking fixes
If a relative seek forward went past the last index position the
Matroska demuxer did not seek to any index position. It did however set
the mkv_d->skip_to_timecode variable which meant that the next
fill_buffer() call would read from the current position until the target
position (probably the end of the file). Fix this by changing the code
to seek to the last index position if that is between the current and
target positions.
Also change backwards relative seek to accept an exactly matching index
position (<= vs <) and reorganize the seeking conditionals to allow
making the above change without turning the code into a complete mess.
author | uau |
---|---|
date | Fri, 16 Mar 2007 14:55:41 +0000 |
parents | 64d82a45a05d |
children | 300e9b7c499f |
rev | line source |
---|---|
13842 | 1 #include <sys/types.h> |
2 #include <CoreFoundation/CFBase.h> | |
3 #include <IOKit/IOKitLib.h> | |
4 #include <IOKit/storage/IOCDTypes.h> | |
5 #include <IOKit/storage/IOCDMedia.h> | |
13682 | 6 #include <IOKit/storage/IOCDMediaBSDClient.h> |
7 | |
8 //=================== VideoCD ========================== | |
9 #define CDROM_LEADOUT 0xAA | |
10 | |
11 typedef struct | |
12 { | |
13 uint8_t sync [12]; | |
14 uint8_t header [4]; | |
15 uint8_t subheader [8]; | |
16 uint8_t data [2324]; | |
17 uint8_t spare [4]; | |
18 } cdsector_t; | |
19 | |
20 typedef struct mp_vcd_priv_st | |
21 { | |
22 int fd; | |
23 dk_cd_read_track_info_t entry; | |
24 CDMSF msf; | |
25 cdsector_t buf; | |
26 } mp_vcd_priv_t; | |
27 | |
28 static inline void vcd_set_msf(mp_vcd_priv_t* vcd, unsigned int sect) | |
29 { | |
30 vcd->msf.frame=sect%75; | |
31 sect=sect/75; | |
32 vcd->msf.second=sect%60; | |
33 sect=sect/60; | |
34 vcd->msf.minute=sect; | |
35 } | |
36 | |
37 static inline unsigned int vcd_get_msf(mp_vcd_priv_t* vcd) | |
38 { | |
39 return vcd->msf.frame + | |
40 (vcd->msf.second+ | |
41 vcd->msf.minute*60)*75; | |
42 | |
43 return 0; | |
44 } | |
45 | |
46 int vcd_seek_to_track(mp_vcd_priv_t* vcd, int track) | |
47 { | |
48 dk_cd_read_track_info_t tocentry; | |
49 struct CDTrackInfo entry; | |
50 | |
51 memset( &vcd->entry, 0, sizeof(vcd->entry)); | |
52 vcd->entry.addressType = kCDTrackInfoAddressTypeTrackNumber; | |
53 vcd->entry.address = track; | |
54 vcd->entry.bufferLength = sizeof(entry); | |
55 vcd->entry.buffer = &entry; | |
56 | |
57 if (ioctl(vcd->fd, DKIOCCDREADTRACKINFO, &vcd->entry)) | |
58 { | |
59 mp_msg(MSGT_STREAM,MSGL_ERR,"ioctl dif1: %s\n",strerror(errno)); | |
60 return -1; | |
61 } | |
62 return VCD_SECTOR_DATA*vcd_get_msf(vcd); | |
63 | |
64 return -1; | |
65 } | |
66 | |
67 int vcd_get_track_end(mp_vcd_priv_t* vcd, int track) | |
68 { | |
69 dk_cd_read_disc_info_t tochdr; | |
70 struct CDDiscInfo hdr; | |
71 | |
72 dk_cd_read_track_info_t tocentry; | |
73 struct CDTrackInfo entry; | |
74 | |
75 //read toc header | |
76 memset(&tochdr, 0, sizeof(tochdr)); | |
77 tochdr.buffer = &hdr; | |
78 tochdr.bufferLength = sizeof(hdr); | |
79 | |
80 if (ioctl(vcd->fd, DKIOCCDREADDISCINFO, &tochdr) < 0) | |
81 { | |
82 mp_msg(MSGT_OPEN,MSGL_ERR,"read CDROM toc header: %s\n",strerror(errno)); | |
83 return NULL; | |
84 } | |
85 | |
86 //read track info | |
87 memset( &vcd->entry, 0, sizeof(vcd->entry)); | |
88 vcd->entry.addressType = kCDTrackInfoAddressTypeTrackNumber; | |
89 vcd->entry.address = track<(hdr.lastTrackNumberInLastSessionLSB+1)?(track):CDROM_LEADOUT; | |
90 vcd->entry.bufferLength = sizeof(entry); | |
91 vcd->entry.buffer = &entry; | |
92 | |
93 if (ioctl(vcd->fd, DKIOCCDREADTRACKINFO, &vcd->entry)) | |
94 { | |
95 mp_msg(MSGT_STREAM,MSGL_ERR,"ioctl dif2: %s\n",strerror(errno)); | |
96 return -1; | |
97 } | |
98 return VCD_SECTOR_DATA*vcd_get_msf(vcd); | |
99 | |
100 return -1; | |
101 } | |
102 | |
103 mp_vcd_priv_t* vcd_read_toc(int fd) | |
104 { | |
105 dk_cd_read_disc_info_t tochdr; | |
106 struct CDDiscInfo hdr; | |
107 | |
108 dk_cd_read_track_info_t tocentry; | |
109 struct CDTrackInfo entry; | |
110 CDMSF trackMSF; | |
111 | |
112 mp_vcd_priv_t* vcd; | |
16547
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
113 int i, min = 0, sec = 0, frame = 0; |
13682 | 114 |
115 //read toc header | |
116 memset(&tochdr, 0, sizeof(tochdr)); | |
117 tochdr.buffer = &hdr; | |
118 tochdr.bufferLength = sizeof(hdr); | |
119 | |
120 if (ioctl(fd, DKIOCCDREADDISCINFO, &tochdr) < 0) | |
121 { | |
122 mp_msg(MSGT_OPEN,MSGL_ERR,"read CDROM toc header: %s\n",strerror(errno)); | |
123 return NULL; | |
124 } | |
125 | |
126 //print all track info | |
18237
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
16547
diff
changeset
|
127 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VCD_START_TRACK=%d\n", hdr.firstTrackNumberInLastSessionLSB); |
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
16547
diff
changeset
|
128 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VCD_END_TRACK=%d\n", hdr.lastTrackNumberInLastSessionLSB); |
16547
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
129 for (i=hdr.firstTrackNumberInLastSessionLSB ; i<=hdr.lastTrackNumberInLastSessionLSB + 1; i++) |
13682 | 130 { |
131 memset( &tocentry, 0, sizeof(tocentry)); | |
132 tocentry.addressType = kCDTrackInfoAddressTypeTrackNumber; | |
16547
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
133 tocentry.address = i<=hdr.lastTrackNumberInLastSessionLSB ? i : CDROM_LEADOUT; |
13682 | 134 tocentry.bufferLength = sizeof(entry); |
135 tocentry.buffer = &entry; | |
136 | |
137 if (ioctl(fd,DKIOCCDREADTRACKINFO,&tocentry)==-1) | |
138 { | |
139 mp_msg(MSGT_OPEN,MSGL_ERR,"read CDROM toc entry: %s\n",strerror(errno)); | |
140 return NULL; | |
141 } | |
142 | |
143 trackMSF = CDConvertLBAToMSF(entry.trackStartAddress); | |
144 | |
145 //mp_msg(MSGT_OPEN,MSGL_INFO,"track %02d: adr=%d ctrl=%d format=%d %02d:%02d:%02d\n", | |
16547
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
146 if (i<=hdr.lastTrackNumberInLastSessionLSB) |
13682 | 147 mp_msg(MSGT_OPEN,MSGL_INFO,"track %02d: format=%d %02d:%02d:%02d\n", |
148 (int)tocentry.address, | |
149 //(int)tocentry.entry.addr_type, | |
150 //(int)tocentry.entry.control, | |
151 (int)tocentry.addressType, | |
152 (int)trackMSF.minute, | |
153 (int)trackMSF.second, | |
154 (int)trackMSF.frame | |
155 ); | |
16547
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
156 |
18237
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
16547
diff
changeset
|
157 if (mp_msg_test(MSGT_IDENTIFY, MSGL_INFO)) |
16547
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
158 { |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
159 if (i > hdr.firstTrackNumberInLastSessionLSB) |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
160 { |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
161 min = trackMSF.minute - min; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
162 sec = trackMSF.second - sec; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
163 frame = trackMSF.frame - frame; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
164 if ( frame < 0 ) |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
165 { |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
166 frame += 75; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
167 sec --; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
168 } |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
169 if ( sec < 0 ) |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
170 { |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
171 sec += 60; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
172 min --; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
173 } |
18237
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
16547
diff
changeset
|
174 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VCD_TRACK_%d_MSF=%02d:%02d:%02d\n", i - 1, min, sec, frame); |
16547
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
175 } |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
176 min = trackMSF.minute; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
177 sec = trackMSF.second; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
178 frame = trackMSF.frame; |
aa15d627a00b
Prints the numbers of start and end tracks and MSF length for each
gpoirier
parents:
13842
diff
changeset
|
179 } |
13682 | 180 } |
181 | |
182 vcd = malloc(sizeof(mp_vcd_priv_t)); | |
183 vcd->fd = fd; | |
184 vcd->msf = trackMSF; | |
185 return vcd; | |
186 | |
187 return NULL; | |
188 } | |
189 | |
190 static int vcd_read(mp_vcd_priv_t* vcd,char *mem) | |
191 { | |
192 if (pread(vcd->fd,&vcd->buf,VCD_SECTOR_SIZE,vcd_get_msf(vcd)*VCD_SECTOR_SIZE) != VCD_SECTOR_SIZE) | |
193 return 0; // EOF? | |
194 | |
195 vcd->msf.frame++; | |
196 if (vcd->msf.frame==75) | |
197 { | |
198 vcd->msf.frame=0; | |
199 vcd->msf.second++; | |
200 | |
201 if (vcd->msf.second==60) | |
202 { | |
203 vcd->msf.second=0; | |
204 vcd->msf.minute++; | |
205 } | |
206 } | |
207 | |
208 memcpy(mem,vcd->buf.data,VCD_SECTOR_DATA); | |
209 return VCD_SECTOR_DATA; | |
210 return 0; | |
211 } | |
212 |