Submit
Path:
~
/
home
/
getwphos
/
public_html
/
bubrupamjcb.com
/
wp-includes
/
File Content:
class-avif-info.php
<?php /** * Copyright (c) 2021, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. * * Note: this class is from libavifinfo - https://aomedia.googlesource.com/libavifinfo/+/refs/heads/main/avifinfo.php at f509487. * It is used as a fallback to parse AVIF files when the server doesn't support AVIF, * primarily to identify the width and height of the image. * * Note PHP 8.2 added native support for AVIF, so this class can be removed when WordPress requires PHP 8.2. */ namespace Avifinfo; const FOUND = 0; // Input correctly parsed and information retrieved. const NOT_FOUND = 1; // Input correctly parsed but information is missing or elsewhere. const TRUNCATED = 2; // Input correctly parsed until missing bytes to continue. const ABORTED = 3; // Input correctly parsed until stopped to avoid timeout or crash. const INVALID = 4; // Input incorrectly parsed. const MAX_SIZE = 4294967295; // Unlikely to be insufficient to parse AVIF headers. const MAX_NUM_BOXES = 4096; // Be reasonable. Avoid timeouts and out-of-memory. const MAX_VALUE = 255; const MAX_TILES = 16; const MAX_PROPS = 32; const MAX_FEATURES = 8; const UNDEFINED = 0; // Value was not yet parsed. /** * Reads an unsigned integer with most significant bits first. * * @param binary string $input Must be at least $num_bytes-long. * @param int $num_bytes Number of parsed bytes. * @return int Value. */ function read_big_endian( $input, $num_bytes ) { if ( $num_bytes == 1 ) { return unpack( 'C', $input ) [1]; } else if ( $num_bytes == 2 ) { return unpack( 'n', $input ) [1]; } else if ( $num_bytes == 3 ) { $bytes = unpack( 'C3', $input ); return ( $bytes[1] << 16 ) | ( $bytes[2] << 8 ) | $bytes[3]; } else { // $num_bytes is 4 // This might fail to read unsigned values >= 2^31 on 32-bit systems. // See https://www.php.net/manual/en/function.unpack.php#106041 return unpack( 'N', $input ) [1]; } } /** * Reads bytes and advances the stream position by the same count. * * @param stream $handle Bytes will be read from this resource. * @param int $num_bytes Number of bytes read. Must be greater than 0. * @return binary string|false The raw bytes or false on failure. */ function read( $handle, $num_bytes ) { $data = fread( $handle, $num_bytes ); return ( $data !== false && strlen( $data ) >= $num_bytes ) ? $data : false; } /** * Advances the stream position by the given offset. * * @param stream $handle Bytes will be skipped from this resource. * @param int $num_bytes Number of skipped bytes. Can be 0. * @return bool True on success or false on failure. */ // Skips 'num_bytes' from the 'stream'. 'num_bytes' can be zero. function skip( $handle, $num_bytes ) { return ( fseek( $handle, $num_bytes, SEEK_CUR ) == 0 ); } //------------------------------------------------------------------------------ // Features are parsed into temporary property associations. class Tile { // Tile item id <-> parent item id associations. public $tile_item_id; public $parent_item_id; } class Prop { // Property index <-> item id associations. public $property_index; public $item_id; } class Dim_Prop { // Property <-> features associations. public $property_index; public $width; public $height; } class Chan_Prop { // Property <-> features associations. public $property_index; public $bit_depth; public $num_channels; } class Features { public $has_primary_item = false; // True if "pitm" was parsed. public $has_alpha = false; // True if an alpha "auxC" was parsed. public $primary_item_id; public $primary_item_features = array( // Deduced from the data below. 'width' => UNDEFINED, // In number of pixels. 'height' => UNDEFINED, // Ignores mirror and rotation. 'bit_depth' => UNDEFINED, // Likely 8, 10 or 12 bits per channel per pixel. 'num_channels' => UNDEFINED // Likely 1, 2, 3 or 4 channels: // (1 monochrome or 3 colors) + (0 or 1 alpha) ); public $tiles = array(); // Tile[] public $props = array(); // Prop[] public $dim_props = array(); // Dim_Prop[] public $chan_props = array(); // Chan_Prop[] /** * Binds the width, height, bit depth and number of channels from stored internal features. * * @param int $target_item_id Id of the item whose features will be bound. * @param int $tile_depth Maximum recursion to search within tile-parent relations. * @return Status FOUND on success or NOT_FOUND on failure. */ private function get_item_features( $target_item_id, $tile_depth ) { foreach ( $this->props as $prop ) { if ( $prop->item_id != $target_item_id ) { continue; } // Retrieve the width and height of the primary item if not already done. if ( $target_item_id == $this->primary_item_id && ( $this->primary_item_features['width'] == UNDEFINED || $this->primary_item_features['height'] == UNDEFINED ) ) { foreach ( $this->dim_props as $dim_prop ) { if ( $dim_prop->property_index != $prop->property_index ) { continue; } $this->primary_item_features['width'] = $dim_prop->width; $this->primary_item_features['height'] = $dim_prop->height; if ( $this->primary_item_features['bit_depth'] != UNDEFINED && $this->primary_item_features['num_channels'] != UNDEFINED ) { return FOUND; } break; } } // Retrieve the bit depth and number of channels of the target item if not // already done. if ( $this->primary_item_features['bit_depth'] == UNDEFINED || $this->primary_item_features['num_channels'] == UNDEFINED ) { foreach ( $this->chan_props as $chan_prop ) { if ( $chan_prop->property_index != $prop->property_index ) { continue; } $this->primary_item_features['bit_depth'] = $chan_prop->bit_depth; $this->primary_item_features['num_channels'] = $chan_prop->num_channels; if ( $this->primary_item_features['width'] != UNDEFINED && $this->primary_item_features['height'] != UNDEFINED ) { return FOUND; } break; } } } // Check for the bit_depth and num_channels in a tile if not yet found. if ( $tile_depth < 3 ) { foreach ( $this->tiles as $tile ) { if ( $tile->parent_item_id != $target_item_id ) { continue; } $status = $this->get_item_features( $tile->tile_item_id, $tile_depth + 1 ); if ( $status != NOT_FOUND ) { return $status; } } } return NOT_FOUND; } /** * Finds the width, height, bit depth and number of channels of the primary item. * * @return Status FOUND on success or NOT_FOUND on failure. */ public function get_primary_item_features() { // Nothing to do without the primary item ID. if ( !$this->has_primary_item ) { return NOT_FOUND; } // Early exit. if ( empty( $this->dim_props ) || empty( $this->chan_props ) ) { return NOT_FOUND; } $status = $this->get_item_features( $this->primary_item_id, /*tile_depth=*/ 0 ); if ( $status != FOUND ) { return $status; } // "auxC" is parsed before the "ipma" properties so it is known now, if any. if ( $this->has_alpha ) { ++$this->primary_item_features['num_channels']; } return FOUND; } } //------------------------------------------------------------------------------ class Box { public $size; // In bytes. public $type; // Four characters. public $version; // 0 or actual version if this is a full box. public $flags; // 0 or actual value if this is a full box. public $content_size; // 'size' minus the header size. /** * Reads the box header. * * @param stream $handle The resource the header will be parsed from. * @param int $num_parsed_boxes The total number of parsed boxes. Prevents timeouts. * @param int $num_remaining_bytes The number of bytes that should be available from the resource. * @return Status FOUND on success or an error on failure. */ public function parse( $handle, &$num_parsed_boxes, $num_remaining_bytes = MAX_SIZE ) { // See ISO/IEC 14496-12:2012(E) 4.2 $header_size = 8; // box 32b size + 32b type (at least) if ( $header_size > $num_remaining_bytes ) { return INVALID; } if ( !( $data = read( $handle, 8 ) ) ) { return TRUNCATED; } $this->size = read_big_endian( $data, 4 ); $this->type = substr( $data, 4, 4 ); // 'box->size==1' means 64-bit size should be read after the box type. // 'box->size==0' means this box extends to all remaining bytes. if ( $this->size == 1 ) { $header_size += 8; if ( $header_size > $num_remaining_bytes ) { return INVALID; } if ( !( $data = read( $handle, 8 ) ) ) { return TRUNCATED; } // Stop the parsing if any box has a size greater than 4GB. if ( read_big_endian( $data, 4 ) != 0 ) { return ABORTED; } // Read the 32 least-significant bits. $this->size = read_big_endian( substr( $data, 4, 4 ), 4 ); } else if ( $this->size == 0 ) { $this->size = $num_remaining_bytes; } if ( $this->size < $header_size ) { return INVALID; } if ( $this->size > $num_remaining_bytes ) { return INVALID; } $has_fullbox_header = $this->type == 'meta' || $this->type == 'pitm' || $this->type == 'ipma' || $this->type == 'ispe' || $this->type == 'pixi' || $this->type == 'iref' || $this->type == 'auxC'; if ( $has_fullbox_header ) { $header_size += 4; } if ( $this->size < $header_size ) { return INVALID; } $this->content_size = $this->size - $header_size; // Avoid timeouts. The maximum number of parsed boxes is arbitrary. ++$num_parsed_boxes; if ( $num_parsed_boxes >= MAX_NUM_BOXES ) { return ABORTED; } $this->version = 0; $this->flags = 0; if ( $has_fullbox_header ) { if ( !( $data = read( $handle, 4 ) ) ) { return TRUNCATED; } $this->version = read_big_endian( $data, 1 ); $this->flags = read_big_endian( substr( $data, 1, 3 ), 3 ); // See AV1 Image File Format (AVIF) 8.1 // at https://aomediacodec.github.io/av1-avif/#avif-boxes (available when // https://github.com/AOMediaCodec/av1-avif/pull/170 is merged). $is_parsable = ( $this->type == 'meta' && $this->version <= 0 ) || ( $this->type == 'pitm' && $this->version <= 1 ) || ( $this->type == 'ipma' && $this->version <= 1 ) || ( $this->type == 'ispe' && $this->version <= 0 ) || ( $this->type == 'pixi' && $this->version <= 0 ) || ( $this->type == 'iref' && $this->version <= 1 ) || ( $this->type == 'auxC' && $this->version <= 0 ); // Instead of considering this file as invalid, skip unparsable boxes. if ( !$is_parsable ) { $this->type = 'unknownversion'; } } // print_r( $this ); // Uncomment to print all boxes. return FOUND; } } //------------------------------------------------------------------------------ class Parser { private $handle; // Input stream. private $num_parsed_boxes = 0; private $data_was_skipped = false; public $features; function __construct( $handle ) { $this->handle = $handle; $this->features = new Features(); } /** * Parses an "ipco" box. * * "ispe" is used for width and height, "pixi" and "av1C" are used for bit depth * and number of channels, and "auxC" is used for alpha. * * @param stream $handle The resource the box will be parsed from. * @param int $num_remaining_bytes The number of bytes that should be available from the resource. * @return Status FOUND on success or an error on failure. */ private function parse_ipco( $num_remaining_bytes ) { $box_index = 1; // 1-based index. Used for iterating over properties. do { $box = new Box(); $status = $box->parse( $this->handle, $this->num_parsed_boxes, $num_remaining_bytes ); if ( $status != FOUND ) { return $status; } if ( $box->type == 'ispe' ) { // See ISO/IEC 23008-12:2017(E) 6.5.3.2 if ( $box->content_size < 8 ) { return INVALID; } if ( !( $data = read( $this->handle, 8 ) ) ) { return TRUNCATED; } $width = read_big_endian( substr( $data, 0, 4 ), 4 ); $height = read_big_endian( substr( $data, 4, 4 ), 4 ); if ( $width == 0 || $height == 0 ) { return INVALID; } if ( count( $this->features->dim_props ) <= MAX_FEATURES && $box_index <= MAX_VALUE ) { $dim_prop_count = count( $this->features->dim_props ); $this->features->dim_props[$dim_prop_count] = new Dim_Prop(); $this->features->dim_props[$dim_prop_count]->property_index = $box_index; $this->features->dim_props[$dim_prop_count]->width = $width; $this->features->dim_props[$dim_prop_count]->height = $height; } else { $this->data_was_skipped = true; } if ( !skip( $this->handle, $box->content_size - 8 ) ) { return TRUNCATED; } } else if ( $box->type == 'pixi' ) { // See ISO/IEC 23008-12:2017(E) 6.5.6.2 if ( $box->content_size < 1 ) { return INVALID; } if ( !( $data = read( $this->handle, 1 ) ) ) { return TRUNCATED; } $num_channels = read_big_endian( $data, 1 ); if ( $num_channels < 1 ) { return INVALID; } if ( $box->content_size < 1 + $num_channels ) { return INVALID; } if ( !( $data = read( $this->handle, 1 ) ) ) { return TRUNCATED; } $bit_depth = read_big_endian( $data, 1 ); if ( $bit_depth < 1 ) { return INVALID; } for ( $i = 1; $i < $num_channels; ++$i ) { if ( !( $data = read( $this->handle, 1 ) ) ) { return TRUNCATED; } // Bit depth should be the same for all channels. if ( read_big_endian( $data, 1 ) != $bit_depth ) { return INVALID; } if ( $i > 32 ) { return ABORTED; // Be reasonable. } } if ( count( $this->features->chan_props ) <= MAX_FEATURES && $box_index <= MAX_VALUE && $bit_depth <= MAX_VALUE && $num_channels <= MAX_VALUE ) { $chan_prop_count = count( $this->features->chan_props ); $this->features->chan_props[$chan_prop_count] = new Chan_Prop(); $this->features->chan_props[$chan_prop_count]->property_index = $box_index; $this->features->chan_props[$chan_prop_count]->bit_depth = $bit_depth; $this->features->chan_props[$chan_prop_count]->num_channels = $num_channels; } else { $this->data_was_skipped = true; } if ( !skip( $this->handle, $box->content_size - ( 1 + $num_channels ) ) ) { return TRUNCATED; } } else if ( $box->type == 'av1C' ) { // See AV1 Codec ISO Media File Format Binding 2.3.1 // at https://aomediacodec.github.io/av1-isobmff/#av1c // Only parse the necessary third byte. Assume that the others are valid. if ( $box->content_size < 3 ) { return INVALID; } if ( !( $data = read( $this->handle, 3 ) ) ) { return TRUNCATED; } $byte = read_big_endian( substr( $data, 2, 1 ), 1 ); $high_bitdepth = ( $byte & 0x40 ) != 0; $twelve_bit = ( $byte & 0x20 ) != 0; $monochrome = ( $byte & 0x10 ) != 0; if ( $twelve_bit && !$high_bitdepth ) { return INVALID; } if ( count( $this->features->chan_props ) <= MAX_FEATURES && $box_index <= MAX_VALUE ) { $chan_prop_count = count( $this->features->chan_props ); $this->features->chan_props[$chan_prop_count] = new Chan_Prop(); $this->features->chan_props[$chan_prop_count]->property_index = $box_index; $this->features->chan_props[$chan_prop_count]->bit_depth = $high_bitdepth ? $twelve_bit ? 12 : 10 : 8; $this->features->chan_props[$chan_prop_count]->num_channels = $monochrome ? 1 : 3; } else { $this->data_was_skipped = true; } if ( !skip( $this->handle, $box->content_size - 3 ) ) { return TRUNCATED; } } else if ( $box->type == 'auxC' ) { // See AV1 Image File Format (AVIF) 4 // at https://aomediacodec.github.io/av1-avif/#auxiliary-images $kAlphaStr = "urn:mpeg:mpegB:cicp:systems:auxiliary:alpha\0"; $kAlphaStrLength = 44; // Includes terminating character. if ( $box->content_size >= $kAlphaStrLength ) { if ( !( $data = read( $this->handle, $kAlphaStrLength ) ) ) { return TRUNCATED; } if ( substr( $data, 0, $kAlphaStrLength ) == $kAlphaStr ) { // Note: It is unlikely but it is possible that this alpha plane does // not belong to the primary item or a tile. Ignore this issue. $this->features->has_alpha = true; } if ( !skip( $this->handle, $box->content_size - $kAlphaStrLength ) ) { return TRUNCATED; } } else { if ( !skip( $this->handle, $box->content_size ) ) { return TRUNCATED; } } } else { if ( !skip( $this->handle, $box->content_size ) ) { return TRUNCATED; } } ++$box_index; $num_remaining_bytes -= $box->size; } while ( $num_remaining_bytes > 0 ); return NOT_FOUND; } /** * Parses an "iprp" box. * * The "ipco" box contain the properties which are linked to items by the "ipma" box. * * @param stream $handle The resource the box will be parsed from. * @param int $num_remaining_bytes The number of bytes that should be available from the resource. * @return Status FOUND on success or an error on failure. */ private function parse_iprp( $num_remaining_bytes ) { do { $box = new Box(); $status = $box->parse( $this->handle, $this->num_parsed_boxes, $num_remaining_bytes ); if ( $status != FOUND ) { return $status; } if ( $box->type == 'ipco' ) { $status = $this->parse_ipco( $box->content_size ); if ( $status != NOT_FOUND ) { return $status; } } else if ( $box->type == 'ipma' ) { // See ISO/IEC 23008-12:2017(E) 9.3.2 $num_read_bytes = 4; if ( $box->content_size < $num_read_bytes ) { return INVALID; } if ( !( $data = read( $this->handle, $num_read_bytes ) ) ) { return TRUNCATED; } $entry_count = read_big_endian( $data, 4 ); $id_num_bytes = ( $box->version < 1 ) ? 2 : 4; $index_num_bytes = ( $box->flags & 1 ) ? 2 : 1; $essential_bit_mask = ( $box->flags & 1 ) ? 0x8000 : 0x80; for ( $entry = 0; $entry < $entry_count; ++$entry ) { if ( $entry >= MAX_PROPS || count( $this->features->props ) >= MAX_PROPS ) { $this->data_was_skipped = true; break; } $num_read_bytes += $id_num_bytes + 1; if ( $box->content_size < $num_read_bytes ) { return INVALID; } if ( !( $data = read( $this->handle, $id_num_bytes + 1 ) ) ) { return TRUNCATED; } $item_id = read_big_endian( substr( $data, 0, $id_num_bytes ), $id_num_bytes ); $association_count = read_big_endian( substr( $data, $id_num_bytes, 1 ), 1 ); for ( $property = 0; $property < $association_count; ++$property ) { if ( $property >= MAX_PROPS || count( $this->features->props ) >= MAX_PROPS ) { $this->data_was_skipped = true; break; } $num_read_bytes += $index_num_bytes; if ( $box->content_size < $num_read_bytes ) { return INVALID; } if ( !( $data = read( $this->handle, $index_num_bytes ) ) ) { return TRUNCATED; } $value = read_big_endian( $data, $index_num_bytes ); // $essential = ($value & $essential_bit_mask); // Unused. $property_index = ( $value & ~$essential_bit_mask ); if ( $property_index <= MAX_VALUE && $item_id <= MAX_VALUE ) { $prop_count = count( $this->features->props ); $this->features->props[$prop_count] = new Prop(); $this->features->props[$prop_count]->property_index = $property_index; $this->features->props[$prop_count]->item_id = $item_id; } else { $this->data_was_skipped = true; } } if ( $property < $association_count ) { break; // Do not read garbage. } } // If all features are available now, do not look further. $status = $this->features->get_primary_item_features(); if ( $status != NOT_FOUND ) { return $status; } // Mostly if 'data_was_skipped'. if ( !skip( $this->handle, $box->content_size - $num_read_bytes ) ) { return TRUNCATED; } } else { if ( !skip( $this->handle, $box->content_size ) ) { return TRUNCATED; } } $num_remaining_bytes -= $box->size; } while ( $num_remaining_bytes > 0 ); return NOT_FOUND; } /** * Parses an "iref" box. * * The "dimg" boxes contain links between tiles and their parent items, which * can be used to infer bit depth and number of channels for the primary item * when the latter does not have these properties. * * @param stream $handle The resource the box will be parsed from. * @param int $num_remaining_bytes The number of bytes that should be available from the resource. * @return Status FOUND on success or an error on failure. */ private function parse_iref( $num_remaining_bytes ) { do { $box = new Box(); $status = $box->parse( $this->handle, $this->num_parsed_boxes, $num_remaining_bytes ); if ( $status != FOUND ) { return $status; } if ( $box->type == 'dimg' ) { // See ISO/IEC 14496-12:2015(E) 8.11.12.2 $num_bytes_per_id = ( $box->version == 0 ) ? 2 : 4; $num_read_bytes = $num_bytes_per_id + 2; if ( $box->content_size < $num_read_bytes ) { return INVALID; } if ( !( $data = read( $this->handle, $num_read_bytes ) ) ) { return TRUNCATED; } $from_item_id = read_big_endian( $data, $num_bytes_per_id ); $reference_count = read_big_endian( substr( $data, $num_bytes_per_id, 2 ), 2 ); for ( $i = 0; $i < $reference_count; ++$i ) { if ( $i >= MAX_TILES ) { $this->data_was_skipped = true; break; } $num_read_bytes += $num_bytes_per_id; if ( $box->content_size < $num_read_bytes ) { return INVALID; } if ( !( $data = read( $this->handle, $num_bytes_per_id ) ) ) { return TRUNCATED; } $to_item_id = read_big_endian( $data, $num_bytes_per_id ); $tile_count = count( $this->features->tiles ); if ( $from_item_id <= MAX_VALUE && $to_item_id <= MAX_VALUE && $tile_count < MAX_TILES ) { $this->features->tiles[$tile_count] = new Tile(); $this->features->tiles[$tile_count]->tile_item_id = $to_item_id; $this->features->tiles[$tile_count]->parent_item_id = $from_item_id; } else { $this->data_was_skipped = true; } } // If all features are available now, do not look further. $status = $this->features->get_primary_item_features(); if ( $status != NOT_FOUND ) { return $status; } // Mostly if 'data_was_skipped'. if ( !skip( $this->handle, $box->content_size - $num_read_bytes ) ) { return TRUNCATED; } } else { if ( !skip( $this->handle, $box->content_size ) ) { return TRUNCATED; } } $num_remaining_bytes -= $box->size; } while ( $num_remaining_bytes > 0 ); return NOT_FOUND; } /** * Parses a "meta" box. * * It looks for the primary item ID in the "pitm" box and recurses into other boxes * to find its features. * * @param stream $handle The resource the box will be parsed from. * @param int $num_remaining_bytes The number of bytes that should be available from the resource. * @return Status FOUND on success or an error on failure. */ private function parse_meta( $num_remaining_bytes ) { do { $box = new Box(); $status = $box->parse( $this->handle, $this->num_parsed_boxes, $num_remaining_bytes ); if ( $status != FOUND ) { return $status; } if ( $box->type == 'pitm' ) { // See ISO/IEC 14496-12:2015(E) 8.11.4.2 $num_bytes_per_id = ( $box->version == 0 ) ? 2 : 4; if ( $num_bytes_per_id > $num_remaining_bytes ) { return INVALID; } if ( !( $data = read( $this->handle, $num_bytes_per_id ) ) ) { return TRUNCATED; } $primary_item_id = read_big_endian( $data, $num_bytes_per_id ); if ( $primary_item_id > MAX_VALUE ) { return ABORTED; } $this->features->has_primary_item = true; $this->features->primary_item_id = $primary_item_id; if ( !skip( $this->handle, $box->content_size - $num_bytes_per_id ) ) { return TRUNCATED; } } else if ( $box->type == 'iprp' ) { $status = $this->parse_iprp( $box->content_size ); if ( $status != NOT_FOUND ) { return $status; } } else if ( $box->type == 'iref' ) { $status = $this->parse_iref( $box->content_size ); if ( $status != NOT_FOUND ) { return $status; } } else { if ( !skip( $this->handle, $box->content_size ) ) { return TRUNCATED; } } $num_remaining_bytes -= $box->size; } while ( $num_remaining_bytes != 0 ); // According to ISO/IEC 14496-12:2012(E) 8.11.1.1 there is at most one "meta". return INVALID; } /** * Parses a file stream. * * The file type is checked through the "ftyp" box. * * @return bool True if the input stream is an AVIF bitstream or false. */ public function parse_ftyp() { $box = new Box(); $status = $box->parse( $this->handle, $this->num_parsed_boxes ); if ( $status != FOUND ) { return false; } if ( $box->type != 'ftyp' ) { return false; } // Iterate over brands. See ISO/IEC 14496-12:2012(E) 4.3.1 if ( $box->content_size < 8 ) { return false; } for ( $i = 0; $i + 4 <= $box->content_size; $i += 4 ) { if ( !( $data = read( $this->handle, 4 ) ) ) { return false; } if ( $i == 4 ) { continue; // Skip minor_version. } if ( substr( $data, 0, 4 ) == 'avif' || substr( $data, 0, 4 ) == 'avis' ) { return skip( $this->handle, $box->content_size - ( $i + 4 ) ); } if ( $i > 32 * 4 ) { return false; // Be reasonable. } } return false; // No AVIF brand no good. } /** * Parses a file stream. * * Features are extracted from the "meta" box. * * @return bool True if the main features of the primary item were parsed or false. */ public function parse_file() { $box = new Box(); while ( $box->parse( $this->handle, $this->num_parsed_boxes ) == FOUND ) { if ( $box->type === 'meta' ) { if ( $this->parse_meta( $box->content_size ) != FOUND ) { return false; } return true; } if ( !skip( $this->handle, $box->content_size ) ) { return false; } } return false; // No "meta" no good. } }
Edit
Rename
Chmod
Delete
FILE
FOLDER
Name
Size
Permission
Action
ID3
---
0755
IXR
---
0755
PHPMailer
---
0755
Requests
---
0755
SimplePie
---
0755
Text
---
0755
abilities-api
---
0755
assets
---
0755
block-bindings
---
0755
block-patterns
---
0755
block-supports
---
0755
blocks
---
0755
certificates
---
0755
css
---
0755
customize
---
0755
fonts
---
0755
html-api
---
0755
images
---
0755
interactivity-api
---
0755
js
---
0755
l10n
---
0755
php-compat
---
0755
pomo
---
0755
rest-api
---
0755
sitemaps
---
0755
sodium_compat
---
0755
style-engine
---
0755
theme-compat
---
0755
widgets
---
0755
abilities-api.php
24369 bytes
0644
abilities.php
7983 bytes
0644
admin-bar.php
36966 bytes
0644
atomlib.php
12181 bytes
0644
author-template.php
19391 bytes
0644
block-bindings.php
7526 bytes
0644
block-editor.php
29282 bytes
0644
block-i18n.json
316 bytes
0644
block-patterns.php
13213 bytes
0644
block-template-utils.php
62484 bytes
0644
block-template.php
15359 bytes
0644
blocks.php
114739 bytes
0644
bookmark-template.php
12768 bytes
0644
bookmark.php
15427 bytes
0644
cache-compat.php
10078 bytes
0644
cache.php
13486 bytes
0644
canonical.php
34645 bytes
0644
capabilities.php
43652 bytes
0644
category-template.php
57045 bytes
0644
category.php
12829 bytes
0644
class-IXR.php
2616 bytes
0644
class-avif-info.php
29615 bytes
0644
class-feed.php
539 bytes
0644
class-http.php
367 bytes
0644
class-json.php
43676 bytes
0644
class-oembed.php
401 bytes
0644
class-phpass.php
6771 bytes
0644
class-phpmailer.php
664 bytes
0644
class-pop3.php
21121 bytes
0644
class-requests.php
2237 bytes
0644
class-simplepie.php
453 bytes
0644
class-smtp.php
457 bytes
0644
class-snoopy.php
37715 bytes
0644
class-walker-category-dropdown.php
2469 bytes
0644
class-walker-category.php
8477 bytes
0644
class-walker-comment.php
14221 bytes
0644
class-walker-nav-menu.php
12044 bytes
0644
class-walker-page-dropdown.php
2710 bytes
0644
class-walker-page.php
7612 bytes
0644
class-wp-admin-bar.php
17874 bytes
0644
class-wp-ajax-response.php
5266 bytes
0644
class-wp-application-passwords.php
17099 bytes
0644
class-wp-block-bindings-registry.php
8482 bytes
0644
class-wp-block-bindings-source.php
2992 bytes
0644
class-wp-block-editor-context.php
1350 bytes
0644
class-wp-block-list.php
4713 bytes
0644
class-wp-block-metadata-registry.php
11895 bytes
0644
class-wp-block-parser-block.php
2555 bytes
0644
class-wp-block-parser-frame.php
2017 bytes
0644
class-wp-block-parser.php
11516 bytes
0644
class-wp-block-pattern-categories-registry.php
5450 bytes
0644
class-wp-block-patterns-registry.php
11253 bytes
0644
class-wp-block-processor.php
69959 bytes
0644
class-wp-block-styles-registry.php
6497 bytes
0644
class-wp-block-supports.php
5626 bytes
0644
class-wp-block-template.php
2033 bytes
0644
class-wp-block-templates-registry.php
7193 bytes
0644
class-wp-block-type-registry.php
5030 bytes
0644
class-wp-block-type.php
17265 bytes
0644
class-wp-block.php
24812 bytes
0644
class-wp-classic-to-block-menu-converter.php
4070 bytes
0644
class-wp-comment-query.php
48804 bytes
0644
class-wp-comment.php
9437 bytes
0644
class-wp-customize-control.php
26119 bytes
0644
class-wp-customize-manager.php
203139 bytes
0644
class-wp-customize-nav-menus.php
58013 bytes
0644
class-wp-customize-panel.php
10710 bytes
0644
class-wp-customize-section.php
11209 bytes
0644
class-wp-customize-setting.php
29962 bytes
0644
class-wp-customize-widgets.php
72607 bytes
0644
class-wp-date-query.php
36147 bytes
0644
class-wp-dependencies.php
17004 bytes
0644
class-wp-dependency.php
2633 bytes
0644
class-wp-duotone.php
40783 bytes
0644
class-wp-editor.php
72335 bytes
0644
class-wp-embed.php
15931 bytes
0644
class-wp-error.php
7502 bytes
0644
class-wp-exception.php
253 bytes
0644
class-wp-fatal-error-handler.php
8150 bytes
0644
class-wp-feed-cache-transient.php
3304 bytes
0644
class-wp-feed-cache.php
969 bytes
0644
class-wp-hook.php
16674 bytes
0644
class-wp-http-cookie.php
7389 bytes
0644
class-wp-http-curl.php
13261 bytes
0644
class-wp-http-encoding.php
6689 bytes
0644
class-wp-http-ixr-client.php
3506 bytes
0644
class-wp-http-proxy.php
5980 bytes
0644
class-wp-http-requests-hooks.php
2022 bytes
0644
class-wp-http-requests-response.php
4400 bytes
0644
class-wp-http-response.php
2977 bytes
0644
class-wp-http-streams.php
16859 bytes
0644
class-wp-http.php
41570 bytes
0644
class-wp-image-editor-gd.php
20705 bytes
0644
class-wp-image-editor-imagick.php
36977 bytes
0644
class-wp-image-editor.php
17415 bytes
0644
class-wp-list-util.php
7443 bytes
0644
class-wp-locale-switcher.php
6776 bytes
0644
class-wp-locale.php
16883 bytes
0644
class-wp-matchesmapregex.php
1828 bytes
0644
class-wp-meta-query.php
30533 bytes
0644
class-wp-metadata-lazyloader.php
6833 bytes
0644
class-wp-navigation-fallback.php
9193 bytes
0644
class-wp-network-query.php
19887 bytes
0644
class-wp-network.php
12296 bytes
0644
class-wp-object-cache.php
17524 bytes
0644
class-wp-oembed-controller.php
6905 bytes
0644
class-wp-oembed.php
31670 bytes
0644
class-wp-paused-extensions-storage.php
5111 bytes
0644
class-wp-phpmailer.php
4348 bytes
0644
class-wp-plugin-dependencies.php
25315 bytes
0644
class-wp-post-type.php
30680 bytes
0644
class-wp-post.php
6491 bytes
0644
class-wp-query.php
163744 bytes
0644
class-wp-recovery-mode-cookie-service.php
6877 bytes
0644
class-wp-recovery-mode-email-service.php
11183 bytes
0644
class-wp-recovery-mode-key-service.php
4884 bytes
0644
class-wp-recovery-mode-link-service.php
3463 bytes
0644
class-wp-recovery-mode.php
11453 bytes
0644
class-wp-rewrite.php
63687 bytes
0644
class-wp-role.php
2523 bytes
0644
class-wp-roles.php
9394 bytes
0644
class-wp-script-modules.php
32917 bytes
0644
class-wp-scripts.php
34864 bytes
0644
class-wp-session-tokens.php
7319 bytes
0644
class-wp-simplepie-file.php
3552 bytes
0644
class-wp-simplepie-sanitize-kses.php
1910 bytes
0644
class-wp-site-query.php
31655 bytes
0644
class-wp-site.php
7467 bytes
0644
class-wp-speculation-rules.php
7527 bytes
0644
class-wp-styles.php
12843 bytes
0644
class-wp-tax-query.php
19577 bytes
0644
class-wp-taxonomy.php
18559 bytes
0644
class-wp-term-query.php
40953 bytes
0644
class-wp-term.php
5298 bytes
0644
class-wp-text-diff-renderer-inline.php
979 bytes
0644
class-wp-text-diff-renderer-table.php
18880 bytes
0644
class-wp-textdomain-registry.php
10481 bytes
0644
class-wp-theme-json-data.php
1809 bytes
0644
class-wp-theme-json-resolver.php
35738 bytes
0644
class-wp-theme-json-schema.php
7367 bytes
0644
class-wp-theme-json.php
164347 bytes
0644
class-wp-theme.php
65810 bytes
0644
class-wp-token-map.php
28618 bytes
0644
class-wp-url-pattern-prefixer.php
4802 bytes
0644
class-wp-user-meta-session-tokens.php
3011 bytes
0644
class-wp-user-query.php
44166 bytes
0644
class-wp-user-request.php
2305 bytes
0644
class-wp-user.php
23044 bytes
0644
class-wp-walker.php
13322 bytes
0644
class-wp-widget-factory.php
3347 bytes
0644
class-wp-widget.php
18429 bytes
0644
class-wp-xmlrpc-server.php
215447 bytes
0644
class-wp.php
26481 bytes
0644
class-wpdb.php
118627 bytes
0644
class.wp-dependencies.php
373 bytes
0644
class.wp-scripts.php
343 bytes
0644
class.wp-styles.php
338 bytes
0644
comment-template.php
103145 bytes
0644
comment.php
134069 bytes
0644
compat-utf8.php
19554 bytes
0644
compat.php
17830 bytes
0644
cron.php
42988 bytes
0644
date.php
400 bytes
0644
default-constants.php
11365 bytes
0644
default-filters.php
37910 bytes
0644
default-widgets.php
2295 bytes
0644
deprecated.php
192644 bytes
0644
embed-template.php
338 bytes
0644
embed.php
38911 bytes
0644
error-protection.php
4121 bytes
0644
error_log
24654 bytes
0644
feed-atom-comments.php
5504 bytes
0644
feed-atom.php
3121 bytes
0644
feed-rdf.php
2668 bytes
0644
feed-rss.php
1189 bytes
0644
feed-rss2-comments.php
4136 bytes
0644
feed-rss2.php
3799 bytes
0644
feed.php
25189 bytes
0644
fonts.php
9790 bytes
0644
formatting.php
354741 bytes
0644
functions.php
288600 bytes
0644
functions.wp-scripts.php
15311 bytes
0644
functions.wp-styles.php
8641 bytes
0644
general-template.php
173004 bytes
0644
global-styles-and-settings.php
21204 bytes
0644
http.php
25878 bytes
0644
https-detection.php
5857 bytes
0644
https-migration.php
4741 bytes
0644
kses.php
83693 bytes
0644
l10n.php
68797 bytes
0644
link-template.php
160117 bytes
0644
load.php
56510 bytes
0644
locale.php
162 bytes
0644
media-template.php
63197 bytes
0644
media.php
221247 bytes
0644
meta.php
66556 bytes
0644
ms-blogs.php
25845 bytes
0644
ms-default-constants.php
4921 bytes
0644
ms-default-filters.php
6636 bytes
0644
ms-deprecated.php
21759 bytes
0644
ms-files.php
2857 bytes
0644
ms-functions.php
91842 bytes
0644
ms-load.php
19887 bytes
0644
ms-network.php
3782 bytes
0644
ms-settings.php
4204 bytes
0644
ms-site.php
41717 bytes
0644
nav-menu-template.php
25990 bytes
0644
nav-menu.php
44347 bytes
0644
option.php
105035 bytes
0644
pluggable-deprecated.php
6324 bytes
0644
pluggable.php
127457 bytes
0644
plugin.php
36501 bytes
0644
post-formats.php
7102 bytes
0644
post-template.php
68648 bytes
0644
post-thumbnail-template.php
10879 bytes
0644
post.php
296072 bytes
0644
query.php
37095 bytes
0644
registration-functions.php
200 bytes
0644
registration.php
200 bytes
0644
rest-api.php
100654 bytes
0644
revision.php
30741 bytes
0644
rewrite.php
19490 bytes
0644
robots-template.php
5185 bytes
0644
rss-functions.php
255 bytes
0644
rss.php
23203 bytes
0644
script-loader.php
158344 bytes
0644
script-modules.php
9911 bytes
0644
session.php
258 bytes
0644
shortcodes.php
24050 bytes
0644
sitemaps.php
3238 bytes
0644
speculative-loading.php
8600 bytes
0644
spl-autoload-compat.php
441 bytes
0644
style-engine.php
7563 bytes
0644
taxonomy.php
177058 bytes
0644
template-canvas.php
544 bytes
0644
template-loader.php
4267 bytes
0644
template.php
36834 bytes
0644
theme-i18n.json
1730 bytes
0644
theme-previews.php
2910 bytes
0644
theme-templates.php
6238 bytes
0644
theme.json
8921 bytes
0644
theme.php
135008 bytes
0644
update.php
38353 bytes
0644
user.php
178062 bytes
0644
utf8.php
7260 bytes
0644
vars.php
6562 bytes
0644
version.php
1106 bytes
0644
widgets.php
71129 bytes
0644
wp-db.php
445 bytes
0644
wp-diff.php
799 bytes
0644
N4ST4R_ID | Naxtarrr