Skip to content

Commit afe6b37

Browse files
committed
Fix AviReader
1 parent f26f1f9 commit afe6b37

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

MLDX12VideoCapture/MLAviReader.cpp

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@ MLAviReader::~MLAviReader(void)
1818
float
1919
MLAviReader::DurationSec(void) const
2020
{
21-
if (mAviStreamHeader.dwRate <= 0) {
21+
if (VideoStreamHeader() == nullptr ||
22+
VideoStreamHeader()->dwRate == 0) {
2223
return 0.0f;
2324
}
24-
return (float)mImages.size() / mAviStreamHeader.dwRate;
25+
return (float)mImages.size() / VideoStreamHeader()->dwRate;
2526
}
2627

2728
bool
@@ -211,6 +212,18 @@ MLAviReader::ReadListHeader(void)
211212
return true;
212213
}
213214

215+
const MLAviStreamHeader *
216+
MLAviReader::VideoStreamHeader(void) const
217+
{
218+
for (int i = 0; i < mAviStreamHeader.size(); ++i) {
219+
auto &h = mAviStreamHeader[i];
220+
if (h.fccType == MLFOURCC_vids) {
221+
return &h;
222+
}
223+
}
224+
return nullptr;
225+
}
226+
214227
bool
215228
MLAviReader::ReadAviMainHeader(void)
216229
{
@@ -227,10 +240,12 @@ bool
227240
MLAviReader::ReadAviStreamHeader(void)
228241
{
229242
assert(mFp);
230-
231-
if (!ReadHeader(mAviStreamHeader)) {
243+
244+
MLAviStreamHeader ash;
245+
if (!ReadHeader(ash)) {
232246
printf("Error: ReadAviStreamHeader() ReadHeader() failed\n");
233247
}
248+
mAviStreamHeader.push_back(ash);
234249

235250
return true;
236251
}
@@ -246,7 +261,7 @@ MLAviReader::ReadAviStreamFormatHeader(void)
246261
return false;
247262
}
248263

249-
if (mAviStreamHeader.fccType == MLFOURCC_vids
264+
if (mAviStreamHeader.back().fccType == MLFOURCC_vids
250265
&& bytes == 40) {
251266
// BITMAPINFOHEADER
252267
if (40 != fread(&mImageFormat, 1, 40, mFp)) {

MLDX12VideoCapture/MLAviReader.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ class MLAviReader {
1818
const MLBitmapInfoHeader & ImageFormat(void) const { return mImageFormat; }
1919
int NumFrames(void) const { return (int)mImages.size(); }
2020

21-
int FramesPerSec(void) const { return mAviStreamHeader.dwRate; }
21+
int FramesPerSec(void) const {
22+
if (VideoStreamHeader()) { return VideoStreamHeader()->dwRate; }
23+
else { return 1; }
24+
}
2225

2326
float DurationSec(void) const;
2427

@@ -32,9 +35,11 @@ class MLAviReader {
3235
FILE *mFp;
3336

3437
MLAviMainHeader mAviMainHeader;
35-
MLAviStreamHeader mAviStreamHeader;
38+
std::vector<MLAviStreamHeader> mAviStreamHeader;
3639
MLBitmapInfoHeader mImageFormat;
3740

41+
const MLAviStreamHeader *VideoStreamHeader(void) const;
42+
3843
struct ImagePosBytes {
3944
int64_t pos;
4045
uint32_t bytes;

0 commit comments

Comments
 (0)