Added code to decode AVI headers in AVI RIFF viewer.
This commit is contained in:
parent
6856921c38
commit
becec5c8a7
|
@ -64,6 +64,7 @@ AviRiffViewerDialog::AviRiffViewerDialog(QWidget *parent)
|
|||
win = this;
|
||||
avi = NULL;
|
||||
lastChunk = NULL;
|
||||
memset( strhType, 0, sizeof(strhType) );
|
||||
|
||||
setWindowTitle("AVI RIFF Viewer");
|
||||
|
||||
|
@ -140,7 +141,7 @@ QMenuBar *AviRiffViewerDialog::buildMenuBar(void)
|
|||
QMenu *fileMenu;
|
||||
//QActionGroup *actGroup;
|
||||
QAction *act;
|
||||
int opt, useNativeMenuBar=0;
|
||||
int useNativeMenuBar=0;
|
||||
|
||||
QMenuBar *menuBar = new QMenuBar();
|
||||
|
||||
|
@ -156,7 +157,7 @@ QMenuBar *AviRiffViewerDialog::buildMenuBar(void)
|
|||
fileMenu = menuBar->addMenu(tr("&File"));
|
||||
|
||||
// File -> Open
|
||||
act = new QAction(tr("&Open"), this);
|
||||
act = new QAction(tr("&Open AVI File"), this);
|
||||
act->setShortcut(QKeySequence::Open);
|
||||
act->setStatusTip(tr("Open AVI File"));
|
||||
connect(act, SIGNAL(triggered()), this, SLOT(openAviFileDialog(void)) );
|
||||
|
@ -164,7 +165,17 @@ QMenuBar *AviRiffViewerDialog::buildMenuBar(void)
|
|||
fileMenu->addAction(act);
|
||||
|
||||
// File -> Close
|
||||
act = new QAction(tr("&Close"), this);
|
||||
act = new QAction(tr("&Close File"), this);
|
||||
act->setShortcut(QKeySequence(tr("Ctrl+C")));
|
||||
act->setStatusTip(tr("Close File"));
|
||||
connect(act, SIGNAL(triggered()), this, SLOT(closeFile(void)) );
|
||||
|
||||
fileMenu->addAction(act);
|
||||
|
||||
fileMenu->addSeparator();
|
||||
|
||||
// File -> Quit
|
||||
act = new QAction(tr("&Quit Window"), this);
|
||||
act->setShortcut(QKeySequence::Close);
|
||||
act->setStatusTip(tr("Close Window"));
|
||||
connect(act, SIGNAL(triggered()), this, SLOT(closeWindow(void)) );
|
||||
|
@ -181,7 +192,7 @@ void AviRiffViewerDialog::openAviFileDialog(void)
|
|||
QString filename;
|
||||
std::string lastPath;
|
||||
//char dir[512];
|
||||
const char *base, *rom;
|
||||
const char *base;
|
||||
QFileDialog dialog(this, tr("Open AVI Movie for Inspection") );
|
||||
QList<QUrl> urls;
|
||||
QDir d;
|
||||
|
@ -221,19 +232,6 @@ void AviRiffViewerDialog::openAviFileDialog(void)
|
|||
dialog.setDirectory( QString::fromStdString(lastPath) );
|
||||
}
|
||||
|
||||
rom = getRomFile();
|
||||
|
||||
if ( rom )
|
||||
{
|
||||
char baseName[512];
|
||||
getFileBaseName( rom, baseName );
|
||||
|
||||
if ( baseName[0] != 0 )
|
||||
{
|
||||
dialog.selectFile(baseName);
|
||||
}
|
||||
}
|
||||
|
||||
// Check config option to use native file dialog or not
|
||||
g_config->getOption ("SDL.UseNativeFileDialog", &useNativeFileDialogVal);
|
||||
|
||||
|
@ -287,6 +285,7 @@ int AviRiffViewerDialog::openFile( const char *filepath )
|
|||
|
||||
itemStack.clear();
|
||||
lastChunk = NULL;
|
||||
memset( strhType, 0, sizeof(strhType) );
|
||||
|
||||
avi->setRiffWalkCallback( ::riffWalkCallback, this );
|
||||
avi->riffwalk();
|
||||
|
@ -294,7 +293,7 @@ int AviRiffViewerDialog::openFile( const char *filepath )
|
|||
return 0;
|
||||
}
|
||||
//----------------------------------------------------------------------------
|
||||
int AviRiffViewerDialog::closeFile(void)
|
||||
void AviRiffViewerDialog::closeFile(void)
|
||||
{
|
||||
if ( avi )
|
||||
{
|
||||
|
@ -302,8 +301,6 @@ int AviRiffViewerDialog::closeFile(void)
|
|||
}
|
||||
riffTree->clear();
|
||||
itemStack.clear();
|
||||
|
||||
return 0;
|
||||
}
|
||||
//----------------------------------------------------------------------------
|
||||
int AviRiffViewerDialog::riffWalkCallback( int type, long long int fpos, const char *fourcc, size_t size )
|
||||
|
@ -489,6 +486,329 @@ int AviRiffViewerDialog::processChunk( AviRiffTreeItem *item )
|
|||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
}
|
||||
else if ( strcmp( item->getFourcc(), "strh" ) == 0 )
|
||||
{
|
||||
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, "%c%c%c%c", data.buf[8], data.buf[9], data.buf[10], data.buf[11] );
|
||||
strcpy( strhType, stmp );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("fccType") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
if ( isalnum(data.buf[12]) )
|
||||
{
|
||||
sprintf( stmp, "%c%c%c%c", data.buf[12], data.buf[13], data.buf[14], data.buf[15] );
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf( stmp, "0x%X", data.readU32(12) );
|
||||
}
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("fccHandler") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "0x%X", data.readU32(16) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("dwFlags") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU16(20) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("wPriority") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU16(22) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("wLanguage") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU32(24) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("dwInitialFrames") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU32(28) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("dwScale") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU32(32) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("dwRate") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU32(36) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("dwStart") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU32(40) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("dwLength") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU32(44) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("dwSuggestedBufferSize") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%i", data.readI32(48) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("dwQuality") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU32(52) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("dwSampleSize") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU16(56) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("rcFrame.left") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU16(58) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("rcFrame.top") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU16(60) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("rcFrame.right") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU16(62) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("rcFrame.bottom") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
}
|
||||
else if ( strcmp( item->getFourcc(), "strf" ) == 0 )
|
||||
{
|
||||
if ( strcmp( strhType, "vids" ) == 0 )
|
||||
{
|
||||
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) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("biSize") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%i", data.readI32(12) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("biWidth") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%i", data.readI32(16) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("biHeight") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU16(20) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("biPlanes") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU16(22) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("biBitCount") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
if ( isalnum(data.buf[24]) )
|
||||
{
|
||||
sprintf( stmp, "%c%c%c%c", data.buf[24], data.buf[25], data.buf[26], data.buf[27] );
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf( stmp, "0x%X", data.readU32(24) );
|
||||
}
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("biCompression") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU32(28) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("biSizeImage") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%i", data.readI32(32) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("biXPelsPerMeter") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%i", data.readI32(36) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("biYPelsPerMeter") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU32(40) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("biClrUsed") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU32(44) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("biClrImportant") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
}
|
||||
else if ( strcmp( strhType, "auds" ) == 0 )
|
||||
{
|
||||
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.readU16(8) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("wFormatTag") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU16(10) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("nChannels") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU32(12) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("nSamplesPerSec") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU32(16) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("nAvgBytesPerSec") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU16(20) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("nBlockAlign") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU16(22) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("nBitsPerSample") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
|
||||
sprintf( stmp, "%u", data.readU16(24) );
|
||||
|
||||
twi = new QTreeWidgetItem();
|
||||
twi->setText( 0, tr("cbSize") );
|
||||
twi->setText( 2, tr(stmp) );
|
||||
item->addChild(twi);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -72,18 +72,19 @@ protected:
|
|||
QMenuBar *buildMenuBar(void);
|
||||
|
||||
int openFile( const char *filepath );
|
||||
int closeFile(void);
|
||||
int processChunk( AviRiffTreeItem *item );
|
||||
|
||||
gwavi_t *avi;
|
||||
AviRiffTree *riffTree;
|
||||
AviRiffTreeItem *lastChunk;
|
||||
std::list <AviRiffTreeItem*> itemStack;
|
||||
char strhType[8];
|
||||
|
||||
private:
|
||||
public slots:
|
||||
void closeWindow(void);
|
||||
private slots:
|
||||
void closeFile(void);
|
||||
void openAviFileDialog(void);
|
||||
//void ItemActivated(QTreeWidgetItem *item, int column);
|
||||
};
|
||||
|
|
|
@ -1273,6 +1273,16 @@ uint16_t gwavi_dataBuffer::readU16( int ofs )
|
|||
return out;
|
||||
}
|
||||
|
||||
int32_t gwavi_dataBuffer::readI32( int ofs )
|
||||
{
|
||||
int32_t out = 0;
|
||||
|
||||
out = (buf[3+ofs] << 24) | (buf[2+ofs] << 16) |
|
||||
(buf[1+ofs] << 8) | (buf[0+ofs]);
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
uint32_t gwavi_dataBuffer::readU32( int ofs )
|
||||
{
|
||||
uint32_t out = 0;
|
||||
|
|
|
@ -178,6 +178,7 @@ class gwavi_dataBuffer
|
|||
int16_t readI16( int ofs );
|
||||
uint16_t readU16( int ofs );
|
||||
|
||||
int32_t readI32( int ofs );
|
||||
uint32_t readU32( int ofs );
|
||||
|
||||
unsigned char *buf;
|
||||
|
|
Loading…
Reference in New Issue