DCraw::parseCR3() cleanup

This commit is contained in:
Flössie 2019-11-26 09:52:51 +01:00
parent 2ae5f198d7
commit e89b6be76e

View File

@ -280,12 +280,17 @@ int DCraw::parseCR3(
{"uuid", 3},
};
const char sHandlerType[5][5] = {"unk.", "soun", "vide", "hint", "meta"};
const char sHandlerType[5][5] = {
"unk.",
"soun",
"vide",
"hint",
"meta"
};
unsigned int c;
int err = 0;
ushort tL; // Atom length represented in 4 or 8 bytes
unsigned short tL; // Atom length represented in 4 or 8 bytes
char nmAtom[5]; // Atom name
unsigned long long oAtom;
unsigned long long szAtom; // Atom offset and Atom size
@ -297,19 +302,19 @@ int DCraw::parseCR3(
uchar CMP1[36];
char HandlerType[5];
char MediaFormatID[5];
// unsigned ImageWidth, ImageHeight;
// unsigned int ImageWidth, ImageHeight;
long relpos_inDir;
long relpos_inBox;
unsigned szItem;
unsigned Tag;
unsigned lTag;
ushort tItem;
unsigned int szItem;
unsigned int Tag;
unsigned int lTag;
unsigned short tItem;
nmAtom[0] = MediaFormatID[0] = nmAtom[4] = MediaFormatID[4] = '\0';
strcpy(HandlerType, sHandlerType[0]);
strncpy(HandlerType, sHandlerType[0], sizeof(HandlerType));
// ImageWidth = ImageHeight = 0U;
oAtom = oAtomList;
nesting++;
++nesting;
if (nesting > 31) {
return -14; // too deep nesting
@ -329,20 +334,20 @@ int DCraw::parseCR3(
|| get4() != 0x00000008;
};
while ((oAtom + 8ULL) <= (oAtomList + szAtomList)) {
lHdr = 0ULL;
while ((oAtom + 8) <= (oAtomList + szAtomList)) {
lHdr = 0U;
err = 0;
order = 0x4d4d;
order = 0x4D4D;
fseek(ifp, oAtom, SEEK_SET);
szAtom = get4();
for (c = 0; c < 4; c++) {
for (unsigned int c = 0; c < 4; ++c) {
nmAtom[c] = AtomNameStack[nesting * 4 + c] = fgetc(ifp);
}
AtomNameStack[(nesting + 1) * 4] = '\0';
tL = 4;
AtomType = 0;
for (c = 0; c < sizeof AtomNamesList / sizeof * AtomNamesList; c++) {
for (unsigned int c = 0; c < sizeof(AtomNamesList) / sizeof(*AtomNamesList); ++c) {
if (!strcmp(nmAtom, AtomNamesList[c].AtomName)) {
AtomType = AtomNamesList[c].AtomType;
break;
@ -353,28 +358,28 @@ int DCraw::parseCR3(
err = 1;
}
if (szAtom == 0ULL) {
if (szAtom == 0) {
if (nesting != 0) {
err = -2;
goto fin;
}
szAtom = szAtomList - oAtom;
oAtomContent = oAtom + 8ULL;
szAtomContent = szAtom - 8ULL;
} else if (szAtom == 1ULL) {
if ((oAtom + 16ULL) > (oAtomList + szAtomList)) {
oAtomContent = oAtom + 8;
szAtomContent = szAtom - 8;
} else if (szAtom == 1) {
if ((oAtom + 16) > (oAtomList + szAtomList)) {
err = -3;
goto fin;
}
tL = 8;
szAtom = (((unsigned long long)get4()) << 32) | get4();
oAtomContent = oAtom + 16ULL;
szAtomContent = szAtom - 16ULL;
szAtom = (static_cast<unsigned long long>(get4()) << 32) | get4();
oAtomContent = oAtom + 16;
szAtomContent = szAtom - 16;
} else {
oAtomContent = oAtom + 8ULL;
szAtomContent = szAtom - 8ULL;
oAtomContent = oAtom + 8;
szAtomContent = szAtom - 8;
}
if (!strcmp(nmAtom, "trak")) {
@ -387,7 +392,7 @@ int DCraw::parseCR3(
}
if (!strcmp(AtomNameStack, "moovuuid")) {
lHdr = 16ULL;
lHdr = 16;
fread(UIID, 1, lHdr, ifp);
if (!strncmp(UIID, UIID_Canon, lHdr)) {
@ -396,12 +401,12 @@ int DCraw::parseCR3(
fseek(ifp, -lHdr, SEEK_CUR);
}
} else if (!strcmp(AtomNameStack, "moovuuidCCTP")) {
lHdr = 12ULL;
lHdr = 12;
} else if (!strcmp(AtomNameStack, "moovuuidCMT1")) {
short q_order = order;
const short q_order = order;
order = get2();
if ((tL != 4) || is_bad_header()) {
if (tL != 4 || is_bad_header()) {
err = -4;
goto fin;
}
@ -409,10 +414,10 @@ int DCraw::parseCR3(
parse_tiff_ifd(oAtomContent);
order = q_order;
} else if (!strcmp(AtomNameStack, "moovuuidCMT2")) {
short q_order = order;
const short q_order = order;
order = get2();
if ((tL != 4) || is_bad_header()) {
if (tL != 4 || is_bad_header()) {
err = -5;
goto fin;
}
@ -420,10 +425,10 @@ int DCraw::parseCR3(
parse_exif(oAtomContent);
order = q_order;
} else if (!strcmp(AtomNameStack, "moovuuidCMT3")) {
short q_order = order;
const short q_order = order;
order = get2();
if ((tL != 4) || is_bad_header()) {
if (tL != 4 || is_bad_header()) {
err = -6;
goto fin;
}
@ -432,26 +437,26 @@ int DCraw::parseCR3(
parse_makernote(oAtomContent, 0);
order = q_order;
} else if (!strcmp(AtomNameStack, "moovuuidCMT4")) {
short q_order = order;
const short q_order = order;
order = get2();
if ((tL != 4) || is_bad_header()) {
if (tL != 4 || is_bad_header()) {
err = -6;
goto fin;
}
std::int64_t off = ftell(ifp);
const std::int64_t off = ftell(ifp); // FIXME: ftell() returns int
parse_gps(oAtomContent);
fseek(ifp, off, SEEK_SET);
fseek(ifp, off, SEEK_SET); // FIXME: fseek() takes int offset
// parse_gps_libraw(oAtomContent);
order = q_order;
} else if (!strcmp(AtomNameStack, "moovtrakmdiahdlr")) {
fseek(ifp, 8L, SEEK_CUR);
for (c = 0; c < 4; c++) {
fseek(ifp, 8, SEEK_CUR);
for (unsigned int c = 0; c < 4; ++c) {
HandlerType[c] = fgetc(ifp);
}
for (c = 1; c < sizeof sHandlerType / sizeof * sHandlerType; c++) {
for (unsigned int c = 1; c < sizeof(sHandlerType) / sizeof(*sHandlerType); ++c) {
if (!strcmp(HandlerType, sHandlerType[c])) {
TrackType = c;
break;
@ -466,13 +471,13 @@ int DCraw::parseCR3(
goto fin;
}
for (c = 0; c < 4; c++) {
for (unsigned int c = 0; c < 4; ++c) {
MediaFormatID[c] = fgetc(ifp);
}
if ((TrackType == 2) && (!strcmp(MediaFormatID, "CRAW"))) {
if (TrackType == 2 && !strcmp(MediaFormatID, "CRAW")) {
if (szAtomContent >= 44) {
fseek(ifp, 24L, SEEK_CUR);
fseek(ifp, 24, SEEK_CUR);
} else {
err = -8;
goto fin;
@ -482,8 +487,6 @@ int DCraw::parseCR3(
lHdr = 0;
}
#define current_track RT_canon_CR3_data.crx_header[nTrack]
/*ImageWidth = */ get2();
/*ImageHeight = */ get2();
} else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAW")) {
@ -497,69 +500,81 @@ int DCraw::parseCR3(
}
if (!crxParseImageHeader(CMP1, nTrack)) {
current_track.MediaType = 1;
RT_canon_CR3_data.crx_header[nTrack].MediaType = 1;
}
} else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWJPEG")) {
current_track.MediaType = 2;
RT_canon_CR3_data.crx_header[nTrack].MediaType = 2;
} else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsz")) {
if (szAtomContent == 12) {
fseek(ifp, 4L, SEEK_CUR);
fseek(ifp, 4, SEEK_CUR);
} else if (szAtomContent == 16) {
fseek(ifp, 12L, SEEK_CUR);
fseek(ifp, 12, SEEK_CUR);
} else {
err = -9;
goto fin;
}
current_track.MediaSize = get4();
RT_canon_CR3_data.crx_header[nTrack].MediaSize = get4();
} else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblco64")) {
if (szAtomContent == 16) {
fseek(ifp, 8L, SEEK_CUR);
fseek(ifp, 8, SEEK_CUR);
} else {
err = -10;
goto fin;
}
current_track.MediaOffset = (((unsigned long long)get4()) << 32) | get4();
RT_canon_CR3_data.crx_header[nTrack].MediaOffset = (static_cast<unsigned long long>(get4()) << 32) | get4();
}
if (current_track.MediaSize && current_track.MediaOffset &&
((oAtom + szAtom) >= (oAtomList + szAtomList)) &&
!strncmp(AtomNameStack, "moovtrakmdiaminfstbl", 20)) {
if ((TrackType == 4) && (!strcmp(MediaFormatID, "CTMD"))) {
if (
RT_canon_CR3_data.crx_header[nTrack].MediaSize
&& RT_canon_CR3_data.crx_header[nTrack].MediaOffset
&& oAtom + szAtom >= oAtomList + szAtomList
&& !strncmp(AtomNameStack, "moovtrakmdiaminfstbl", 20)
) {
if (TrackType == 4 && !strcmp(MediaFormatID, "CTMD")) {
order = 0x4949;
relpos_inDir = 0L;
relpos_inDir = 0;
while (relpos_inDir + 6 < current_track.MediaSize) {
fseek(ifp, current_track.MediaOffset + relpos_inDir, SEEK_SET);
while (relpos_inDir + 6 < RT_canon_CR3_data.crx_header[nTrack].MediaSize) {
fseek(ifp, RT_canon_CR3_data.crx_header[nTrack].MediaOffset + relpos_inDir, SEEK_SET);
szItem = get4();
tItem = get2();
if ((relpos_inDir + szItem) > current_track.MediaSize) {
if ((relpos_inDir + szItem) > RT_canon_CR3_data.crx_header[nTrack].MediaSize) {
err = -11;
goto fin;
}
if ((tItem == 7) || (tItem == 8) || (tItem == 9)) {
relpos_inBox = relpos_inDir + 12L;
if (
tItem == 7
|| tItem == 8
|| tItem == 9
) {
relpos_inBox = relpos_inDir + 12;
while (relpos_inBox + 8 < relpos_inDir + szItem) {
fseek(ifp, current_track.MediaOffset + relpos_inBox, SEEK_SET);
fseek(ifp, RT_canon_CR3_data.crx_header[nTrack].MediaOffset + relpos_inBox, SEEK_SET);
lTag = get4();
Tag = get4();
if (lTag < 8) {
err = -12;
goto fin;
} else if ((relpos_inBox + lTag) > (relpos_inDir + szItem)) {
} else if (relpos_inBox + lTag > relpos_inDir + szItem) {
err = -11;
goto fin;
}
if ((Tag == 0x927c) && ((tItem == 7) || (tItem == 8))) {
fseek(ifp, current_track.MediaOffset + relpos_inBox + 8L,
SEEK_SET);
short q_order = order;
if (
Tag == 0x927C
&& (
tItem == 7
|| tItem == 8
)
) {
fseek(ifp, RT_canon_CR3_data.crx_header[nTrack].MediaOffset + relpos_inBox + 8, SEEK_SET);
const short q_order = order;
order = get2();
if (is_bad_header()) {
@ -567,10 +582,9 @@ int DCraw::parseCR3(
goto fin;
}
fseek(ifp, -8L, SEEK_CUR);
fseek(ifp, -8, SEEK_CUR);
RT_canon_CR3_data.CR3_CTMDtag = 1;
parse_makernote(current_track.MediaOffset + relpos_inBox + 8,
0);
parse_makernote(RT_canon_CR3_data.crx_header[nTrack].MediaOffset + relpos_inBox + 8, 0);
RT_canon_CR3_data.CR3_CTMDtag = 0;
order = q_order;
}
@ -582,15 +596,12 @@ int DCraw::parseCR3(
relpos_inDir += szItem;
}
order = 0x4d4d;
order = 0x4D4D;
}
}
#undef current_track
if (AtomType == 1) {
err = parseCR3(oAtomContent + lHdr, szAtomContent - lHdr, nesting,
AtomNameStack, nTrack, TrackType);
err = parseCR3(oAtomContent + lHdr, szAtomContent - lHdr, nesting, AtomNameStack, nTrack, TrackType);
if (err) {
goto fin;
@ -601,7 +612,7 @@ int DCraw::parseCR3(
}
fin:
nesting--;
--nesting;
if (nesting >= 0) {
AtomNameStack[nesting * 4] = '\0';
@ -610,7 +621,6 @@ fin:
order = s_order;
return err;
}
#undef bad_hdr
// -----------------------------------------------------------------------------
@ -633,9 +643,9 @@ fin:
namespace
{
static unsigned sgetn(int n, unsigned char* s)
static unsigned int sgetn(int n, unsigned char* s)
{
unsigned result = 0;
unsigned int result = 0;
while (n-- > 0) {
result = (result << 8) | (*s++);