/* jpegmarker.c - JPEG marker functions
*
* Copyright (c) 1997-2023 Timo Kokkonen
* All Rights Reserved.
*
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
* This file is part of JPEGinfo.
*
* JPEGinfo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* JPEGinfo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with JPEGinfo. If not, see .
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include
#include
#include
#include
#include "jpegmarker.h"
struct marker_name {
unsigned char marker;
char *name;
};
const struct marker_name jpeg_marker_names[] = {
{ JPEG_COM, "COM" },
{ JPEG_APP0 + 0, "APP0" },
{ JPEG_APP0 + 1, "APP1" },
{ JPEG_APP0 + 2, "APP2" },
{ JPEG_APP0 + 3, "APP3" },
{ JPEG_APP0 + 4, "APP4" },
{ JPEG_APP0 + 5, "APP5" },
{ JPEG_APP0 + 6, "APP6" },
{ JPEG_APP0 + 7, "APP7" },
{ JPEG_APP0 + 8, "APP8" },
{ JPEG_APP0 + 9, "APP9" },
{ JPEG_APP0 + 10, "APP10" },
{ JPEG_APP0 + 11, "APP11" },
{ JPEG_APP0 + 12, "APP12" },
{ JPEG_APP0 + 13, "APP13" },
{ JPEG_APP0 + 14, "APP14" },
{ JPEG_APP0 + 15, "APP15" },
{ 0, 0 }
};
const struct jpeg_special_marker_type jpeg_special_marker_types[] = {
{ JPEG_APP0, "JFIF", 5, "JFIF\0" },
{ JPEG_APP0, "JFXX", 5, "JFXX\0" },
{ JPEG_APP0, "CIFF", 2, "II" },
{ JPEG_APP0, "CIFF", 2, "MM" },
{ JPEG_APP0, "AVI1", 4, "AVI1" },
{ JPEG_APP0 + 1, "Exif", 6, "Exif\0\0" },
{ JPEG_APP0 + 1, "XMP", 29, "http://ns.adobe.com/xap/1.0/\0" },
{ JPEG_APP0 + 1, "XMP", 34, "http://ns.adobe.com/xmp/extension/\0" },
{ JPEG_APP0 + 1, "QVCI", 5, "QVCI\0" },
{ JPEG_APP0 + 1, "FLIR", 5, "FLIR\0" },
{ JPEG_APP0 + 2, "ICC", 12, "ICC_PROFILE\0" },
{ JPEG_APP0 + 2, "FPXR", 5, "FPXR\0" },
{ JPEG_APP0 + 2, "MPF", 4, "MPF\0" },
{ JPEG_APP0 + 3, "Meta", 6, "Meta\0\0" },
{ JPEG_APP0 + 3, "Meta", 6, "META\0\0" },
{ JPEG_APP0 + 3, "Meta", 6, "Exif\0\0" },
{ JPEG_APP0 + 3, "Stim", 5, "Stim\0" },
{ JPEG_APP0 + 3, "JPS", 8, "_JPSJPS_" },
{ JPEG_APP0 + 4, "Scalado", 8, "SCALADO\0" },
{ JPEG_APP0 + 4, "FPXR", 5, "FPXR\0" },
{ JPEG_APP0 + 5, "RMETA", 6, "RMETA\0" },
{ JPEG_APP0 + 6, "EPPIM", 6, "EPPIM\0" },
{ JPEG_APP0 + 6, "NITF", 5, "NTIF\0" },
{ JPEG_APP0 + 6, "GoPro", 6, "GoPro\0" },
{ JPEG_APP0 + 8, "SPIFF", 6, "SPIFF\0" },
{ JPEG_APP0 + 10, "AROT", 6, "AROT\0\0" },
{ JPEG_APP0 + 11, "HDR", 6, "HDR_RI" },
{ JPEG_APP0 + 13, "IPTC", 14, "Photoshop 3.0\0" },
{ JPEG_APP0 + 13, "IPTC", 18, "Adobe_Photoshop2.5" },
{ JPEG_APP0 + 13, "AdobeCM", 8, "Adobe_CM" },
{ JPEG_APP0 + 14, "Adobe", 5, "Adobe" },
{ 0, NULL, 0, NULL }
};
const char* jpeg_marker_name(unsigned int marker)
{
int i = 0;
while (jpeg_marker_names[i].name) {
if (jpeg_marker_names[i].marker == marker)
return jpeg_marker_names[i].name;
i++;
}
return "Unknown";
}
size_t jpeg_special_marker_types_count()
{
int i = 0;
while (jpeg_special_marker_types[i].name)
i++;
return i;
}
int jpeg_special_marker(jpeg_saved_marker_ptr marker)
{
int i = 0;
if (!marker)
return -1;
while (jpeg_special_marker_types[i].name) {
const struct jpeg_special_marker_type *m = &jpeg_special_marker_types[i];
if (marker->marker == m->marker && marker->data_length >= m->ident_len) {
if (m->ident_len < 1)
return i;
if (!memcmp(marker->data, m->ident_str, m->ident_len))
return i;
}
i++;
}
return -2;
}
const char* jpeg_special_marker_name(jpeg_saved_marker_ptr marker)
{
int i = jpeg_special_marker(marker);
return (i >= 0 ? jpeg_special_marker_types[i].name : "Unknown");
}
/* eof :-) */