Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

merge upstream Feb 11, 2024 #43

Merged
merged 8 commits into from
Feb 11, 2024
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Dev 240211 (#81)
mondrake authored Feb 11, 2024
commit 25e5a5273bc53833e8eb5616685bb3fd358054e8
4 changes: 2 additions & 2 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -15,9 +15,9 @@ jobs:
fail-fast: false
matrix:
php-version:
# - "8.1"
- "8.1"
- "8.2"
# - "8.3"
- "8.3"

steps:
- name: Install PHP
11 changes: 9 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
@@ -29,7 +29,9 @@
"symfony/var-dumper": "^6 | ^7",
"symfony/yaml": "^6 | ^7",
"bramus/monolog-colored-line-formatter": "^3",
"phpstan/phpstan": "^1.10"
"phpstan/phpstan": "^1.10",
"phpstan/extension-installer": "^1.3",
"phpstan/phpstan-deprecation-rules": "^1.1"
},
"autoload": {
"psr-4": {
@@ -41,5 +43,10 @@
"FileEye\\MediaProbe\\Test\\": "tests/"
}
},
"bin": ["bin/fileeye-mediaprobe"]
"bin": ["bin/fileeye-mediaprobe"],
"config": {
"allow-plugins": {
"phpstan/extension-installer": true
}
}
}
2 changes: 2 additions & 0 deletions specs/Jpeg/Exif.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
collection: Jpeg\Exif
title: 'JPEG Exif data'
class: FileEye\MediaProbe\Block\Jpeg\Exif
parser: FileEye\MediaProbe\Parser\Jpeg\Exif
writer: FileEye\MediaProbe\Writer\Jpeg\Exif
DOMNode: exif
items:
Tiff:
2 changes: 2 additions & 0 deletions specs/Jpeg/Segment.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
collection: Jpeg\Segment
title: Generic JPEG data segment
class: FileEye\MediaProbe\Block\Jpeg\Segment
parser: FileEye\MediaProbe\Parser\Jpeg\Segment
writer: FileEye\MediaProbe\Writer\Jpeg\Segment
DOMNode: jpegSegment
items: {}
2 changes: 2 additions & 0 deletions specs/Jpeg/SegmentApp1.yaml
Original file line number Diff line number Diff line change
@@ -3,6 +3,8 @@ name: APP1
title: 'JPEG Application segment 1'
payload: variable
class: FileEye\MediaProbe\Block\Jpeg\SegmentApp1
parser: FileEye\MediaProbe\Parser\Jpeg\SegmentApp1
writer: FileEye\MediaProbe\Writer\Jpeg\SegmentApp1
DOMNode: jpegSegment
items:
Exif:
2 changes: 2 additions & 0 deletions specs/Jpeg/SegmentCom.yaml
Original file line number Diff line number Diff line change
@@ -3,5 +3,7 @@ name: COM
title: 'JPEG Comment'
payload: variable
class: FileEye\MediaProbe\Block\Jpeg\SegmentCom
parser: FileEye\MediaProbe\Parser\Jpeg\SegmentCom
writer: FileEye\MediaProbe\Writer\Jpeg\SegmentCom
DOMNode: jpegSegment
items: {}
2 changes: 2 additions & 0 deletions specs/Jpeg/SegmentSos.yaml
Original file line number Diff line number Diff line change
@@ -3,5 +3,7 @@ name: SOS
title: 'JPEG Start of scan'
payload: scan
class: FileEye\MediaProbe\Block\Jpeg\SegmentSos
parser: FileEye\MediaProbe\Parser\Jpeg\SegmentSos
writer: FileEye\MediaProbe\Writer\Jpeg\SegmentSos
DOMNode: jpegSegment
items: {}
16 changes: 9 additions & 7 deletions src/Block/Exif/Vendor/Canon/FilterInfoIndex.php
Original file line number Diff line number Diff line change
@@ -57,13 +57,15 @@ protected function doParseData(DataElement $data): void
$filter_size = $data->getLong($offset + 4);
$this
->addBlock(
new ItemDefinition(CollectionFactory::get('ExifMakerNotes\Canon\Filter'),
DataFormat::BYTE,
$filter_size,
$offset,
0,
$i
))
new ItemDefinition(
CollectionFactory::get('ExifMakerNotes\Canon\Filter'),
DataFormat::BYTE,
$filter_size,
$offset,
0,
$i
)
)
->parseData(new DataWindow($data, $offset, $filter_size + 4));
$offset += 4 + $filter_size;
}
46 changes: 0 additions & 46 deletions src/Block/Jpeg/Exif.php
Original file line number Diff line number Diff line change
@@ -3,12 +3,6 @@
namespace FileEye\MediaProbe\Block\Jpeg;

