[Mplayer-advusers] BUG: Can't play (S)VCDs on some SCSI-drives (easy fix)

Marc-Jano Knopp mjk at rbg.informatik.tu-darmstadt.de
Sat Jun 22 23:18:09 CEST 2002


Hello!

For someone familiar with the code, this bug should be quite
easy to fix, I think.


SYMPTOMS

  MPlayer won't play VCDs and SVCDs on some SCSI drives (properly).

  When MPlayer tries to read a (S)VCD, /var/log/messages is
  flooded with the following message:
  
    Jun 22 22:22:23 pc8 kernel: sr2: CDROM (ioctl) reports ILLEGAL REQUEST.
    Jun 22 22:22:23 pc8 kernel: UNKNOWN(0xbe) 00 00 00 00 00 00 00 01 f8 00 00 
    Jun 22 22:22:23 pc8 kernel: Current sr00:00: sense key Illegal Request
    Jun 22 22:22:23 pc8 kernel: Additional sense indicates Invalid command operation code
    Jun 22 22:22:24 pc8 kernel: sr2: CDROM (ioctl) reports ILLEGAL REQUEST.
    Jun 22 22:22:24 pc8 kernel: UNKNOWN(0xbe) 00 00 00 00 01 00 00 01 f8 00 00
    Jun 22 22:22:24 pc8 kernel: Current sr00:00: sense key Illegal Request
    Jun 22 22:22:24 pc8 kernel: Additional sense indicates Invalid command operation code
    Jun 22 22:22:24 pc8 kernel: sr2: CDROM (ioctl) reports ILLEGAL REQUEST.
    Jun 22 22:22:24 pc8 kernel: UNKNOWN(0xbe) 00 00 00 00 02 00 00 01 f8 00 00 
    Jun 22 22:22:24 pc8 kernel: Current sr00:00: sense key Illegal Request
    Jun 22 22:22:24 pc8 kernel: Additional sense indicates Invalid command operation code
    [...]

  With VCDs, there are sometimes frame drops.
  With SVCDs, there are so many frame drops that playback halts and
  MPlayer claims the system was "too slow". It isn't, though: 1 GHz
  Athlon, 640 MB, U160-SCSI, Matrox G450 with mga_vid.
  
  During the first few seconds before playback, one can see that the
  cache is filled only very slowly, roughly less than double speed
  (ca. 250 kB/sec), I would say, which is just not enough for SVCD,
  which needs double speed, I think.


REASON

  MPlayer uses the SCSI command "READ CD" (0xbe) to read (S)VCDs,
  which consist of MODE 2 / FORM 2 tracks. Although many newer
  SCSI CD-ROM drives implement this command, some don't - for
  example Plextor 12x and 32x caddy drives and TEAC 55S.
  
  Note that these drives are still fully SCSI compliant, since
  the "READ CD" command is optional in the SCSI-II specification.


SOLUTION

  MPlayer should test if the drive supports "READ CD", and if
  it doesn't, it should fall back to a normal ten-byte "READ",
  which is what "vcdxrip" (from the "vcdimager" package) uses:
  
    # vcdxrip --cdrom-device=/dev/sr2
    ioctl(): Operation not supported
       INFO: READ_CD failed; switching to READ_10 mode...
    [...]

  In MPlayer-0.90pre5/libmpdemux/vcd_read.h, there is some code that
  directly prepares SCSI commands to be sent ("#ifdef  sun"), maybe
  this piece of code can be used here for the "READ CD"-fallback, by
  using
  
    cdb.scc_cmd = 0x28;  // code for ten-byte-read
  
  instead of
  
    cdb.scc_cmd = 0xBE;
  
  and setting the block size of the CD-ROM drive appropriately to 2336.
  
  A look into the function "__read_mode2" in
  vcdimager-0.7.12/libvcd/vcd_image_linuxcd.c might help, because
  this function is quite short (50 lines) and seems to contain
  the suggested workaround.


SYSTEM

  Hardware:
  
    - 1 GHz Thunderbird on ABIT KT7A-RAID
    - 640 MB RAM (Infineon chips)

    - Adaptec AHA-3940 (2 x 2940 on one board with PCI bridge)
    
    - Plextor PX-32CSi - BUG occurs
    - Plextor PX-12CSi - BUG occurs
    - TEAC CD-R55S     - BUG occurs
    - TEAC CD-R58S     - works fine
    - Pioneer DVD-303  - works fine
    - Toshiba XM-6402B - works (ATAPI)

  Software:
  
    - GNU/Linux 2.4.18 (remnant of S.u.S.E. 7.3 :-)
    - aic7xxx_old (driver for Adaptec)
    - glibc 2.2.4


REFERENCES

  ftp://ftp.vcdimager.org/pub/vcdimager/vcdimager-0.7_UNSTABLE/vcdimager-0.7.11.tar.gz


COMMENTS

  I have 300+ CD-ROM caddies with movies, and the only caddy CD-ROM drives
  I have (and want) are Plextors - where this bug occurs...

  
Best regards and thanks for this GREAT player!

  Marc-Jano




More information about the MPlayer-advusers mailing list