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 }