@@ -18,10 +18,11 @@ MLAviReader::~MLAviReader(void)
1818float
1919MLAviReader::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
2728bool
@@ -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+
214227bool
215228MLAviReader::ReadAviMainHeader (void )
216229{
@@ -227,10 +240,12 @@ bool
227240MLAviReader::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 )) {
0 commit comments