Ignore:
Timestamp:
Oct 26, 2010, 10:48:08 AM (14 years ago)
Author:
grum
Message:

Fix many bugs
bug:1894, bug:1898, bug:1911, bug:1863, bug:1955, bug:1956, bug:1925

File:
1 edited

Legend:

Unmodified
Added
Removed
  • extensions/AMetaData/JpegMetaData/Readers/JpegReader.class.php

    r4972 r7399  
    8585     */
    8686    const JPEG_EOI = 0xFFD9;
     87    /**
     88     * start of scan tag
     89     */
     90    const JPEG_SOS = 0xFFDA;
    8791
    8892
     
    174178      fseek($this->fileHandler, -2, SEEK_END);
    175179      $header=fread($this->fileHandler, 2);
    176       if(ConvertData::toUShort($header, BYTE_ORDER_BIG_ENDIAN) == self::JPEG_EOI)
    177       {
    178         /*
    179          * the file ends with the good marker
    180          */
    181         fseek($this->fileHandler, 0);
    182         $header=fread($this->fileHandler, 2);
    183         if(ConvertData::toUShort($header, BYTE_ORDER_BIG_ENDIAN) == self::JPEG_SOI)
    184         {
    185           return(true);
     180      $haveEOI=(ConvertData::toUShort($header, BYTE_ORDER_BIG_ENDIAN) == self::JPEG_EOI);
     181
     182      // look if 2 first bytes of file are SOI
     183      fseek($this->fileHandler, 0);
     184      $header=fread($this->fileHandler, 2);
     185      if(ConvertData::toUShort($header, BYTE_ORDER_BIG_ENDIAN) == self::JPEG_SOI)
     186      {
     187        //if file have EOI, it seems to be a valid JPEG file
     188        if($haveEOI) return(true);
     189
     190        // otherwise, try to find SOS
     191        while(!feof($this->fileHandler))
     192        {
     193          $header=ConvertData::toUShort(fread($this->fileHandler, 2), BYTE_ORDER_BIG_ENDIAN);
     194
     195          if($header==self::JPEG_EOI or $header==self::JPEG_SOS )
     196          {
     197            //seems to be a valid JPEG file
     198            return(true);
     199          }
     200          elseif($header>>8==0xFF)
     201          {
     202            //seems to be a valid marker, jump to next marker...
     203            $sizeBlock=ConvertData::toUShort(fread($this->fileHandler, 2), BYTE_ORDER_BIG_ENDIAN);
     204            fseek($this->fileHandler, $sizeBlock-2, SEEK_CUR);
     205          }
     206          else
     207          {
     208            // not a marker, not e JPEG file
     209            return(false);
     210          }
    186211        }
    187212      }
Note: See TracChangeset for help on using the changeset viewer.