use FileEye\MediaProbe\Model\BlockBase;
use FileEye\MediaProbe\Collection\CollectionFactory;
use FileEye\MediaProbe\Data\DataElement;
use FileEye\MediaProbe\Data\DataWindow;
use FileEye\MediaProbe\Entry\Core\Undefined;
use FileEye\MediaProbe\ItemDefinition;
use FileEye\MediaProbe\MediaProbe;
use FileEye\MediaProbe\Utility\ConvertBytes;

/**
@@ -27,51 +21,11 @@ class Exif extends BlockBase
// @todo xxx the trailing bytes may not be zeros
const EXIF_HEADER = "Exif\0\0";

/**
* {@inheritdoc}
*/
protected function doParseData(DataElement $data): void
{
assert($this->debugInfo(['dataElement' => $data]));

$tiff = new ItemDefinition(
collection: CollectionFactory::get('Tiff\Tiff'),
);
$tiffParser = $tiff->collection->getPropertyValue('parser');

if ($tiffParser::getTiffSegmentByteOrder($data, strlen(self::EXIF_HEADER)) !== null) {
$this->addBlock($tiff)->parseData($data, strlen(self::EXIF_HEADER), $data->getSize() - strlen(self::EXIF_HEADER));
} else {
// We store the data as normal JPEG content if it could not be
// parsed as Tiff data.
$entry = new Undefined($this, [$data->getBytes()]);
$this->error("TIFF header not found. Parsed {text}", ['text' => $entry->toString()]);
}
}

/**
* {@inheritdoc}
*/
public function toBytes(int $byte_order = ConvertBytes::LITTLE_ENDIAN, int $offset = 0): string
{
return self::EXIF_HEADER . $this->getElement('*')->toBytes();
}

/**
* Determines if the data is an EXIF segment.
*/
public static function isExifSegment(DataElement $dataElement, $offset = 0): bool
{
// There must be at least 6 bytes for the Exif header.
if ($dataElement->getSize() - $offset < strlen(self::EXIF_HEADER)) {
return false;
}

// Verify the Exif header.
if ($dataElement->getBytes($offset, strlen(self::EXIF_HEADER)) === self::EXIF_HEADER) {
return true;
}

return false;
}
}
12 changes: 0 additions & 12 deletions src/Block/Jpeg/Segment.php
Original file line number Diff line number Diff line change
@@ -2,23 +2,11 @@

namespace FileEye\MediaProbe\Block\Jpeg;

use FileEye\MediaProbe\Data\DataElement;
use FileEye\MediaProbe\Entry\Core\Undefined;

/**
* Class representing a generic JPEG data segment.
*
* This is the default segment processor in case no specific class are defined.
*/
class Segment extends SegmentBase
{
/**
* {@inheritdoc}
*/
protected function doParseData(DataElement $data): void
{
assert($this->debugInfo(['dataElement' => $data]));
// Adds the segment data as an Undefined entry.
new Undefined($this, $data);
}
}
23 changes: 0 additions & 23 deletions src/Block/Jpeg/SegmentApp1.php
Original file line number Diff line number Diff line change
@@ -2,36 +2,13 @@

namespace FileEye\MediaProbe\Block\Jpeg;

use FileEye\MediaProbe\Block\Jpeg\Exif;
use FileEye\MediaProbe\Collection\CollectionFactory;
use FileEye\MediaProbe\Data\DataElement;
use FileEye\MediaProbe\Entry\Core\Undefined;
use FileEye\MediaProbe\ItemDefinition;
use FileEye\MediaProbe\Utility\ConvertBytes;

