check for scale==0

parse strn chunk
fix spelling errors
prepare for INFO list parsing


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21346 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Marcus Overhagen 2007-06-07 22:03:11 +00:00
parent f44764386f
commit 27cc6d1f0f
3 changed files with 46 additions and 10 deletions

View File

@ -25,7 +25,7 @@
#include <stdio.h>
#include "OpenDMLFile.h"
//#define TRACE_ODML_FILE
#define TRACE_ODML_FILE
#ifdef TRACE_ODML_FILE
#define TRACE printf
#else

View File

@ -27,7 +27,7 @@
#include "OpenDMLParser.h"
#include "avi.h"
//#define TRACE_ODML_PARSER
#define TRACE_ODML_PARSER
#ifdef TRACE_ODML_PARSER
#define TRACE printf
#else
@ -151,7 +151,7 @@ OpenDMLParser::Parse()
return B_ERROR;
}
if (fSize < 32) {
ERROR("OpenDMLParser::Parse: file to small\n");
ERROR("OpenDMLParser::Parse: file too small\n");
return B_ERROR;
}
@ -238,7 +238,7 @@ OpenDMLParser::Parse()
return B_ERROR;
cont:
pos += (size) + (size & 1);
pos += size + (size & 1);
riff_chunk_number++;
}
return B_OK;
@ -252,7 +252,7 @@ OpenDMLParser::ParseChunk_AVI(int number, uint64 start, uint32 size)
uint64 end = start + size;
if (size < 9) {
ERROR("OpenDMLParser::ParseChunk_AVI: chunk is to small at pos %llu\n", start);
ERROR("OpenDMLParser::ParseChunk_AVI: chunk is too small at pos %llu\n", start);
return B_ERROR;
}
@ -301,7 +301,7 @@ OpenDMLParser::ParseChunk_AVI(int number, uint64 start, uint32 size)
TRACE("OpenDMLParser::ParseChunk_AVI: unknown chunk ignored\n");
}
pos += (Chunksize) + (Chunksize & 1);
pos += Chunksize + (Chunksize & 1);
}
return B_OK;
@ -315,7 +315,7 @@ OpenDMLParser::ParseChunk_LIST(uint64 start, uint32 size)
uint32 fourcc;
if (size < 5) {
ERROR("OpenDMLParser::ParseChunk_LIST: chunk is to small at pos %llu\n", start);
ERROR("OpenDMLParser::ParseChunk_LIST: chunk is too small at pos %llu\n", start);
return B_ERROR;
}
@ -338,6 +338,8 @@ OpenDMLParser::ParseChunk_LIST(uint64 start, uint32 size)
return ParseList_strl(start + 4, size - 4);
} else if (fourcc == FOURCC('o','d','m','l')) {
return ParseList_generic(start + 4, size - 4);
} else if (fourcc == FOURCC('I','N','F','O')) {
return ParseList_INFO(start + 4, size - 4);
} else {
TRACE("OpenDMLParser::ParseChunk_LIST: unknown list type ignored\n");
return B_OK;
@ -458,6 +460,11 @@ OpenDMLParser::ParseChunk_strh(uint64 start, uint32 size)
DO_SWAP_INT16(fCurrentStream->stream_header.rect_bottom);
#endif
if (fCurrentStream->stream_header.scale == 0) {
printf("OpenDMLParser::ParseChunk_strh: scale is 0\n");
fCurrentStream->stream_header.scale = 1;
}
fCurrentStream->stream_header_valid = true;
fCurrentStream->is_audio = fCurrentStream->stream_header.fourcc_type == FOURCC('a','u','d','s');
fCurrentStream->is_video = fCurrentStream->stream_header.fourcc_type == FOURCC('v','i','d','s');
@ -596,6 +603,22 @@ OpenDMLParser::ParseChunk_strf(uint64 start, uint32 size)
return B_OK;
}
status_t
OpenDMLParser::ParseChunk_strn(uint64 start, uint32 size)
{
TRACE("OpenDMLParser::ParseChunk_strn, size %lu\n", size);
if (fCurrentStream == 0) {
ERROR("OpenDMLParser::ParseChunk_strn: error, no Stream info\n");
return B_ERROR;
}
// this is an optional null-terminated string, we ignore it...
return B_OK;
}
status_t
OpenDMLParser::ParseChunk_indx(uint64 start, uint32 size)
{
@ -648,7 +671,7 @@ OpenDMLParser::ParseChunk_dmlh(uint64 start, uint32 size)
status_t
OpenDMLParser::ParseList_strl(uint64 start, uint32 size)
{
TRACE("OpenDMLParser::ParseList_strl\n");
TRACE("OpenDMLParser::ParseList_strl, size %lu\n", size);
CreateNewStreamInfo();
fStreamCount++;
@ -659,7 +682,7 @@ OpenDMLParser::ParseList_strl(uint64 start, uint32 size)
status_t
OpenDMLParser::ParseList_generic(uint64 start, uint32 size)
{
TRACE("OpenDMLParser::ParseList_generic\n");
TRACE("OpenDMLParser::ParseList_generic, size %lu\n", size);
uint64 pos = start;
uint64 end = start + size;
@ -713,6 +736,9 @@ OpenDMLParser::ParseList_generic(uint64 start, uint32 size)
} else if (Chunkfcc == FOURCC('s','t','r','f')) {
if (ParseChunk_strf(pos, Chunksize) < B_OK)
return B_ERROR;
} else if (Chunkfcc == FOURCC('s','t','r','n')) {
if (ParseChunk_strn(pos, Chunksize) < B_OK)
return B_ERROR;
} else if (Chunkfcc == FOURCC('i','n','d','x')) {
if (ParseChunk_indx(pos, Chunksize) < B_OK)
return B_ERROR;
@ -730,10 +756,18 @@ OpenDMLParser::ParseList_generic(uint64 start, uint32 size)
return B_OK;
}
status_t
OpenDMLParser::ParseList_INFO(uint64 start, uint32 size)
{
TRACE("OpenDMLParser::ParseList_INFO, size %lu\n", size);
return B_OK;
}
status_t
OpenDMLParser::ParseList_movi(uint64 start, uint32 size)
{
TRACE("OpenDMLParser::ParseList_movi\n");
TRACE("OpenDMLParser::ParseList_movi, size %lu\n", size);
if (fMovieListStart == 0)
fMovieListStart = start;

View File

@ -71,9 +71,11 @@ private:
status_t ParseChunk_avih(uint64 start, uint32 size);
status_t ParseChunk_strh(uint64 start, uint32 size);
status_t ParseChunk_strf(uint64 start, uint32 size);
status_t ParseChunk_strn(uint64 start, uint32 size);
status_t ParseChunk_dmlh(uint64 start, uint32 size);
status_t ParseList_movi(uint64 start, uint32 size);
status_t ParseList_generic(uint64 start, uint32 size);
status_t ParseList_INFO(uint64 start, uint32 size);
status_t ParseList_strl(uint64 start, uint32 size);
private: