}
}
+static void SCR_CaptureVideo_RIFF_FlushNoIncrease(void)
+{
+ LOAD_FORMATSPECIFIC_AVI();
+ if (format->riffbuffer.cursize > 0)
+ {
+ if (!FS_Write(cls.capturevideo.videofile, format->riffbuffer.data, format->riffbuffer.cursize))
+ cls.capturevideo.error = true;
+ format->riffbuffer.cursize = 0;
+ format->riffbuffer.overflowed = false;
+ }
+}
+
static void SCR_CaptureVideo_RIFF_WriteBytes(const unsigned char *data, size_t size)
{
LOAD_FORMATSPECIFIC_AVI();
SCR_CaptureVideo_RIFF_Write32(((fs_offset_t) ix) >> 32);
SCR_CaptureVideo_RIFF_Write32(pos - ix);
SCR_CaptureVideo_RIFF_Write32(nMatching);
- SCR_CaptureVideo_RIFF_Flush();
+ SCR_CaptureVideo_RIFF_FlushNoIncrease();
}
if(FS_Seek(cls.capturevideo.videofile, masteridx_counter, SEEK_SET) >= 0)
{
SCR_CaptureVideo_RIFF_Write32(++*masteridx_count);
- SCR_CaptureVideo_RIFF_Flush();
+ SCR_CaptureVideo_RIFF_FlushNoIncrease();
}
FS_Seek(cls.capturevideo.videofile, 0, SEEK_END); // return value doesn't matter here
if(FS_Seek(cls.capturevideo.videofile, format->videofile_firstchunkframes_offset, SEEK_SET) >= 0)
{
SCR_CaptureVideo_RIFF_Write32(cls.capturevideo.frame);
- SCR_CaptureVideo_RIFF_Flush();
+ SCR_CaptureVideo_RIFF_FlushNoIncrease();
}
FS_Seek(cls.capturevideo.videofile, 0, SEEK_END);
format->videofile_firstchunkframes_offset = 0;
}
}
-void SCR_CaptureVideo_Avi_EndVideo()
+void SCR_CaptureVideo_Avi_EndVideo(void)
{
LOAD_FORMATSPECIFIC_AVI();
if(FS_Seek(cls.capturevideo.videofile, format->videofile_totalframes_offset1, SEEK_SET) >= 0)
{
SCR_CaptureVideo_RIFF_Write32(cls.capturevideo.frame);
- SCR_CaptureVideo_RIFF_Flush();
+ SCR_CaptureVideo_RIFF_FlushNoIncrease();
}
if(format->videofile_totalframes_offset2)
if(FS_Seek(cls.capturevideo.videofile, format->videofile_totalframes_offset2, SEEK_SET) >= 0)
{
SCR_CaptureVideo_RIFF_Write32(cls.capturevideo.frame);
- SCR_CaptureVideo_RIFF_Flush();
+ SCR_CaptureVideo_RIFF_FlushNoIncrease();
}
if (cls.capturevideo.soundrate)
{
if(FS_Seek(cls.capturevideo.videofile, format->videofile_totalsampleframes_offset, SEEK_SET) >= 0)
{
SCR_CaptureVideo_RIFF_Write32(cls.capturevideo.soundsampleframe);
- SCR_CaptureVideo_RIFF_Flush();
+ SCR_CaptureVideo_RIFF_FlushNoIncrease();
}
}
}
}
}
-void SCR_CaptureVideo_Avi_BeginVideo()
+void SCR_CaptureVideo_Avi_BeginVideo(void)
{
int width = cls.capturevideo.width;
int height = cls.capturevideo.height;
// AVI main header
SCR_CaptureVideo_RIFF_Push("LIST", "hdrl", format->canseek ? -1 : 8+56+12+(12+52+8+40+8+68)+(cls.capturevideo.soundrate?(12+12+52+8+18):0)+12+(8+4));
SCR_CaptureVideo_RIFF_Push("avih", NULL, 56);
- SCR_CaptureVideo_RIFF_Write32((int)(1000000.0 / cls.capturevideo.framerate)); // microseconds per frame
+ SCR_CaptureVideo_RIFF_Write32((int)(1000000.0 / (cls.capturevideo.framerate / cls.capturevideo.framestep))); // microseconds per frame
SCR_CaptureVideo_RIFF_Write32(0); // max bytes per second
SCR_CaptureVideo_RIFF_Write32(0); // padding granularity
SCR_CaptureVideo_RIFF_Write32(0x910); // flags (AVIF_HASINDEX | AVIF_ISINTERLEAVED | AVIF_TRUSTCKTYPE)
SCR_CaptureVideo_RIFF_Write16(0); // language
SCR_CaptureVideo_RIFF_Write32(0); // initial frames
// find an ideal divisor for the framerate
- FindFraction(cls.capturevideo.framerate, &n, &d, 1000);
+ FindFraction(cls.capturevideo.framerate / cls.capturevideo.framestep, &n, &d, 1000);
SCR_CaptureVideo_RIFF_Write32(d); // samples/second divisor
SCR_CaptureVideo_RIFF_Write32(n); // samples/second multiplied by divisor
SCR_CaptureVideo_RIFF_Write32(0); // start
SCR_CaptureVideo_RIFF_Push("vprp", NULL, 68);
SCR_CaptureVideo_RIFF_Write32(0); // VideoFormatToken
SCR_CaptureVideo_RIFF_Write32(0); // VideoStandard
- SCR_CaptureVideo_RIFF_Write32((int)cls.capturevideo.framerate); // dwVerticalRefreshRate (bogus)
+ SCR_CaptureVideo_RIFF_Write32((int)(cls.capturevideo.framerate / cls.capturevideo.framestep)); // dwVerticalRefreshRate (bogus)
SCR_CaptureVideo_RIFF_Write32(width); // dwHTotalInT
SCR_CaptureVideo_RIFF_Write32(height); // dwVTotalInLines
FindFraction(aspect, &n, &d, 1000);