/**
* Class representing a JPEG APP1 segment.
*/
class SegmentApp1 extends SegmentBase
{
/**
* {@inheritdoc}
*/
protected function doParseData(DataElement $data): void
{
assert($this->debugInfo(['dataElement' => $data]));
// If we have an Exif table, parse it.
if (Exif::isExifSegment($data, 4)) {
$exif = new ItemDefinition(CollectionFactory::get('Jpeg\Exif'));
$this->addBlock($exif)->parseData($data, 4, $data->getSize() - 4);
} else {
// We store the data as normal JPEG content if it could not be
// parsed as Exif data.
$entry = new Undefined($this, $data);
$entry->debug("Not an Exif segment. Parsed {text}", ['text' => $entry->toString()]);
}
}

/**
* {@inheritdoc}
*/
13 changes: 0 additions & 13 deletions src/Block/Jpeg/SegmentCom.php
Original file line number Diff line number Diff line change
@@ -2,26 +2,13 @@

namespace FileEye\MediaProbe\Block\Jpeg;

use FileEye\MediaProbe\Data\DataElement;
use FileEye\MediaProbe\Data\DataWindow;
use FileEye\MediaProbe\Entry\Core\Char;
use FileEye\MediaProbe\Utility\ConvertBytes;

/**
* Class representing a JPEG comment segment.
*/
class SegmentCom extends SegmentBase
{
/**
* {@inheritdoc}
*/
protected function doParseData(DataElement $data): void
{
assert($this->debugInfo(['dataElement' => $data]));
// Adds the segment data as a Char string.
new Char($this, new DataWindow($data, 4));
}

/**
* {@inheritdoc}
*/
49 changes: 0 additions & 49 deletions src/Block/Jpeg/SegmentSos.php
Original file line number Diff line number Diff line change
@@ -2,14 +2,6 @@

namespace FileEye\MediaProbe\Block\Jpeg;

use FileEye\MediaProbe\Block\RawData;
use FileEye\MediaProbe\Collection\CollectionFactory;
use FileEye\MediaProbe\Data\DataElement;
use FileEye\MediaProbe\Data\DataWindow;
use FileEye\MediaProbe\Entry\Core\Undefined;
use FileEye\MediaProbe\ItemDefinition;
use FileEye\MediaProbe\Data\DataFormat;

/**
* Class representing a JPEG SOS segment.
*/
@@ -19,45 +11,4 @@ class SegmentSos extends SegmentBase
* JPEG EOI marker.
*/
const JPEG_EOI = 0xD9;

/**
* {@inheritdoc}
*/
protected function doParseData(DataElement $data): void
{
assert($this->debugInfo(['dataElement' => $data]));
// This segment is last before End Of Image, and its length needs to be
// determined by finding the EOI marker backwards from the end of data.
// Some images have some trailing (garbage?) following the EOI marker,
// which we store in a RawData object.
$scan_size = $data->getSize();
while ($data->getByte($scan_size - 2) !== Jpeg::JPEG_DELIMITER || $data->getByte($scan_size - 1) != self::JPEG_EOI) {
$scan_size --;
}
$scan_size -= 2;

// Load data in an Undefined entry.
$data_window = new DataWindow($data, 0, $scan_size);
new Undefined($this, $data_window);

// Append the EOI.
$end_offset = $scan_size;
$eoi = new ItemDefinition(
$this->getParentElement()->getCollection()->getItemCollection(self::JPEG_EOI)
);
$this->getParentElement()->addBlock($eoi)->parseData($data, $end_offset, 2);
$end_offset += 2;

// Now check to see if there are any trailing data.
if ($end_offset < $data->getSize()) {
$raw_size = $data->getSize() - $end_offset;
$this->warning('Found trailing content after EOI: {size} bytes', ['size' => $raw_size]);
// There is no JPEG marker for trailing garbage, so we just collect
// the data in a RawData object.
$trail_definition = new ItemDefinition(CollectionFactory::get('RawData'), DataFormat::BYTE, $raw_size);
$trail_data_window = new DataWindow($data, $end_offset, $raw_size);
$trail = new RawData($trail_definition, $this->getParentElement());
$trail->parseData($trail_data_window);
}
}
}
2 changes: 2 additions & 0 deletions src/Collection/Jpeg/Exif.php
Original file line number Diff line number Diff line change
@@ -15,6 +15,8 @@ class Exif extends CollectionBase {
protected static $map = array (
'title' => 'JPEG Exif data',
'class' => 'FileEye\\MediaProbe\\Block\\Jpeg\\Exif',
'parser' => 'FileEye\\MediaProbe\\Parser\\Jpeg\\Exif',
'writer' => 'FileEye\\MediaProbe\\Writer\\Jpeg\\Exif',
'DOMNode' => 'exif',
'id' => 'Jpeg\\Exif',
'items' =>
2 changes: 2 additions & 0 deletions src/Collection/Jpeg/Segment.php
Original file line number Diff line number Diff line change
@@ -15,6 +15,8 @@ class Segment extends CollectionBase {
protected static $map = array (
'title' => 'Generic JPEG data segment',
'class' => 'FileEye\\MediaProbe\\Block\\Jpeg\\Segment',
'parser' => 'FileEye\\MediaProbe\\Parser\\Jpeg\\Segment',
'writer' => 'FileEye\\MediaProbe\\Writer\\Jpeg\\Segment',
'DOMNode' => 'jpegSegment',
'id' => 'Jpeg\\Segment',
);
2 changes: 2 additions & 0 deletions src/Collection/Jpeg/SegmentApp1.php
Original file line number Diff line number Diff line change
@@ -17,6 +17,8 @@ class SegmentApp1 extends CollectionBase {
'title' => 'JPEG Application segment 1',
'payload' => 'variable',
'class' => 'FileEye\\MediaProbe\\Block\\Jpeg\\SegmentApp1',
'parser' => 'FileEye\\MediaProbe\\Parser\\Jpeg\\SegmentApp1',
'writer' => 'FileEye\\MediaProbe\\Writer\\Jpeg\\SegmentApp1',
'DOMNode' => 'jpegSegment',
'id' => 'Jpeg\\SegmentApp1',
'items' =>
2 changes: 2 additions & 0 deletions src/Collection/Jpeg/SegmentCom.php
Original file line number Diff line number Diff line change
@@ -17,6 +17,8 @@ class SegmentCom extends CollectionBase {
'title' => 'JPEG Comment',
'payload' => 'variable',
'class' => 'FileEye\\MediaProbe\\Block\\Jpeg\\SegmentCom',
'parser' => 'FileEye\\MediaProbe\\Parser\\Jpeg\\SegmentCom',
'writer' => 'FileEye\\MediaProbe\\Writer\\Jpeg\\SegmentCom',
'DOMNode' => 'jpegSegment',
'id' => 'Jpeg\\SegmentCom',
);
2 changes: 2 additions & 0 deletions src/Collection/Jpeg/SegmentSos.php
Original file line number Diff line number Diff line change
@@ -17,6 +17,8 @@ class SegmentSos extends CollectionBase {
'title' => 'JPEG Start of scan',
'payload' => 'scan',
'class' => 'FileEye\\MediaProbe\\Block\\Jpeg\\SegmentSos',
'parser' => 'FileEye\\MediaProbe\\Parser\\Jpeg\\SegmentSos',
'writer' => 'FileEye\\MediaProbe\\Writer\\Jpeg\\SegmentSos',
'DOMNode' => 'jpegSegment',
'id' => 'Jpeg\\SegmentSos',
);
39 changes: 28 additions & 11 deletions src/ItemDefinition.php
Original file line number Diff line number Diff line change
@@ -26,40 +26,57 @@ class ItemDefinition
*/
public function __construct(
public readonly CollectionInterface $collection,
protected int $format = DataFormat::BYTE,
protected int $valuesCount = 1,
protected int $dataOffset = 0,
protected int $itemDefinitionOffset = 0,
protected int $sequence = 0,
)
{
public readonly int $format = DataFormat::BYTE,
public readonly int $valuesCount = 1,
public readonly int $dataOffset = 0,
public readonly int $itemDefinitionOffset = 0,
public readonly int $sequence = 0,
) {
}

/**
* @deprecated
*/
public function getCollection(): CollectionInterface
{
return $this->collection;
}

/**
* @deprecated
*/
public function getFormat(): int
{
return $this->format;
}

/**
* @deprecated
*/
public function getValuesCount(): int
{
return $this->valuesCount;
}

/**
* @deprecated
*/
public function getDataOffset(): int
{
return $this->dataOffset;
}

/**
* @deprecated
*/
public function getItemDefinitionOffset(): int
{
return $this->itemDefinitionOffset;
}

/**
* @deprecated
*/
public function getSequence(): int
{
return $this->sequence;
@@ -70,7 +87,7 @@ public function getSequence(): int
*/
public function getSize(): int
{
return DataFormat::getSize($this->getFormat()) * $this->getValuesCount();
return DataFormat::getSize($this->format) * $this->valuesCount;
}

/**
@@ -82,18 +99,18 @@ public function getEntryClass(): string
// Return the specific entry class if defined, or fall back to
// default class for the format.
if (!$entry_class = $this->collection->getPropertyValue('entryClass')) {
if (empty($this->getFormat())) {
if (empty($this->format)) {
throw new MediaProbeException(
'No format can be derived for item: %s (%s)',
$this->collection->getPropertyValue('item') ?? 'n/a',
$this->collection->getPropertyValue('name') ?? 'n/a'
);
}

if (!$entry_class = DataFormat::getClass($this->getFormat())) {
if (!$entry_class = DataFormat::getClass($this->format)) {
throw new MediaProbeException(
'Unsupported format %d for item: %s (%s)',
$this->getFormat(),
$this->format,
$this->collection->getPropertyValue('item') ?? 'n/a',
$this->collection->getPropertyValue('name') ?? 'n/a'
);
3 changes: 1 addition & 2 deletions src/Media.php
Original file line number Diff line number Diff line change
@@ -64,8 +64,7 @@ class Media extends RootBlockBase
public function __construct(
protected ?LoggerInterface $externalLogger,
?string $failLevel,
)
{
) {
$media = new ItemDefinition(CollectionFactory::get('Media'));
parent::__construct($media);
$this->logger = (new Logger('mediaprobe'))
56 changes: 56 additions & 0 deletions src/Parser/Jpeg/Exif.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?php

namespace FileEye\MediaProbe\Parser\Jpeg;

use FileEye\MediaProbe\Block\Jpeg\Exif as ExifBlock;
use FileEye\MediaProbe\Collection\CollectionFactory;
use FileEye\MediaProbe\Data\DataElement;
use FileEye\MediaProbe\Entry\Core\Undefined;
use FileEye\MediaProbe\ItemDefinition;
use FileEye\MediaProbe\Parser\ParserBase;

/**
* Class for parsing Exif data.
*
* This is found in a JPEG APP1 segment, and it is just an header for an entire
* TIFF structure.
*/
class Exif extends ParserBase
{
public function parseData(DataElement $data): void
{
assert($this->block->debugInfo(['dataElement' => $data]));

$tiff = new ItemDefinition(
collection: CollectionFactory::get('Tiff\Tiff'),
);
$tiffParser = $tiff->collection->getPropertyValue('parser');

if ($tiffParser::getTiffSegmentByteOrder($data, strlen(ExifBlock::EXIF_HEADER)) !== null) {
$this->block->addBlock($tiff)->parseData($data, strlen(ExifBlock::EXIF_HEADER), $data->getSize() - strlen(ExifBlock::EXIF_HEADER));
} else {
// We store the data as normal JPEG content if it could not be
// parsed as Tiff data.
$entry = new Undefined($this->block, [$data->getBytes()]);
$this->block->error("TIFF header not found. Parsed {text}", ['text' => $entry->toString()]);
}
}

/**
* Determines if the data is an EXIF segment.
*/
public static function isExifSegment(DataElement $dataElement, $offset = 0): bool
{
// There must be at least 6 bytes for the Exif header.
if ($dataElement->getSize() - $offset < strlen(ExifBlock::EXIF_HEADER)) {
return false;
}

// Verify the Exif header.
if ($dataElement->getBytes($offset, strlen(ExifBlock::EXIF_HEADER)) === ExifBlock::EXIF_HEADER) {
return true;
}

return false;
}
}
20 changes: 20 additions & 0 deletions src/Parser/Jpeg/Segment.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

namespace FileEye\MediaProbe\Parser\Jpeg;

use FileEye\MediaProbe\Data\DataElement;
use FileEye\MediaProbe\Entry\Core\Undefined;
use FileEye\MediaProbe\Parser\ParserBase;

/**
* Class for parsing a generic JPEG data segment.
*/
class Segment extends ParserBase
{
public function parseData(DataElement $data): void
{
assert($this->block->debugInfo(['dataElement' => $data]));
// Adds the segment data as an Undefined entry.
new Undefined($this->block, $data);
}
}
31 changes: 31 additions & 0 deletions src/Parser/Jpeg/SegmentApp1.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

namespace FileEye\MediaProbe\Parser\Jpeg;

use FileEye\MediaProbe\Collection\CollectionFactory;
use FileEye\MediaProbe\Data\DataElement;
use FileEye\MediaProbe\Entry\Core\Undefined;
use FileEye\MediaProbe\ItemDefinition;
use FileEye\MediaProbe\Parser\ParserBase;

/**
* Class for parsing a JPEG APP1 segment.
*/
class SegmentApp1 extends ParserBase
{
public function parseData(DataElement $data): void
{
assert($this->block->debugInfo(['dataElement' => $data]));
// If we have an Exif table, parse it.
// @todo use parser and not class call driectly
if (Exif::isExifSegment($data, 4)) {
$exif = new ItemDefinition(CollectionFactory::get('Jpeg\Exif'));
$this->block->addBlock($exif)->parseData($data, 4, $data->getSize() - 4);
} else {
// We store the data as normal JPEG content if it could not be
// parsed as Exif data.
$entry = new Undefined($this->block, $data);
$entry->debug("Not an Exif segment. Parsed {text}", ['text' => $entry->toString()]);
}
}
}
21 changes: 21 additions & 0 deletions src/Parser/Jpeg/SegmentCom.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace FileEye\MediaProbe\Parser\Jpeg;

use FileEye\MediaProbe\Data\DataElement;
use FileEye\MediaProbe\Data\DataWindow;
use FileEye\MediaProbe\Entry\Core\Char;
use FileEye\MediaProbe\Parser\ParserBase;

/**
* Class for parsing a JPEG comment segment.
*/
class SegmentCom extends ParserBase
{
public function parseData(DataElement $data): void
{
assert($this->block->debugInfo(['dataElement' => $data]));
// Adds the segment data as a Char string.
new Char($this->block, new DataWindow($data, 4));
}
}
58 changes: 58 additions & 0 deletions src/Parser/Jpeg/SegmentSos.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?php

namespace FileEye\MediaProbe\Parser\Jpeg;

use FileEye\MediaProbe\Block\Jpeg\Jpeg as JpegBlock;
use FileEye\MediaProbe\Block\Jpeg\SegmentSos as SegmentSosBlock;
use FileEye\MediaProbe\Block\RawData;
use FileEye\MediaProbe\Collection\CollectionFactory;
use FileEye\MediaProbe\Data\DataElement;
use FileEye\MediaProbe\Data\DataWindow;
use FileEye\MediaProbe\Entry\Core\Undefined;
use FileEye\MediaProbe\ItemDefinition;
use FileEye\MediaProbe\Parser\ParserBase;
use FileEye\MediaProbe\Data\DataFormat;

/**
* Class for parsing a JPEG SOS segment.
*/
class SegmentSos extends ParserBase
{
public function parseData(DataElement $data): void
{
assert($this->block->debugInfo(['dataElement' => $data]));
// This segment is last before End Of Image, and its length needs to be
// determined by finding the EOI marker backwards from the end of data.
// Some images have some trailing (garbage?) following the EOI marker,
// which we store in a RawData object.
$scan_size = $data->getSize();
while ($data->getByte($scan_size - 2) !== JpegBlock::JPEG_DELIMITER || $data->getByte($scan_size - 1) != SegmentSosBlock::JPEG_EOI) {
$scan_size --;
}
$scan_size -= 2;

// Load data in an Undefined entry.
$data_window = new DataWindow($data, 0, $scan_size);
new Undefined($this->block, $data_window);

// Append the EOI.
$end_offset = $scan_size;
$eoi = new ItemDefinition(
$this->block->getParentElement()->getCollection()->getItemCollection(SegmentSosBlock::JPEG_EOI)
);
$this->block->getParentElement()->addBlock($eoi)->parseData($data, $end_offset, 2);
$end_offset += 2;

// Now check to see if there are any trailing data.
if ($end_offset < $data->getSize()) {
$raw_size = $data->getSize() - $end_offset;
$this->block->warning('Found trailing content after EOI: {size} bytes', ['size' => $raw_size]);
// There is no JPEG marker for trailing garbage, so we just collect
// the data in a RawData object.
$trail_definition = new ItemDefinition(CollectionFactory::get('RawData'), DataFormat::BYTE, $raw_size);
$trail_data_window = new DataWindow($data, $end_offset, $raw_size);
$trail = new RawData($trail_definition, $this->block->getParentElement());
$trail->parseData($trail_data_window);
}
}
}
8 changes: 5 additions & 3 deletions src/Parser/ParserBase.php
Original file line number Diff line number Diff line change
@@ -2,13 +2,15 @@

namespace FileEye\MediaProbe\Parser;

use FileEye\MediaProbe\Data\DataElement;
use FileEye\MediaProbe\Model\BlockInterface;

class ParserBase
abstract class ParserBase
{
public function __construct(
protected readonly BlockInterface $block,
)
{
) {
}

abstract public function parseData(DataElement $data): void;
}
1 change: 0 additions & 1 deletion src/Parser/Tiff/Tiff.php
Original file line number Diff line number Diff line change
@@ -139,5 +139,4 @@ public static function getTiffSegmentByteOrder(DataElement $dataElement, int $of

return $order;
}

}