diff options
author | ulion <ulion@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2007-12-15 12:11:44 +0000 |
---|---|---|
committer | ulion <ulion@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2007-12-15 12:11:44 +0000 |
commit | 25a4519cd9a8ce945e61e9bedf91188c9655f74e (patch) | |
tree | ca577b883247af51883d2be0cba2afebd04254cd /stream | |
parent | 10ea9291c1df9a1e9fb8fb983fb0f374dac35827 (diff) | |
download | mpv-25a4519cd9a8ce945e61e9bedf91188c9655f74e.tar.bz2 mpv-25a4519cd9a8ce945e61e9bedf91188c9655f74e.tar.xz |
Get end position of last track by adding its starting address with track size.
On some darwin system, we can not get the lead out track info.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@25403 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'stream')
-rw-r--r-- | stream/vcd_read_darwin.h | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/stream/vcd_read_darwin.h b/stream/vcd_read_darwin.h index 74ec04de2a..ffad3f4433 100644 --- a/stream/vcd_read_darwin.h +++ b/stream/vcd_read_darwin.h @@ -72,11 +72,17 @@ int vcd_get_track_end(mp_vcd_priv_t* vcd, int track) mp_msg(MSGT_OPEN,MSGL_ERR,"read CDROM toc header: %s\n",strerror(errno)); return -1; } + if (track > hdr.lastTrackNumberInLastSessionLSB) { + mp_msg(MSGT_OPEN, MSGL_ERR, + "track number %d greater than last track number %d\n", + track, hdr.lastTrackNumberInLastSessionLSB); + return -1; + } //read track info memset( &vcd->entry, 0, sizeof(vcd->entry)); vcd->entry.addressType = kCDTrackInfoAddressTypeTrackNumber; - vcd->entry.address = track<hdr.lastTrackNumberInLastSessionLSB?track+1:CDROM_LEADOUT; + vcd->entry.address = track<hdr.lastTrackNumberInLastSessionLSB?track+1:hdr.lastTrackNumberInLastSessionLSB; vcd->entry.bufferLength = sizeof(entry); vcd->entry.buffer = &entry; @@ -85,6 +91,10 @@ int vcd_get_track_end(mp_vcd_priv_t* vcd, int track) mp_msg(MSGT_STREAM,MSGL_ERR,"ioctl dif2: %s\n",strerror(errno)); return -1; } + if (track == hdr.lastTrackNumberInLastSessionLSB) + vcd->msf = CDConvertLBAToMSF(be2me_32(entry.trackStartAddress) + + be2me_32(entry.trackSize)); + else vcd->msf = CDConvertLBAToMSF(be2me_32(entry.trackStartAddress)); return VCD_SECTOR_DATA*vcd_get_msf(vcd); } @@ -117,9 +127,10 @@ mp_vcd_priv_t* vcd_read_toc(int fd) mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VCD_END_TRACK=%d\n", hdr.lastTrackNumberInLastSessionLSB); for (i=hdr.firstTrackNumberInLastSessionLSB ; i<=hdr.lastTrackNumberInLastSessionLSB + 1; i++) { + if (i <= hdr.lastTrackNumberInLastSessionLSB) { memset( &tocentry, 0, sizeof(tocentry)); tocentry.addressType = kCDTrackInfoAddressTypeTrackNumber; - tocentry.address = i<=hdr.lastTrackNumberInLastSessionLSB ? i : CDROM_LEADOUT; + tocentry.address = i; tocentry.bufferLength = sizeof(entry); tocentry.buffer = &entry; @@ -130,6 +141,10 @@ mp_vcd_priv_t* vcd_read_toc(int fd) } trackMSF = CDConvertLBAToMSF(be2me_32(entry.trackStartAddress)); + } + else + trackMSF = CDConvertLBAToMSF(be2me_32(entry.trackStartAddress) + + be2me_32(entry.trackSize)); //mp_msg(MSGT_OPEN,MSGL_INFO,"track %02d: adr=%d ctrl=%d format=%d %02d:%02d:%02d\n", if (i<=hdr.lastTrackNumberInLastSessionLSB) |