Mercurial > mplayer.hg
annotate vcd_read.h @ 1025:b3dde72791ed
Kernel version checking improvements
author | nickols_k |
---|---|
date | Tue, 05 Jun 2001 08:12:00 +0000 |
parents | 72cacd3b8f30 |
children | b36fb1ae4b53 |
rev | line source |
---|---|
1 | 1 //=================== VideoCD ========================== |
2 static struct cdrom_tocentry vcd_entry; | |
3 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
1
diff
changeset
|
4 static inline void vcd_set_msf(unsigned int sect){ |
1 | 5 vcd_entry.cdte_addr.msf.frame=sect%75; |
6 sect=sect/75; | |
7 vcd_entry.cdte_addr.msf.second=sect%60; | |
8 sect=sect/60; | |
9 vcd_entry.cdte_addr.msf.minute=sect; | |
10 } | |
11 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
1
diff
changeset
|
12 static inline unsigned int vcd_get_msf(){ |
1 | 13 return vcd_entry.cdte_addr.msf.frame + |
14 (vcd_entry.cdte_addr.msf.second+ | |
15 vcd_entry.cdte_addr.msf.minute*60)*75; | |
16 } | |
17 | |
18 int vcd_seek_to_track(int fd,int track){ | |
19 vcd_entry.cdte_format = CDROM_MSF; | |
20 vcd_entry.cdte_track = track; | |
21 if (ioctl(fd, CDROMREADTOCENTRY, &vcd_entry)) { | |
22 perror("ioctl dif1"); | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
1
diff
changeset
|
23 return -1; |
1 | 24 } |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
1
diff
changeset
|
25 return VCD_SECTOR_DATA*vcd_get_msf(); |
1 | 26 } |
27 | |
598 | 28 int vcd_get_track_end(int fd,int track){ |
29 struct cdrom_tochdr tochdr; | |
30 if (ioctl(fd,CDROMREADTOCHDR,&tochdr)==-1) | |
31 { perror("read CDROM toc header: "); return -1; } | |
32 vcd_entry.cdte_format = CDROM_MSF; | |
33 vcd_entry.cdte_track = track<tochdr.cdth_trk1?(track+1):CDROM_LEADOUT; | |
34 if (ioctl(fd, CDROMREADTOCENTRY, &vcd_entry)) { | |
35 perror("ioctl dif2"); | |
36 return -1; | |
37 } | |
38 return VCD_SECTOR_DATA*vcd_get_msf(); | |
39 } | |
40 | |
1 | 41 void vcd_read_toc(int fd){ |
42 struct cdrom_tochdr tochdr; | |
43 int i; | |
44 if (ioctl(fd,CDROMREADTOCHDR,&tochdr)==-1) | |
45 { perror("read CDROM toc header: "); return; } | |
46 for (i=tochdr.cdth_trk0 ; i<=tochdr.cdth_trk1 ; i++){ | |
47 struct cdrom_tocentry tocentry; | |
48 | |
49 tocentry.cdte_track = i; | |
50 tocentry.cdte_format = CDROM_MSF; | |
51 | |
52 if (ioctl(fd,CDROMREADTOCENTRY,&tocentry)==-1) | |
53 { perror("read CDROM toc entry: "); return; } | |
54 | |
55 printf("track %02d: adr=%d ctrl=%d format=%d %02d:%02d:%02d mode: %d\n", | |
56 (int)tocentry.cdte_track, | |
57 (int)tocentry.cdte_adr, | |
58 (int)tocentry.cdte_ctrl, | |
59 (int)tocentry.cdte_format, | |
60 (int)tocentry.cdte_addr.msf.minute, | |
61 (int)tocentry.cdte_addr.msf.second, | |
62 (int)tocentry.cdte_addr.msf.frame, | |
63 (int)tocentry.cdte_datamode | |
64 ); | |
65 } | |
66 } | |
67 | |
68 static char vcd_buf[VCD_SECTOR_SIZE]; | |
69 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
1
diff
changeset
|
70 static int vcd_read(int fd,char *mem){ |
1020
72cacd3b8f30
Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents:
598
diff
changeset
|
71 #ifdef __sun |
72cacd3b8f30
Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents:
598
diff
changeset
|
72 struct cdrom_cdxa xa; |
72cacd3b8f30
Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents:
598
diff
changeset
|
73 xa.cdxa_addr = vcd_get_msf(); |
72cacd3b8f30
Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents:
598
diff
changeset
|
74 xa.cdxa_length = CDROM_BLK_2352; |
72cacd3b8f30
Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents:
598
diff
changeset
|
75 xa.cdxa_data = vcd_buf; |
72cacd3b8f30
Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents:
598
diff
changeset
|
76 xa.cdxa_format = CDROM_XA_SECTOR_DATA; |
72cacd3b8f30
Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents:
598
diff
changeset
|
77 if(ioctl(fd,CDROMCDXA,&xa)==-1) return 0; // EOF? |
72cacd3b8f30
Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents:
598
diff
changeset
|
78 #else |
1 | 79 memcpy(vcd_buf,&vcd_entry.cdte_addr.msf,sizeof(struct cdrom_msf)); |
80 if(ioctl(fd,CDROMREADRAW,vcd_buf)==-1) return 0; // EOF? | |
1020
72cacd3b8f30
Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents:
598
diff
changeset
|
81 #endif |
1 | 82 |
83 vcd_entry.cdte_addr.msf.frame++; | |
84 if (vcd_entry.cdte_addr.msf.frame==75){ | |
85 vcd_entry.cdte_addr.msf.frame=0; | |
86 vcd_entry.cdte_addr.msf.second++; | |
87 if (vcd_entry.cdte_addr.msf.second==60){ | |
88 vcd_entry.cdte_addr.msf.second=0; | |
89 vcd_entry.cdte_addr.msf.minute++; | |
90 } | |
91 } | |
92 | |
93 memcpy(mem,&vcd_buf[VCD_SECTOR_OFFS],VCD_SECTOR_DATA); | |
94 return VCD_SECTOR_DATA; | |
95 } | |
96 | |
97 //================== VCD CACHE ======================= | |
98 #ifdef VCD_CACHE | |
99 | |
100 static int vcd_cache_size=0; | |
101 static char *vcd_cache_data=NULL; | |
102 static int *vcd_cache_sectors=NULL; | |
103 static int vcd_cache_index=0; // index to first free (or oldest) cache sector | |
104 static int vcd_cache_current=-1; | |
105 | |
106 void vcd_cache_init(int s){ | |
107 vcd_cache_size=s; | |
108 vcd_cache_sectors=malloc(s*sizeof(int)); | |
109 vcd_cache_data=malloc(s*VCD_SECTOR_SIZE); | |
110 memset(vcd_cache_sectors,255,s*sizeof(int)); | |
111 } | |
112 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
1
diff
changeset
|
113 static inline void vcd_cache_seek(int sect){ |
1 | 114 vcd_cache_current=sect; |
115 } | |
116 | |
117 int vcd_cache_read(int fd,char* mem){ | |
118 int i; | |
119 char* vcd_buf; | |
120 for(i=0;i<vcd_cache_size;i++) | |
121 if(vcd_cache_sectors[i]==vcd_cache_current){ | |
122 // found in the cache! :) | |
123 vcd_buf=&vcd_cache_data[i*VCD_SECTOR_SIZE]; | |
124 ++vcd_cache_current; | |
125 memcpy(mem,&vcd_buf[VCD_SECTOR_OFFS],VCD_SECTOR_DATA); | |
126 return VCD_SECTOR_DATA; | |
127 } | |
128 // NEW cache entry: | |
129 vcd_buf=&vcd_cache_data[vcd_cache_index*VCD_SECTOR_SIZE]; | |
130 vcd_cache_sectors[vcd_cache_index]=vcd_cache_current; | |
131 ++vcd_cache_index;if(vcd_cache_index>=vcd_cache_size)vcd_cache_index=0; | |
132 // read data! | |
133 vcd_set_msf(vcd_cache_current); | |
134 memcpy(vcd_buf,&vcd_entry.cdte_addr.msf,sizeof(struct cdrom_msf)); | |
135 if(ioctl(fd,CDROMREADRAW,vcd_buf)==-1) return 0; // EOF? | |
136 ++vcd_cache_current; | |
137 memcpy(mem,&vcd_buf[VCD_SECTOR_OFFS],VCD_SECTOR_DATA); | |
138 return VCD_SECTOR_DATA; | |
139 } | |
140 | |
141 #endif |