Go to the documentation of this file.
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' ];
if(PHP_SAPI !='cli-server') if(!isset( $_SERVER['SCRIPT_FILENAME'])) $file
Item class for a filearchive table row.
getMetadataType( $image)
Get a string describing the type of metadata, for display purposes.
wfDebugLog( $logGroup, $text, $dest='all', array $context=[])
Send a line to a supplementary debug log file, if configured, or main debug log if not.
static decodeExtendedChunkHeader( $header)
Decodes an extended chunk header.
Implements some public methods and some protected utility functions which are required by multiple ch...
Generic handler for bitmap images.
getImageSize( $file, $path, $metadata=false)
wfDebug( $text, $dest='all', array $context=[])
Sends a line to the debug log if enabled or, optionally, to a comment in output.
getScalerType( $dstPath, $checkDstPath=true)
Must use "im" for XCF.
static decodeLossyChunkHeader( $header)
Decodes a lossy chunk header.
unserialize( $serialized)
getThumbType( $ext, $mime, $params=null)
Render files as PNG.
canAnimateThumbnail( $file)
If the material is animated, we can animate the thumbnail.
getMetadata( $image, $filename)
Get handler-specific metadata which will be saved in the img_metadata field.
if(!is_readable( $file)) $ext
static decodeLosslessChunkHeader( $header)
Decodes a lossless chunk header.
Handler for Google's WebP format https://developers.google.com/speed/webp/
static extractMetadataFromChunks( $chunks, $filename)
Extracts the image size and WebP type from a file based on the chunk list.
isMetadataValid( $image, $metadata)
Check if the metadata string is valid for this handler.
static extractMetadata( $filename)
Extracts the image size and WebP type from a file.