windows-nt/Source/XPSP1/NT/multimedia/media/avi/avifile/avigraph.c
2020-09-26 16:20:57 +08:00

129 lines
2.7 KiB
C

#include <win32.h>
#include <vfw.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;
AVISTREAMINFOW sinfo;
HRESULT hr;
sampStart = AVIStreamTimeToSample(ps, msStart);
sampEnd = AVIStreamTimeToSample(ps, msStart + ms);
AVIStreamInfoW(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;
}