34 const MINIMUM_CHUNK_HEADER_LENGTH = 18;
38 const _MW_WEBP_VERSION = 1;
48 if ( !$parsedWebPData ) {
52 $parsedWebPData[
'metadata'][
'_MW_WEBP_VERSION'] = self::_MW_WEBP_VERSION;
61 if ( $metadata === self::BROKEN_FILE ) {
66 Wikimedia\suppressWarnings();
68 Wikimedia\restoreWarnings();
70 if ( !$data || !is_array( $data ) ) {
71 wfDebug( __METHOD__ .
" invalid WebP metadata\n" );
76 if ( !isset( $data[
'metadata'][
'_MW_WEBP_VERSION'] )
77 || $data[
'metadata'][
'_MW_WEBP_VERSION'] != self::_MW_WEBP_VERSION
79 wfDebug( __METHOD__ .
" old but compatible WebP metadata\n" );
95 wfDebugLog(
'WebP', __METHOD__ .
": Extracting metadata from $filename\n" );
98 if ( $info ===
false ) {
99 wfDebugLog(
'WebP', __METHOD__ .
": Not a valid RIFF file\n" );
103 if ( $info[
'fourCC'] !=
'WEBP' ) {
104 wfDebugLog(
'WebP', __METHOD__ .
': FourCC was not WEBP: ' .
105 bin2hex( $info[
'fourCC'] ) .
" \n" );
111 wfDebugLog(
'WebP', __METHOD__ .
": No VP8 chunks found\n" );
128 foreach ( $chunks as $chunk ) {
129 if ( !in_array( $chunk[
'fourCC'], [
'VP8 ',
'VP8L',
'VP8X' ] ) ) {
134 $chunkHeader = file_get_contents( $filename,
false,
null,
135 $chunk[
'start'], self::MINIMUM_CHUNK_HEADER_LENGTH );
136 wfDebugLog(
'WebP', __METHOD__ .
": {$chunk['fourCC']}\n" );
138 switch ( $chunk[
'fourCC'] ) {
140 return array_merge( $vp8Info,
141 self::decodeLossyChunkHeader( $chunkHeader ) );
143 return array_merge( $vp8Info,
144 self::decodeLosslessChunkHeader( $chunkHeader ) );
146 $vp8Info = array_merge( $vp8Info,
147 self::decodeExtendedChunkHeader( $chunkHeader ) );
165 $syncCode = substr(
$header, 11, 3 );
166 if ( $syncCode !=
"\x9D\x01\x2A" ) {
167 wfDebugLog(
'WebP', __METHOD__ .
': Invalid sync code: ' .
168 bin2hex( $syncCode ) .
"\n" );
172 $imageSize = unpack(
'v2', substr(
$header, 14, 4 ) );
175 'compression' =>
'lossy',
176 'width' => $imageSize[1] & 0x3FFF,
177 'height' => $imageSize[2] & 0x3FFF
192 wfDebugLog(
'WebP', __METHOD__ .
': Invalid signature: ' .
193 bin2hex(
$header{8} ) .
"\n" );
198 $imageSize = unpack(
'C4', substr(
$header, 9, 4 ) );
200 'compression' =>
'lossless',
201 'width' => ( $imageSize[1] | ( ( $imageSize[2] & 0x3F ) << 8 ) ) + 1,
202 'height' => ( ( ( $imageSize[2] & 0xC0 ) >> 6 ) |
203 ( $imageSize[3] << 2 ) | ( ( $imageSize[4] & 0x03 ) << 10 ) ) + 1
216 $flags = unpack(
'c', substr(
$header, 8, 1 ) );
219 $width = unpack(
'V', substr(
$header, 12, 3 ) .
"\x00" );
220 $height = unpack(
'V', substr(
$header, 15, 3 ) .
"\x00" );
223 'compression' =>
'unknown',
226 'width' => ( $width[1] & 0xFFFFFF ) + 1,
227 'height' => ( $height[1] & 0xFFFFFF ) + 1
232 if (
$file ===
null ) {
235 if ( $metadata ===
false &&
$file instanceof
File ) {
236 $metadata =
$file->getMetadata();
239 Wikimedia\suppressWarnings();
241 Wikimedia\restoreWarnings();
243 if ( $metadata ==
false ) {
246 return [ $metadata[
'width'], $metadata[
'height'] ];
262 if ( self::isAnimatedImage(
$file ) ) {
273 $ser = $image->getMetadata();
276 if ( isset( $metadata[
'animated'] ) && $metadata[
'animated'] ===
true ) {
297 return [
'png',
'image/png' ];
unserialize( $serialized)
wfDebug( $text, $dest='all', array $context=[])
Sends a line to the debug log if enabled or, optionally, to a comment in output.
wfDebugLog( $logGroup, $text, $dest='all', array $context=[])
Send a line to a supplementary debug log file, if configured, or main debug log if not.
Generic handler for bitmap images.
Implements some public methods and some protected utility functions which are required by multiple ch...
Handler for Google's WebP format https://developers.google.com/speed/webp/
isMetadataValid( $image, $metadata)
Check if the metadata string is valid for this handler.
canAnimateThumbnail( $file)
If the material is animated, we can animate the thumbnail.
static extractMetadataFromChunks( $chunks, $filename)
Extracts the image size and WebP type from a file based on the chunk list.
getMetadata( $image, $filename)
Get handler-specific metadata which will be saved in the img_metadata field.
getScalerType( $dstPath, $checkDstPath=true)
Must use "im" for XCF.
static decodeLossyChunkHeader( $header)
Decodes a lossy chunk header.
getImageSize( $file, $path, $metadata=false)
getThumbType( $ext, $mime, $params=null)
Render files as PNG.
static decodeLosslessChunkHeader( $header)
Decodes a lossless chunk header.
getMetadataType( $image)
Get a string describing the type of metadata, for display purposes.
static extractMetadata( $filename)
Extracts the image size and WebP type from a file.
static decodeExtendedChunkHeader( $header)
Decodes an extended chunk header.
if(PHP_SAPI !='cli-server') if(!isset( $_SERVER['SCRIPT_FILENAME'])) $file
Item class for a filearchive table row.
if(!is_readable( $file)) $ext