if(sizehint != -1)
{
int i;
- Con_Printf("WARNING: invalid size hint %d when writing video data (actual size: %d)\n", (int) sizehint, x);
+ Con_Warnf("WARNING: invalid size hint %d when writing video data (actual size: %d)\n", (int) sizehint, x);
for(i = 0; i <= format->riffstacklevel; ++i)
{
Con_Printf(" RIFF level %d = %s\n", i, format->riffstackfourcc[i]);
{
LOAD_FORMATSPECIFIC_AVI();
if(!format->canseek)
- Host_Error("SCR_CaptureVideo_RIFF_IndexEntry called on non-seekable AVI");
+ Sys_Error("SCR_CaptureVideo_RIFF_IndexEntry called on non-seekable AVI");
if (format->riffstacklevel != 2)
Sys_Error("SCR_Capturevideo_RIFF_IndexEntry: RIFF stack level is %i (should be 2)\n", format->riffstacklevel);
fs_offset_t pos, sz;
if(!format->canseek)
- Host_Error("SCR_CaptureVideo_RIFF_MakeIxChunk called on non-seekable AVI");
+ Sys_Error("SCR_CaptureVideo_RIFF_MakeIxChunk called on non-seekable AVI");
if(*masteridx_count >= AVI_MASTER_INDEX_SIZE)
return;
static void SCR_CaptureVideo_RIFF_OverflowCheck(int framesize)
{
LOAD_FORMATSPECIFIC_AVI();
- fs_offset_t cursize, curfilesize;
+ fs_offset_t cursize;
+ //fs_offset_t curfilesize;
if (format->riffstacklevel != 2)
Sys_Error("SCR_CaptureVideo_RIFF_OverflowCheck: chunk stack leakage!\n");
// check where we are in the file
SCR_CaptureVideo_RIFF_Flush();
cursize = SCR_CaptureVideo_RIFF_GetPosition() - format->riffstackstartoffset[0];
- curfilesize = SCR_CaptureVideo_RIFF_GetPosition();
+ //curfilesize = SCR_CaptureVideo_RIFF_GetPosition();
// if this would overflow the windows limit of 1GB per RIFF chunk, we need
// to close the current RIFF chunk and open another for future frames
blockb = b[0];
*out = cls.capturevideo.yuvnormalizetable[0][cls.capturevideo.rgbtoyuvscaletable[0][0][blockr] + cls.capturevideo.rgbtoyuvscaletable[0][1][blockg] + cls.capturevideo.rgbtoyuvscaletable[0][2][blockb]];
}
- if ((y & 1) == 0)
+ if ((y & 1) == 0 && y/2 < height/2) // if h is odd, this skips the last row
{
// 2x2 Cr and Cb planes
int inpitch = width*4;
}
}
-void SCR_CaptureVideo_Avi_EndVideo()
+static void SCR_CaptureVideo_Avi_EndVideo(void)
{
LOAD_FORMATSPECIFIC_AVI();
Mem_Free(format);
}
-void SCR_CaptureVideo_Avi_SoundFrame(const portable_sampleframe_t *paintbuffer, size_t length)
+static void SCR_CaptureVideo_Avi_SoundFrame(const portable_sampleframe_t *paintbuffer, size_t length)
{
LOAD_FORMATSPECIFIC_AVI();
int x;
{
int n0, n1;
- n0 = paintbuffer[i].sample[0];
+ n0 = paintbuffer[i].sample[0] * 32768.0f;
n0 = bound(-32768, n0, 32767);
out_ptr[0] = (unsigned char)n0;
out_ptr[1] = (unsigned char)(n0 >> 8);
- n1 = paintbuffer[i].sample[1];
+ n1 = paintbuffer[i].sample[1] * 32768.0f;
n1 = bound(-32768, n1, 32767);
out_ptr[2] = (unsigned char)n1;
out_ptr[3] = (unsigned char)(n1 >> 8);
}
- x = length*4;
+ x = (int)length*4;
if(format->canseek)
{
SCR_CaptureVideo_RIFF_OverflowCheck(8 + x);
}
}
-void SCR_CaptureVideo_Avi_BeginVideo()
+void SCR_CaptureVideo_Avi_BeginVideo(void)
{
int width = cls.capturevideo.width;
int height = cls.capturevideo.height;
int n, d;
unsigned int i;
double aspect;
+ char vabuf[1024];
aspect = vid.width / (vid.height * vid_pixelheight.value);
cls.capturevideo.format = CAPTUREVIDEOFORMAT_AVI_I420;
cls.capturevideo.formatextension = "avi";
- cls.capturevideo.videofile = FS_OpenRealFile(va("%s.%s", cls.capturevideo.basename, cls.capturevideo.formatextension), "wb", false);
+ cls.capturevideo.videofile = FS_OpenRealFile(va(vabuf, sizeof(vabuf), "%s.%s", cls.capturevideo.basename, cls.capturevideo.formatextension), "wb", false);
cls.capturevideo.endvideo = SCR_CaptureVideo_Avi_EndVideo;
cls.capturevideo.videoframes = SCR_CaptureVideo_Avi_VideoFrames;
cls.capturevideo.soundframe = SCR_CaptureVideo_Avi_SoundFrame;
// 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);