Mercurial > mplayer.hg
comparison stream/vcd_read_fbsd.h @ 23847:773e6c50d1b8
TOCADDR macro as first step to common *BSD vcd reading code
author | reimar |
---|---|
date | Thu, 26 Jul 2007 22:51:23 +0000 |
parents | 64d82a45a05d |
children | 2911a78219a8 |
comparison
equal
deleted
inserted
replaced
23846:21aab907150e | 23847:773e6c50d1b8 |
---|---|
1 #include <sys/cdio.h> | 1 #include <sys/cdio.h> |
2 #include <sys/cdrio.h> | 2 #include <sys/cdrio.h> |
3 | 3 |
4 //=================== VideoCD ========================== | 4 //=================== VideoCD ========================== |
5 #define CDROM_LEADOUT 0xAA | 5 #define CDROM_LEADOUT 0xAA |
6 #define TOCADDR(te) ((te).entry.addr) | |
6 | 7 |
7 typedef struct { | 8 typedef struct { |
8 uint8_t sync [12]; | 9 uint8_t sync [12]; |
9 uint8_t header [4]; | 10 uint8_t header [4]; |
10 uint8_t subheader [8]; | 11 uint8_t subheader [8]; |
17 struct ioc_read_toc_single_entry entry; | 18 struct ioc_read_toc_single_entry entry; |
18 cdsector_t buf; | 19 cdsector_t buf; |
19 } mp_vcd_priv_t; | 20 } mp_vcd_priv_t; |
20 | 21 |
21 static inline void vcd_set_msf(mp_vcd_priv_t* vcd, unsigned int sect){ | 22 static inline void vcd_set_msf(mp_vcd_priv_t* vcd, unsigned int sect){ |
22 vcd->entry.entry.addr.msf.frame=sect%75; | 23 TOCADDR(vcd->entry).msf.frame=sect%75; |
23 sect=sect/75; | 24 sect=sect/75; |
24 vcd->entry.entry.addr.msf.second=sect%60; | 25 TOCADDR(vcd->entry).msf.second=sect%60; |
25 sect=sect/60; | 26 sect=sect/60; |
26 vcd->entry.entry.addr.msf.minute=sect; | 27 TOCADDR(vcd->entry).msf.minute=sect; |
27 } | 28 } |
28 | 29 |
29 static inline unsigned int vcd_get_msf(mp_vcd_priv_t* vcd){ | 30 static inline unsigned int vcd_get_msf(mp_vcd_priv_t* vcd){ |
30 return vcd->entry.entry.addr.msf.frame + | 31 return TOCADDR(vcd->entry).msf.frame + |
31 (vcd->entry.entry.addr.msf.second+ | 32 (TOCADDR(vcd->entry).msf.second+ |
32 vcd->entry.entry.addr.msf.minute*60)*75; | 33 TOCADDR(vcd->entry).msf.minute*60)*75; |
33 } | 34 } |
34 | 35 |
35 int vcd_seek_to_track(mp_vcd_priv_t* vcd, int track){ | 36 int vcd_seek_to_track(mp_vcd_priv_t* vcd, int track){ |
36 vcd->entry.address_format = CD_MSF_FORMAT; | 37 vcd->entry.address_format = CD_MSF_FORMAT; |
37 vcd->entry.track = track; | 38 vcd->entry.track = track; |
82 mp_msg(MSGT_OPEN,MSGL_INFO,"track %02d: adr=%d ctrl=%d format=%d %02d:%02d:%02d\n", | 83 mp_msg(MSGT_OPEN,MSGL_INFO,"track %02d: adr=%d ctrl=%d format=%d %02d:%02d:%02d\n", |
83 (int)tocentry.track, | 84 (int)tocentry.track, |
84 (int)tocentry.entry.addr_type, | 85 (int)tocentry.entry.addr_type, |
85 (int)tocentry.entry.control, | 86 (int)tocentry.entry.control, |
86 (int)tocentry.address_format, | 87 (int)tocentry.address_format, |
87 (int)tocentry.entry.addr.msf.minute, | 88 (int)TOCADDR(tocentry).msf.minute, |
88 (int)tocentry.entry.addr.msf.second, | 89 (int)TOCADDR(tocentry).msf.second, |
89 (int)tocentry.entry.addr.msf.frame | 90 (int)TOCADDR(tocentry).msf.frame |
90 ); | 91 ); |
91 | 92 |
92 if (mp_msg_test(MSGT_IDENTIFY, MSGL_INFO)) | 93 if (mp_msg_test(MSGT_IDENTIFY, MSGL_INFO)) |
93 { | 94 { |
94 if (i > tochdr.starting_track) | 95 if (i > tochdr.starting_track) |
95 { | 96 { |
96 min = tocentry.entry.addr.msf.minute - min; | 97 min = TOCADDR(tocentry).msf.minute - min; |
97 sec = tocentry.entry.addr.msf.second - sec; | 98 sec = TOCADDR(tocentry).msf.second - sec; |
98 frame = tocentry.entry.addr.msf.frame - frame; | 99 frame = TOCADDR(tocentry).msf.frame - frame; |
99 if ( frame < 0 ) | 100 if ( frame < 0 ) |
100 { | 101 { |
101 frame += 75; | 102 frame += 75; |
102 sec --; | 103 sec --; |
103 } | 104 } |
106 sec += 60; | 107 sec += 60; |
107 min --; | 108 min --; |
108 } | 109 } |
109 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VCD_TRACK_%d_MSF=%02d:%02d:%02d\n", i - 1, min, sec, frame); | 110 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VCD_TRACK_%d_MSF=%02d:%02d:%02d\n", i - 1, min, sec, frame); |
110 } | 111 } |
111 min = tocentry.entry.addr.msf.minute; | 112 min = TOCADDR(tocentry).msf.minute; |
112 sec = tocentry.entry.addr.msf.second; | 113 sec = TOCADDR(tocentry).msf.second; |
113 frame = tocentry.entry.addr.msf.frame; | 114 frame = TOCADDR(tocentry).msf.frame; |
114 } | 115 } |
115 } | 116 } |
116 vcd = malloc(sizeof(mp_vcd_priv_t)); | 117 vcd = malloc(sizeof(mp_vcd_priv_t)); |
117 vcd->fd = fd; | 118 vcd->fd = fd; |
118 return vcd; | 119 return vcd; |
121 static int vcd_read(mp_vcd_priv_t* vcd,char *mem){ | 122 static int vcd_read(mp_vcd_priv_t* vcd,char *mem){ |
122 | 123 |
123 if (pread(vcd->fd,&vcd->buf,VCD_SECTOR_SIZE,vcd_get_msf(vcd)*VCD_SECTOR_SIZE) | 124 if (pread(vcd->fd,&vcd->buf,VCD_SECTOR_SIZE,vcd_get_msf(vcd)*VCD_SECTOR_SIZE) |
124 != VCD_SECTOR_SIZE) return 0; // EOF? | 125 != VCD_SECTOR_SIZE) return 0; // EOF? |
125 | 126 |
126 vcd->entry.entry.addr.msf.frame++; | 127 TOCADDR(vcd->entry).msf.frame++; |
127 if (vcd->entry.entry.addr.msf.frame==75){ | 128 if (TOCADDR(vcd->entry).msf.frame==75){ |
128 vcd->entry.entry.addr.msf.frame=0; | 129 TOCADDR(vcd->entry).msf.frame=0; |
129 vcd->entry.entry.addr.msf.second++; | 130 TOCADDR(vcd->entry).msf.second++; |
130 if (vcd->entry.entry.addr.msf.second==60){ | 131 if (TOCADDR(vcd->entry).msf.second==60){ |
131 vcd->entry.entry.addr.msf.second=0; | 132 TOCADDR(vcd->entry).msf.second=0; |
132 vcd->entry.entry.addr.msf.minute++; | 133 TOCADDR(vcd->entry).msf.minute++; |
133 } | 134 } |
134 } | 135 } |
135 memcpy(mem,vcd->buf.data,VCD_SECTOR_DATA); | 136 memcpy(mem,vcd->buf.data,VCD_SECTOR_DATA); |
136 return VCD_SECTOR_DATA; | 137 return VCD_SECTOR_DATA; |
137 } | 138 } |