You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
33 lines
925 B
C++
33 lines
925 B
C++
3 years ago
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||
|
|
||
|
#include "jp2image_int.hpp"
|
||
|
|
||
|
#include "error.hpp"
|
||
|
#include "types.hpp"
|
||
|
|
||
|
#include <cassert>
|
||
|
|
||
|
namespace Exiv2::Internal {
|
||
|
|
||
|
bool isValidBoxFileType(const std::vector<uint8_t> &boxData) {
|
||
|
// BR & MinV are obligatory (4 + 4 bytes). Afterwards we have N compatibility lists (of size 4)
|
||
|
if ((boxData.size() - 8u) % 4u != 0) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
const size_t N = (boxData.size() - 8u) / 4u;
|
||
|
const uint32_t brand = getULong(boxData.data(), bigEndian);
|
||
|
const uint32_t minorVersion = getULong(boxData.data() + 4, bigEndian);
|
||
|
|
||
|
bool clWithRightBrand = false;
|
||
|
for (size_t i = 0; i < N; i++) {
|
||
|
uint32_t compatibilityList = getULong(boxData.data() + 8 + i * 4, bigEndian);
|
||
|
if (compatibilityList == brandJp2) {
|
||
|
clWithRightBrand = true;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return (brand == brandJp2 && minorVersion == 0 && clWithRightBrand);
|
||
|
}
|
||
|
} // namespace Exiv2::Internal
|