Added meta data decoding to AVI RIFF viewer.

This commit is contained in:
mjbudd77 2021-10-03 15:46:39 -04:00
parent edebc11048
commit 65565cd1dd
1 changed files with 102 additions and 0 deletions

View File

@ -37,6 +37,39 @@
#include "Qt/ConsoleUtilities.h"
static bool showSizeHex = true;
static const char *riff_tags[] = {
"IARL", "IART", "IAS1", "IAS2", "IAS3", "IAS4", "IAS5", "IAS6", "IAS7",
"IAS8", "IAS9", "ICMS", "ICMT", "ICOP", "ICRD", "ICRP", "IDIM", "IDPI",
"IENG", "IGNR", "IKEY", "ILGT", "ILNG", "IMED", "INAM", "IPLT", "IPRD",
"IPRT", "ITRK", "ISBJ", "ISFT", "ISHP", "ISMP", "ISRC", "ISRF", "ITCH",
NULL
};
static const char *riff_info_conv[] = {
"IARL", "Archival Location",
"IART", "Artist" ,
"ICMS", "Commissioned",
"ICMT", "Comments" ,
"ICOP", "Copyright" ,
"ICRD", "Date" ,
"IENG", "Engineer" ,
"IGNR", "Genre" ,
"IKEY", "KeyWords" ,
"IMED", "Medium" ,
"ILNG", "Language" ,
"INAM", "Title" ,
"IPRD", "Album" ,
"IPRT", "Track" ,
"ITRK", "Track" ,
"ISFT", "Software" ,
"ISMP", "Timecode" ,
"ISBJ", "Subject" ,
"ISRC", "Source" ,
"ISRF", "Source Form",
"ITCH", "Technician",
NULL , NULL ,
};
//----------------------------------------------------------------------------
static int riffWalkCallback( int type, long long int fpos, const char *fourcc, size_t size, void *userData )
{
@ -409,8 +442,28 @@ int AviRiffViewerDialog::riffWalkCallback( int type, long long int fpos, const c
return 0;
}
//----------------------------------------------------------------------------
static bool isRiffTag( const char *fcc, int *matchIdx )
{
int i=0;
while ( riff_tags[i] != NULL )
{
if ( strcmp( fcc, riff_tags[i] ) == 0 )
{
if ( matchIdx )
{
*matchIdx = i;
}
return true;
}
i++;
}
return false;
}
//----------------------------------------------------------------------------
int AviRiffViewerDialog::processChunk( AviRiffTreeItem *item )
{
int i, riffIdx;
QTreeWidgetItem *twi;
char stmp[256];
gwavi_dataBuffer data;
@ -856,6 +909,55 @@ int AviRiffViewerDialog::processChunk( AviRiffTreeItem *item )
item->addChild(twi);
}
}
else if ( isRiffTag( item->getFourcc(), &riffIdx ) )
{
int j=0;
const char *name = "MetaData";
while ( riff_info_conv[j] != NULL )
{
if ( strcmp( item->getFourcc(), riff_info_conv[j] ) == 0 )
{
name = riff_info_conv[j+1]; break;
}
j += 2;
}
data.malloc( item->getSize()+8 );
avi->getChunkData( item->filePos(), data.buf, item->getSize()+8 );
sprintf( stmp, "%c%c%c%c", data.buf[0], data.buf[1], data.buf[2], data.buf[3] );
twi = new QTreeWidgetItem();
twi->setText( 0, tr("fcc") );
twi->setText( 2, tr(stmp) );
item->addChild(twi);
sprintf( stmp, "%u", data.readU32(4) );
twi = new QTreeWidgetItem();
twi->setText( 0, tr("cb") );
twi->setText( 2, tr(stmp) );
item->addChild(twi);
sprintf( stmp, "%u", data.readU32(8) );
for (i=0; i<item->getSize(); i++)
{
if ( i >= ( sizeof(stmp)-1 ) )
{
i = sizeof(stmp)-1; break;
}
stmp[i] = data.buf[i+8];
}
stmp[i] = 0;
twi = new QTreeWidgetItem();
twi->setText( 0, tr(name) );
twi->setText( 2, tr(stmp) );
item->addChild(twi);
}
return 0;
}