#include #include "avifile.h" #include "debug.h" // !!! Note: doesn't take AVI File overhead into account // !!! Doesn't take padding into account! // AVIDataSize: // Calculates the amount of data in the given PAVISTREAM // from time msStart to msStart + ms LONG AVIDataSize(PAVISTREAM ps, LONG msStart, LONG ms) { LONG lBytes; LONG l; LONG sampStart; LONG sampEnd; LONG samp; AVISTREAMINFO sinfo; HRESULT hr; sampStart = AVIStreamTimeToSample(ps, msStart); sampEnd = AVIStreamTimeToSample(ps, msStart + ms); AVIStreamInfo(ps, &sinfo, sizeof(sinfo)); if (sinfo.dwSampleSize > 0) { hr = AVIStreamRead(ps, sampStart, sampEnd - sampStart, NULL, 0, &lBytes, &l); if (hr != NOERROR) return 0; if (l != sampEnd - sampStart) { DPF("Ack: wrong number of samples!\n"); } } else { lBytes = 0; for (samp = sampStart; samp < sampEnd; samp++) { hr = AVIStreamSampleSize(ps, samp, &l); if (hr != NOERROR) return 0; lBytes += l; } } return lBytes; } #define MAXSTREAMS 64 #define TIMEINT 250 #define TIMELEN 1000 STDAPI CalculateFileDataRate(PAVIFILE pf, LONG FAR *plMaxBytesPerSec) { PAVISTREAM aps[MAXSTREAMS]; LONG alMaxData[MAXSTREAMS]; AVIFILEINFO finfo; int stream; HRESULT hr; LONG msecLength = 0; LONG l; LONG lStart; LONG lDataSize; LONG lMaxDataSize = 0; AVIFileInfo(pf, &finfo, sizeof(finfo)); for (stream = 0; stream < (int) finfo.dwStreams; stream++) { hr = AVIFileGetStream(pf, &aps[stream], 0, stream); if (hr != NOERROR) { while (--stream >= 0) AVIStreamRelease(aps[stream]); return hr; } l = AVIStreamEndTime(aps[stream]); msecLength = max(l, msecLength); alMaxData[stream] = 0; } lStart = 0; DPF("Time\t\t\tData Rate\n"); do { lStart += TIMEINT; lDataSize = 0; for (stream = 0; stream < (int) finfo.dwStreams; stream++) { l = AVIDataSize(aps[stream], lStart, TIMELEN); lDataSize += l; alMaxData[stream] = max(alMaxData[stream], l); } lMaxDataSize = max(lDataSize, lMaxDataSize); #ifdef DEBUG if (lStart < 50 * TIMEINT) { // print at most 50 debug lines.... DPF("%lu\t\t\t%lu\n", lStart, muldiv32(lDataSize, 1000, TIMELEN)); } #endif } while (lStart < msecLength); *plMaxBytesPerSec = muldiv32(lMaxDataSize, 1000, TIMELEN); DPF("Max data rate for file: %ld\n", muldiv32(lMaxDataSize, 1000, TIMELEN)); for (stream = 0; stream < (int) finfo.dwStreams; stream++) { DPF("Max data rate for stream %u: %ld\n", stream, muldiv32(alMaxData[stream], 1000, TIMELEN)); AVIStreamRelease(aps[stream]); } return NOERROR; }