DarkPlaces
Game engine based on the Quake 1 engine by id Software, developed by LadyHavoc
 
cap_avi.c File Reference
#include "quakedef.h"
#include "cap_avi.h"
+ Include dependency graph for cap_avi.c:

Go to the source code of this file.

Data Structures

struct  capturevideostate_avi_formatspecific_t
 

Macros

#define AVI_MASTER_INDEX_SIZE   640
 
#define LOAD_FORMATSPECIFIC_AVI()
 

Functions

static void GrowBuf (sizebuf_t *buf, int extralen)
 
void SCR_CaptureVideo_Avi_BeginVideo (void)
 
static void SCR_CaptureVideo_Avi_EndVideo (void)
 
static void SCR_CaptureVideo_Avi_SoundFrame (const portable_sampleframe_t *paintbuffer, size_t length)
 
static void SCR_CaptureVideo_Avi_VideoFrames (int num, u8 *in)
 
static void SCR_CaptureVideo_ConvertFrame_BGRA_to_I420_flip (int width, int height, unsigned char *instart, unsigned char *outstart)
 
static void SCR_CaptureVideo_RIFF_Finish (qbool final)
 
static void SCR_CaptureVideo_RIFF_Flush (void)
 
static void SCR_CaptureVideo_RIFF_FlushNoIncrease (void)
 
static fs_offset_t SCR_CaptureVideo_RIFF_GetPosition (void)
 
static void SCR_CaptureVideo_RIFF_IndexEntry (const char *chunkfourcc, int chunksize, int flags)
 
static void SCR_CaptureVideo_RIFF_MakeIxChunk (const char *fcc, const char *dwChunkId, fs_offset_t masteridx_counter, int *masteridx_count, fs_offset_t masteridx_start)
 
static void SCR_CaptureVideo_RIFF_OverflowCheck (int framesize)
 
static void SCR_CaptureVideo_RIFF_Pop (void)
 
static void SCR_CaptureVideo_RIFF_Push (const char *chunkfourcc, const char *listtypefourcc, fs_offset_t sizeHint)
 
static void SCR_CaptureVideo_RIFF_Start (void)
 
static void SCR_CaptureVideo_RIFF_Write16 (int n)
 
static void SCR_CaptureVideo_RIFF_Write32 (int n)
 
static void SCR_CaptureVideo_RIFF_WriteBytes (const unsigned char *data, size_t size)
 
static void SCR_CaptureVideo_RIFF_WriteFourCC (const char *chunkfourcc)
 
static void SCR_CaptureVideo_RIFF_WriteTerminatedString (const char *string)
 

Macro Definition Documentation

◆ AVI_MASTER_INDEX_SIZE

#define AVI_MASTER_INDEX_SIZE   640

Definition at line 4 of file cap_avi.c.

Referenced by SCR_CaptureVideo_Avi_BeginVideo(), and SCR_CaptureVideo_RIFF_MakeIxChunk().

◆ LOAD_FORMATSPECIFIC_AVI

Function Documentation

◆ GrowBuf()

static void GrowBuf ( sizebuf_t * buf,
int extralen )
static

Definition at line 170 of file cap_avi.c.

171{
172 if(buf->cursize + extralen > buf->maxsize)
173 {
174 int oldsize = buf->maxsize;
175 unsigned char *olddata;
176 olddata = buf->data;
177 buf->maxsize = max(buf->maxsize * 2, 4096);
178 buf->data = (unsigned char *) Mem_Alloc(tempmempool, buf->maxsize);
179 if(olddata)
180 {
181 memcpy(buf->data, olddata, oldsize);
183 }
184 }
185}
static unsigned char olddata[NET_MAXMESSAGE]
Definition cl_parse.c:313
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition glquake.h:657
#define max(A, B)
Definition mathlib.h:38
mempool_t * tempmempool
Definition zone.c:794
#define Mem_Free(mem)
Definition zone.h:96
#define Mem_Alloc(pool, size)
Definition zone.h:92

References buf, max, Mem_Alloc, Mem_Free, olddata, and tempmempool.

Referenced by SCR_CaptureVideo_RIFF_IndexEntry().

◆ SCR_CaptureVideo_Avi_BeginVideo()

void SCR_CaptureVideo_Avi_BeginVideo ( void )

Definition at line 496 of file cap_avi.c.

497{
498 int width = cls.capturevideo.width;
499 int height = cls.capturevideo.height;
500 int n, d;
501 unsigned int i;
502 double aspect;
503 char vabuf[1024];
504
506
507 cls.capturevideo.format = CAPTUREVIDEOFORMAT_AVI_I420;
508 cls.capturevideo.formatextension = "avi";
509 cls.capturevideo.videofile = FS_OpenRealFile(va(vabuf, sizeof(vabuf), "%s.%s", cls.capturevideo.basename, cls.capturevideo.formatextension), "wb", false);
510 if (!cls.capturevideo.videofile)
511 {
512 Con_Printf(CON_ERROR "Failed to open video file \"%s\", cancelling video capture.\n", vabuf);
513 cls.capturevideo.error = true;
514 return;
515 }
516 cls.capturevideo.writeEndVideo = SCR_CaptureVideo_Avi_EndVideo;
517 cls.capturevideo.writeVideoFrame = SCR_CaptureVideo_Avi_VideoFrames;
518 cls.capturevideo.writeSoundFrame = SCR_CaptureVideo_Avi_SoundFrame;
519 cls.capturevideo.formatspecific = Mem_Alloc(tempmempool, sizeof(capturevideostate_avi_formatspecific_t));
520 {
522 format->canseek = (FS_Seek(cls.capturevideo.videofile, 0, SEEK_SET) == 0);
524 // enclosing RIFF chunk (there can be multiple of these in >1GB files, the later ones are "AVIX" instead of "AVI " and have no header/stream info)
525 SCR_CaptureVideo_RIFF_Push("RIFF", "AVI ", format->canseek ? -1 : 12+(8+56+12+(12+52+8+40+8+68)+(cls.capturevideo.soundrate?(12+12+52+8+18):0)+12+(8+4))+12+(8+(((int) strlen(engineversion) | 1) + 1))+12);
526 // AVI main header
527 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));
528 SCR_CaptureVideo_RIFF_Push("avih", NULL, 56);
529 SCR_CaptureVideo_RIFF_Write32((int)(1000000.0 / (cls.capturevideo.framerate / cls.capturevideo.framestep))); // microseconds per frame
530 SCR_CaptureVideo_RIFF_Write32(0); // max bytes per second
531 SCR_CaptureVideo_RIFF_Write32(0); // padding granularity
532 SCR_CaptureVideo_RIFF_Write32(0x910); // flags (AVIF_HASINDEX | AVIF_ISINTERLEAVED | AVIF_TRUSTCKTYPE)
533 format->videofile_firstchunkframes_offset = SCR_CaptureVideo_RIFF_GetPosition();
534 SCR_CaptureVideo_RIFF_Write32(0); // total frames
535 SCR_CaptureVideo_RIFF_Write32(0); // initial frames
536 if (cls.capturevideo.soundrate)
537 SCR_CaptureVideo_RIFF_Write32(2); // number of streams
538 else
539 SCR_CaptureVideo_RIFF_Write32(1); // number of streams
540 SCR_CaptureVideo_RIFF_Write32(0); // suggested buffer size
543 SCR_CaptureVideo_RIFF_Write32(0); // reserved[0]
544 SCR_CaptureVideo_RIFF_Write32(0); // reserved[1]
545 SCR_CaptureVideo_RIFF_Write32(0); // reserved[2]
546 SCR_CaptureVideo_RIFF_Write32(0); // reserved[3]
548 // video stream info
549 SCR_CaptureVideo_RIFF_Push("LIST", "strl", format->canseek ? -1 : 12+52+8+40+8+68);
550 SCR_CaptureVideo_RIFF_Push("strh", "vids", 52);
551 SCR_CaptureVideo_RIFF_WriteFourCC("I420"); // stream fourcc (I420 colorspace, uncompressed)
553 SCR_CaptureVideo_RIFF_Write16(0); // priority
554 SCR_CaptureVideo_RIFF_Write16(0); // language
555 SCR_CaptureVideo_RIFF_Write32(0); // initial frames
556 // find an ideal divisor for the framerate
557 FindFraction(cls.capturevideo.framerate / cls.capturevideo.framestep, &n, &d, 1000);
558 SCR_CaptureVideo_RIFF_Write32(d); // samples/second divisor
559 SCR_CaptureVideo_RIFF_Write32(n); // samples/second multiplied by divisor
561 format->videofile_totalframes_offset1 = SCR_CaptureVideo_RIFF_GetPosition();
562 SCR_CaptureVideo_RIFF_Write32(0xFFFFFFFF); // length
563 SCR_CaptureVideo_RIFF_Write32(width*height+(width/2)*(height/2)*2); // suggested buffer size
564 SCR_CaptureVideo_RIFF_Write32(0); // quality
565 SCR_CaptureVideo_RIFF_Write32(0); // sample size
566 SCR_CaptureVideo_RIFF_Write16(0); // frame left
567 SCR_CaptureVideo_RIFF_Write16(0); // frame top
568 SCR_CaptureVideo_RIFF_Write16(width); // frame right
569 SCR_CaptureVideo_RIFF_Write16(height); // frame bottom
571 // video stream format
572 SCR_CaptureVideo_RIFF_Push("strf", NULL, 40);
573 SCR_CaptureVideo_RIFF_Write32(40); // BITMAPINFO struct size
577 SCR_CaptureVideo_RIFF_Write16(12); // bitcount
578 SCR_CaptureVideo_RIFF_WriteFourCC("I420"); // compression
579 SCR_CaptureVideo_RIFF_Write32(width*height+(width/2)*(height/2)*2); // size of image
580 SCR_CaptureVideo_RIFF_Write32(0); // x pixels per meter
581 SCR_CaptureVideo_RIFF_Write32(0); // y pixels per meter
582 SCR_CaptureVideo_RIFF_Write32(0); // color used
583 SCR_CaptureVideo_RIFF_Write32(0); // color important
585 // master index
586 if(format->canseek)
587 {
588 SCR_CaptureVideo_RIFF_Push("indx", NULL, -1);
589 SCR_CaptureVideo_RIFF_Write16(4); // wLongsPerEntry
590 SCR_CaptureVideo_RIFF_Write16(0); // bIndexSubType=0, bIndexType=0
591 format->videofile_ix_master_video_inuse_offset = SCR_CaptureVideo_RIFF_GetPosition();
592 SCR_CaptureVideo_RIFF_Write32(0); // nEntriesInUse
593 SCR_CaptureVideo_RIFF_WriteFourCC("00dc"); // dwChunkId
594 SCR_CaptureVideo_RIFF_Write32(0); // dwReserved1
595 SCR_CaptureVideo_RIFF_Write32(0); // dwReserved2
596 SCR_CaptureVideo_RIFF_Write32(0); // dwReserved3
597 format->videofile_ix_master_video_start_offset = SCR_CaptureVideo_RIFF_GetPosition();
598 for(i = 0; i < AVI_MASTER_INDEX_SIZE * 4; ++i)
599 SCR_CaptureVideo_RIFF_Write32(0); // fill up later
601 }
602 // extended format (aspect!)
603 SCR_CaptureVideo_RIFF_Push("vprp", NULL, 68);
604 SCR_CaptureVideo_RIFF_Write32(0); // VideoFormatToken
605 SCR_CaptureVideo_RIFF_Write32(0); // VideoStandard
606 SCR_CaptureVideo_RIFF_Write32((int)(cls.capturevideo.framerate / cls.capturevideo.framestep)); // dwVerticalRefreshRate (bogus)
607 SCR_CaptureVideo_RIFF_Write32(width); // dwHTotalInT
608 SCR_CaptureVideo_RIFF_Write32(height); // dwVTotalInLines
609 FindFraction(aspect, &n, &d, 1000);
610 SCR_CaptureVideo_RIFF_Write32((n << 16) | d); // dwFrameAspectRatio // TODO a word
611 SCR_CaptureVideo_RIFF_Write32(width); // dwFrameWidthInPixels
612 SCR_CaptureVideo_RIFF_Write32(height); // dwFrameHeightInLines
613 SCR_CaptureVideo_RIFF_Write32(1); // nFieldPerFrame
614 SCR_CaptureVideo_RIFF_Write32(width); // CompressedBMWidth
615 SCR_CaptureVideo_RIFF_Write32(height); // CompressedBMHeight
616 SCR_CaptureVideo_RIFF_Write32(width); // ValidBMHeight
617 SCR_CaptureVideo_RIFF_Write32(height); // ValidBMWidth
618 SCR_CaptureVideo_RIFF_Write32(0); // ValidBMXOffset
619 SCR_CaptureVideo_RIFF_Write32(0); // ValidBMYOffset
620 SCR_CaptureVideo_RIFF_Write32(0); // ValidBMXOffsetInT
621 SCR_CaptureVideo_RIFF_Write32(0); // ValidBMYValidStartLine
624 if (cls.capturevideo.soundrate)
625 {
626 // audio stream info
627 SCR_CaptureVideo_RIFF_Push("LIST", "strl", format->canseek ? -1 : 12+52+8+18);
628 SCR_CaptureVideo_RIFF_Push("strh", "auds", 52);
629 SCR_CaptureVideo_RIFF_Write32(1); // stream fourcc (PCM audio, uncompressed)
631 SCR_CaptureVideo_RIFF_Write16(0); // priority
632 SCR_CaptureVideo_RIFF_Write16(0); // language
633 SCR_CaptureVideo_RIFF_Write32(0); // initial frames
634 SCR_CaptureVideo_RIFF_Write32(1); // samples/second divisor
635 SCR_CaptureVideo_RIFF_Write32((int)(cls.capturevideo.soundrate)); // samples/second multiplied by divisor
637 format->videofile_totalsampleframes_offset = SCR_CaptureVideo_RIFF_GetPosition();
638 SCR_CaptureVideo_RIFF_Write32(0xFFFFFFFF); // length
639 SCR_CaptureVideo_RIFF_Write32(cls.capturevideo.soundrate * 2); // suggested buffer size (this is a half second)
640 SCR_CaptureVideo_RIFF_Write32(0); // quality
641 SCR_CaptureVideo_RIFF_Write32(4); // sample size
642 SCR_CaptureVideo_RIFF_Write16(0); // frame left
643 SCR_CaptureVideo_RIFF_Write16(0); // frame top
644 SCR_CaptureVideo_RIFF_Write16(0); // frame right
645 SCR_CaptureVideo_RIFF_Write16(0); // frame bottom
647 // audio stream format
648 SCR_CaptureVideo_RIFF_Push("strf", NULL, 18);
649 SCR_CaptureVideo_RIFF_Write16(1); // format (uncompressed PCM?)
650 SCR_CaptureVideo_RIFF_Write16(2); // channels (stereo)
651 SCR_CaptureVideo_RIFF_Write32(cls.capturevideo.soundrate); // sampleframes per second
652 SCR_CaptureVideo_RIFF_Write32(cls.capturevideo.soundrate * 4); // average bytes per second
653 SCR_CaptureVideo_RIFF_Write16(4); // block align
654 SCR_CaptureVideo_RIFF_Write16(16); // bits per sample
657 // master index
658 if(format->canseek)
659 {
660 SCR_CaptureVideo_RIFF_Push("indx", NULL, -1);
661 SCR_CaptureVideo_RIFF_Write16(4); // wLongsPerEntry
662 SCR_CaptureVideo_RIFF_Write16(0); // bIndexSubType=0, bIndexType=0
663 format->videofile_ix_master_audio_inuse_offset = SCR_CaptureVideo_RIFF_GetPosition();
664 SCR_CaptureVideo_RIFF_Write32(0); // nEntriesInUse
665 SCR_CaptureVideo_RIFF_WriteFourCC("01wb"); // dwChunkId
666 SCR_CaptureVideo_RIFF_Write32(0); // dwReserved1
667 SCR_CaptureVideo_RIFF_Write32(0); // dwReserved2
668 SCR_CaptureVideo_RIFF_Write32(0); // dwReserved3
669 format->videofile_ix_master_audio_start_offset = SCR_CaptureVideo_RIFF_GetPosition();
670 for(i = 0; i < AVI_MASTER_INDEX_SIZE * 4; ++i)
671 SCR_CaptureVideo_RIFF_Write32(0); // fill up later
673 }
675 }
676
677 format->videofile_ix_master_audio_inuse = format->videofile_ix_master_video_inuse = 0;
678
679 // extended header (for total #frames)
680 SCR_CaptureVideo_RIFF_Push("LIST", "odml", 8+4);
682 format->videofile_totalframes_offset2 = SCR_CaptureVideo_RIFF_GetPosition();
686
687 // close the AVI header list
689 // software that produced this AVI video file
690 SCR_CaptureVideo_RIFF_Push("LIST", "INFO", 8+((strlen(engineversion) | 1) + 1));
694 // enable this junk filler if you like the LIST movi to always begin at 4KB in the file (why?)
695#if 0
698 while (x > 0)
699 {
700 const char *junkfiller = "[ DarkPlaces junk data ]";
701 int i = min(x, (int)strlen(junkfiller));
702 SCR_CaptureVideo_RIFF_WriteBytes((const unsigned char *)junkfiller, i);
703 x -= i;
704 }
706#endif
708 // begin the actual video section now
709 SCR_CaptureVideo_RIFF_Push("LIST", "movi", format->canseek ? -1 : 0);
710 format->videofile_ix_movistart = format->riffstackstartoffset[1];
711 // we're done with the headers now...
713 if (format->riffstacklevel != 2)
714 Sys_Error("SCR_CaptureVideo_BeginVideo: broken AVI writing code (stack level is %i (should be 2) at end of headers)\n", format->riffstacklevel);
715
716 if(!format->canseek)
717 {
718 // close the movi immediately
720 // close the AVI immediately (we'll put all frames into AVIX)
722 }
723 }
724}
static void SCR_CaptureVideo_RIFF_WriteFourCC(const char *chunkfourcc)
Definition cap_avi.c:92
static void SCR_CaptureVideo_Avi_VideoFrames(int num, u8 *in)
Definition cap_avi.c:373
static void SCR_CaptureVideo_RIFF_Write32(int n)
Definition cap_avi.c:76
static void SCR_CaptureVideo_RIFF_WriteTerminatedString(const char *string)
Definition cap_avi.c:100
static void SCR_CaptureVideo_RIFF_Pop(void)
Definition cap_avi.c:132
static void SCR_CaptureVideo_RIFF_Start(void)
Definition cap_avi.c:33
#define LOAD_FORMATSPECIFIC_AVI()
Definition cap_avi.c:31
static fs_offset_t SCR_CaptureVideo_RIFF_GetPosition(void)
Definition cap_avi.c:108
static void SCR_CaptureVideo_Avi_EndVideo(void)
Definition cap_avi.c:405
static void SCR_CaptureVideo_RIFF_Flush(void)
Definition cap_avi.c:42
static void SCR_CaptureVideo_RIFF_WriteBytes(const unsigned char *data, size_t size)
Definition cap_avi.c:67
static void SCR_CaptureVideo_RIFF_Write16(int n)
Definition cap_avi.c:84
#define AVI_MASTER_INDEX_SIZE
Definition cap_avi.c:4
static void SCR_CaptureVideo_Avi_SoundFrame(const portable_sampleframe_t *paintbuffer, size_t length)
Definition cap_avi.c:450
static void SCR_CaptureVideo_RIFF_Push(const char *chunkfourcc, const char *listtypefourcc, fs_offset_t sizeHint)
Definition cap_avi.c:116
cvar_t vid_pixelheight
Definition cl_screen.c:58
char * va(char *buf, size_t buflen, const char *format,...)
Definition common.c:972
void FindFraction(double val, int *num, int *denom, int denomMax)
Definition common.c:1436
void Con_Printf(const char *fmt,...)
Prints to all appropriate console targets.
Definition console.c:1514
#define CON_ERROR
Definition console.h:102
char engineversion[128]
version string for the corner of the console, crash messages, status command, etc
Definition host.c:304
#define n(x, y)
int FS_Seek(qfile_t *file, fs_offset_t offset, int whence)
Definition fs.c:3359
qfile_t * FS_OpenRealFile(const char *filepath, const char *mode, qbool quiet)
Definition fs.c:2901
GLenum GLsizei width
Definition glquake.h:622
GLenum GLsizei GLsizei height
Definition glquake.h:622
GLint GLenum GLint x
Definition glquake.h:651
#define min(A, B)
Definition mathlib.h:37
float strlen(string s)
int i
#define NULL
Definition qtypes.h:12
float value
Definition cvar.h:74
int width
Definition vid.h:60
int height
Definition vid.h:61
viddef_mode_t mode
currently active video mode
Definition vid.h:73
void Sys_Error(const char *error,...) DP_FUNC_PRINTF(1) DP_FUNC_NORETURN
Causes the entire program to exit ASAP.
Definition sys_shared.c:724
viddef_t vid
global video state
Definition vid_shared.c:64

References AVI_MASTER_INDEX_SIZE, cls, CON_ERROR, Con_Printf(), engineversion, FindFraction(), format, FS_OpenRealFile(), FS_Seek(), height, viddef_mode_t::height, i, LOAD_FORMATSPECIFIC_AVI, Mem_Alloc, min, viddef_t::mode, n, NULL, SCR_CaptureVideo_Avi_EndVideo(), SCR_CaptureVideo_Avi_SoundFrame(), SCR_CaptureVideo_Avi_VideoFrames(), SCR_CaptureVideo_RIFF_Flush(), SCR_CaptureVideo_RIFF_GetPosition(), SCR_CaptureVideo_RIFF_Pop(), SCR_CaptureVideo_RIFF_Push(), SCR_CaptureVideo_RIFF_Start(), SCR_CaptureVideo_RIFF_Write16(), SCR_CaptureVideo_RIFF_Write32(), SCR_CaptureVideo_RIFF_WriteBytes(), SCR_CaptureVideo_RIFF_WriteFourCC(), SCR_CaptureVideo_RIFF_WriteTerminatedString(), strlen(), Sys_Error(), tempmempool, va(), cvar_t::value, vid, vid_pixelheight, viddef_mode_t::width, width, and x.

◆ SCR_CaptureVideo_Avi_EndVideo()

static void SCR_CaptureVideo_Avi_EndVideo ( void )
static

Definition at line 405 of file cap_avi.c.

406{
408
409 if(format->canseek)
410 {
411 // close any open chunks
413
414 // go back and fix the video frames and audio samples fields
415 if(format->videofile_totalframes_offset1)
416 if(FS_Seek(cls.capturevideo.videofile, format->videofile_totalframes_offset1, SEEK_SET) >= 0)
417 {
418 SCR_CaptureVideo_RIFF_Write32(cls.capturevideo.frame);
420 }
421 if(format->videofile_totalframes_offset2)
422 if(FS_Seek(cls.capturevideo.videofile, format->videofile_totalframes_offset2, SEEK_SET) >= 0)
423 {
424 SCR_CaptureVideo_RIFF_Write32(cls.capturevideo.frame);
426 }
427 if (cls.capturevideo.soundrate)
428 {
429 if(format->videofile_totalsampleframes_offset)
430 if(FS_Seek(cls.capturevideo.videofile, format->videofile_totalsampleframes_offset, SEEK_SET) >= 0)
431 {
432 SCR_CaptureVideo_RIFF_Write32(cls.capturevideo.soundsampleframe);
434 }
435 }
436 }
437
438 if (format->riffindexbuffer.data)
439 {
440 Mem_Free(format->riffindexbuffer.data);
441 format->riffindexbuffer.data = NULL;
442 }
443
444 FS_Close(cls.capturevideo.videofile);
445 cls.capturevideo.videofile = NULL;
446
448}
static void SCR_CaptureVideo_RIFF_FlushNoIncrease(void)
Definition cap_avi.c:55
static void SCR_CaptureVideo_RIFF_Finish(qbool final)
Definition cap_avi.c:272
int FS_Close(qfile_t *file)
Definition fs.c:2970

References cls, format, FS_Close(), FS_Seek(), LOAD_FORMATSPECIFIC_AVI, Mem_Free, NULL, SCR_CaptureVideo_RIFF_Finish(), SCR_CaptureVideo_RIFF_FlushNoIncrease(), and SCR_CaptureVideo_RIFF_Write32().

Referenced by SCR_CaptureVideo_Avi_BeginVideo().

◆ SCR_CaptureVideo_Avi_SoundFrame()

static void SCR_CaptureVideo_Avi_SoundFrame ( const portable_sampleframe_t * paintbuffer,
size_t length )
static

Definition at line 450 of file cap_avi.c.

451{
453 int x;
454 unsigned char bufstereo16le[PAINTBUFFER_SIZE * 4];
455 unsigned char* out_ptr;
456 size_t i;
457
458 // write the sound buffer as little endian 16bit interleaved stereo
459 for(i = 0, out_ptr = bufstereo16le; i < length; i++, out_ptr += 4)
460 {
461 int n0, n1;
462
463 n0 = paintbuffer[i].sample[0] * 32768.0f;
464 n0 = bound(-32768, n0, 32767);
465 out_ptr[0] = (unsigned char)n0;
466 out_ptr[1] = (unsigned char)(n0 >> 8);
467
468 n1 = paintbuffer[i].sample[1] * 32768.0f;
469 n1 = bound(-32768, n1, 32767);
470 out_ptr[2] = (unsigned char)n1;
471 out_ptr[3] = (unsigned char)(n1 >> 8);
472 }
473
474 x = (int)length*4;
475 if(format->canseek)
476 {
478 SCR_CaptureVideo_RIFF_IndexEntry("01wb", x, 0x10); // AVIIF_KEYFRAME
479 }
480
481 if(!format->canseek)
482 {
483 SCR_CaptureVideo_RIFF_Push("RIFF", "AVIX", 12+8+x);
484 SCR_CaptureVideo_RIFF_Push("LIST", "movi", 8+x);
485 }
487 SCR_CaptureVideo_RIFF_WriteBytes(bufstereo16le, x);
489 if(!format->canseek)
490 {
493 }
494}
static void SCR_CaptureVideo_RIFF_OverflowCheck(int framesize)
Definition cap_avi.c:309
static void SCR_CaptureVideo_RIFF_IndexEntry(const char *chunkfourcc, int chunksize, int flags)
Definition cap_avi.c:187
static int(ZEXPORT *qz_inflate)(z_stream *strm
GLenum GLuint GLenum GLsizei length
Definition glquake.h:657
#define bound(min, num, max)
Definition mathlib.h:34
#define PAINTBUFFER_SIZE
Definition qdefs.h:151
static portable_sampleframe_t paintbuffer[PAINTBUFFER_SIZE]
Definition snd_mix.c:26
float sample[SND_LISTENERS]
Definition snd_main.h:197

References bound, format, i, int(), length, LOAD_FORMATSPECIFIC_AVI, NULL, paintbuffer, PAINTBUFFER_SIZE, portable_sampleframe_t::sample, SCR_CaptureVideo_RIFF_IndexEntry(), SCR_CaptureVideo_RIFF_OverflowCheck(), SCR_CaptureVideo_RIFF_Pop(), SCR_CaptureVideo_RIFF_Push(), SCR_CaptureVideo_RIFF_WriteBytes(), and x.

Referenced by SCR_CaptureVideo_Avi_BeginVideo().

◆ SCR_CaptureVideo_Avi_VideoFrames()

static void SCR_CaptureVideo_Avi_VideoFrames ( int num,
u8 * in )
static

Definition at line 373 of file cap_avi.c.

374{
376 int x = 0, width = cls.capturevideo.width, height = cls.capturevideo.height;
377 unsigned char *out = cls.capturevideo.outbuffer;
378
380 x = width*height+(width/2)*(height/2)*2;
381 while(num-- > 0)
382 {
383 if(format->canseek)
384 {
386 SCR_CaptureVideo_RIFF_IndexEntry("00dc", x, 0x10); // AVIIF_KEYFRAME
387 }
388
389 if(!format->canseek)
390 {
391 SCR_CaptureVideo_RIFF_Push("RIFF", "AVIX", 12+8+x);
392 SCR_CaptureVideo_RIFF_Push("LIST", "movi", 8+x);
393 }
397 if(!format->canseek)
398 {
401 }
402 }
403}
static void SCR_CaptureVideo_ConvertFrame_BGRA_to_I420_flip(int width, int height, unsigned char *instart, unsigned char *outstart)
Definition cap_avi.c:338

References cls, format, height, LOAD_FORMATSPECIFIC_AVI, NULL, SCR_CaptureVideo_ConvertFrame_BGRA_to_I420_flip(), SCR_CaptureVideo_RIFF_IndexEntry(), SCR_CaptureVideo_RIFF_OverflowCheck(), SCR_CaptureVideo_RIFF_Pop(), SCR_CaptureVideo_RIFF_Push(), SCR_CaptureVideo_RIFF_WriteBytes(), width, and x.

Referenced by SCR_CaptureVideo_Avi_BeginVideo().

◆ SCR_CaptureVideo_ConvertFrame_BGRA_to_I420_flip()

static void SCR_CaptureVideo_ConvertFrame_BGRA_to_I420_flip ( int width,
int height,
unsigned char * instart,
unsigned char * outstart )
static

Definition at line 338 of file cap_avi.c.

339{
340 int x, y;
341 int blockr, blockg, blockb;
342 int outoffset = (width/2)*(height/2);
343 unsigned char *b, *out;
344 // process one line at a time, and CbCr every other line at 2 pixel intervals
345 for (y = 0;y < height;y++)
346 {
347 // 1x1 Y
348 for (b = instart + (height-1-y)*width*4, out = outstart + y*width, x = 0;x < width;x++, b += 4, out++)
349 {
350 blockr = b[2];
351 blockg = b[1];
352 blockb = b[0];
353 *out = cls.capturevideo.yuvnormalizetable[0][cls.capturevideo.rgbtoyuvscaletable[0][0][blockr] + cls.capturevideo.rgbtoyuvscaletable[0][1][blockg] + cls.capturevideo.rgbtoyuvscaletable[0][2][blockb]];
354 }
355 if ((y & 1) == 0 && y/2 < height/2) // if h is odd, this skips the last row
356 {
357 // 2x2 Cr and Cb planes
358 int inpitch = width*4;
359 for (b = instart + (height-2-y)*width*4, out = outstart + width*height + (y/2)*(width/2), x = 0;x < width/2;x++, b += 8, out++)
360 {
361 blockr = (b[2] + b[6] + b[inpitch+2] + b[inpitch+6]) >> 2;
362 blockg = (b[1] + b[5] + b[inpitch+1] + b[inpitch+5]) >> 2;
363 blockb = (b[0] + b[4] + b[inpitch+0] + b[inpitch+4]) >> 2;
364 // Cr
365 out[0 ] = cls.capturevideo.yuvnormalizetable[1][cls.capturevideo.rgbtoyuvscaletable[1][0][blockr] + cls.capturevideo.rgbtoyuvscaletable[1][1][blockg] + cls.capturevideo.rgbtoyuvscaletable[1][2][blockb] + 128];
366 // Cb
367 out[outoffset] = cls.capturevideo.yuvnormalizetable[2][cls.capturevideo.rgbtoyuvscaletable[2][0][blockr] + cls.capturevideo.rgbtoyuvscaletable[2][1][blockg] + cls.capturevideo.rgbtoyuvscaletable[2][2][blockb] + 128];
368 }
369 }
370 }
371}
GLint GLenum GLint GLint y
Definition glquake.h:651
dp_FragColor b

References b, cls, height, width, x, and y.

Referenced by SCR_CaptureVideo_Avi_VideoFrames().

◆ SCR_CaptureVideo_RIFF_Finish()

static void SCR_CaptureVideo_RIFF_Finish ( qbool final)
static

Definition at line 272 of file cap_avi.c.

273{
275 // close the "movi" list
277 if(format->videofile_ix_master_video_inuse_offset)
278 SCR_CaptureVideo_RIFF_MakeIxChunk("ix00", "00dc", format->videofile_ix_master_video_inuse_offset, &format->videofile_ix_master_video_inuse, format->videofile_ix_master_video_start_offset);
279 if(format->videofile_ix_master_audio_inuse_offset)
280 SCR_CaptureVideo_RIFF_MakeIxChunk("ix01", "01wb", format->videofile_ix_master_audio_inuse_offset, &format->videofile_ix_master_audio_inuse, format->videofile_ix_master_audio_start_offset);
281 // write the idx1 chunk that we've been building while saving the frames (for old style players)
282 if(final && format->videofile_firstchunkframes_offset)
283 // TODO replace index creating by OpenDML ix##/##ix/indx chunk so it works for more than one AVI part too
284 {
285 SCR_CaptureVideo_RIFF_Push("idx1", NULL, format->riffindexbuffer.cursize);
286 SCR_CaptureVideo_RIFF_WriteBytes(format->riffindexbuffer.data, format->riffindexbuffer.cursize);
288 }
289 format->riffindexbuffer.cursize = 0;
290 // pop the RIFF chunk itself
291 while (format->riffstacklevel > 0)
294 if(format->videofile_firstchunkframes_offset)
295 {
296 Con_DPrintf("Finishing first chunk (%d frames)\n", cls.capturevideo.frame);
297 if(FS_Seek(cls.capturevideo.videofile, format->videofile_firstchunkframes_offset, SEEK_SET) >= 0)
298 {
299 SCR_CaptureVideo_RIFF_Write32(cls.capturevideo.frame);
301 }
302 FS_Seek(cls.capturevideo.videofile, 0, SEEK_END);
303 format->videofile_firstchunkframes_offset = 0;
304 }
305 else
306 Con_DPrintf("Finishing another chunk (%d frames)\n", cls.capturevideo.frame);
307}
static void SCR_CaptureVideo_RIFF_MakeIxChunk(const char *fcc, const char *dwChunkId, fs_offset_t masteridx_counter, int *masteridx_count, fs_offset_t masteridx_start)
Definition cap_avi.c:203
void Con_DPrintf(const char *fmt,...)
A Con_Printf that only shows up if the "developer" cvar is set.
Definition console.c:1544

References cls, Con_DPrintf(), format, FS_Seek(), LOAD_FORMATSPECIFIC_AVI, NULL, SCR_CaptureVideo_RIFF_Flush(), SCR_CaptureVideo_RIFF_FlushNoIncrease(), SCR_CaptureVideo_RIFF_MakeIxChunk(), SCR_CaptureVideo_RIFF_Pop(), SCR_CaptureVideo_RIFF_Push(), SCR_CaptureVideo_RIFF_Write32(), and SCR_CaptureVideo_RIFF_WriteBytes().

Referenced by SCR_CaptureVideo_Avi_EndVideo(), and SCR_CaptureVideo_RIFF_OverflowCheck().

◆ SCR_CaptureVideo_RIFF_Flush()

static void SCR_CaptureVideo_RIFF_Flush ( void )
static

Definition at line 42 of file cap_avi.c.

43{
45 if (format->riffbuffer.cursize > 0)
46 {
47 if (!FS_Write(cls.capturevideo.videofile, format->riffbuffer.data, format->riffbuffer.cursize))
48 cls.capturevideo.error = true;
49 format->position += format->riffbuffer.cursize;
50 format->riffbuffer.cursize = 0;
51 format->riffbuffer.overflowed = false;
52 }
53}
fs_offset_t FS_Write(qfile_t *file, const void *data, size_t datasize)
Definition fs.c:3019

References cls, format, FS_Write(), and LOAD_FORMATSPECIFIC_AVI.

Referenced by SCR_CaptureVideo_Avi_BeginVideo(), SCR_CaptureVideo_RIFF_Finish(), SCR_CaptureVideo_RIFF_GetPosition(), SCR_CaptureVideo_RIFF_IndexEntry(), SCR_CaptureVideo_RIFF_MakeIxChunk(), SCR_CaptureVideo_RIFF_OverflowCheck(), SCR_CaptureVideo_RIFF_Push(), SCR_CaptureVideo_RIFF_Write16(), SCR_CaptureVideo_RIFF_Write32(), SCR_CaptureVideo_RIFF_WriteBytes(), SCR_CaptureVideo_RIFF_WriteFourCC(), and SCR_CaptureVideo_RIFF_WriteTerminatedString().

◆ SCR_CaptureVideo_RIFF_FlushNoIncrease()

static void SCR_CaptureVideo_RIFF_FlushNoIncrease ( void )
static

Definition at line 55 of file cap_avi.c.

56{
58 if (format->riffbuffer.cursize > 0)
59 {
60 if (!FS_Write(cls.capturevideo.videofile, format->riffbuffer.data, format->riffbuffer.cursize))
61 cls.capturevideo.error = true;
62 format->riffbuffer.cursize = 0;
63 format->riffbuffer.overflowed = false;
64 }
65}

References cls, format, FS_Write(), and LOAD_FORMATSPECIFIC_AVI.

Referenced by SCR_CaptureVideo_Avi_EndVideo(), SCR_CaptureVideo_RIFF_Finish(), and SCR_CaptureVideo_RIFF_MakeIxChunk().

◆ SCR_CaptureVideo_RIFF_GetPosition()

static fs_offset_t SCR_CaptureVideo_RIFF_GetPosition ( void )
static

◆ SCR_CaptureVideo_RIFF_IndexEntry()

static void SCR_CaptureVideo_RIFF_IndexEntry ( const char * chunkfourcc,
int chunksize,
int flags )
static

Definition at line 187 of file cap_avi.c.

188{
190 if(!format->canseek)
191 Sys_Error("SCR_CaptureVideo_RIFF_IndexEntry called on non-seekable AVI");
192
193 if (format->riffstacklevel != 2)
194 Sys_Error("SCR_Capturevideo_RIFF_IndexEntry: RIFF stack level is %i (should be 2)\n", format->riffstacklevel);
195 GrowBuf(&format->riffindexbuffer, 16);
197 MSG_WriteUnterminatedString(&format->riffindexbuffer, chunkfourcc);
198 MSG_WriteLong(&format->riffindexbuffer, flags);
199 MSG_WriteLong(&format->riffindexbuffer, (int)FS_Tell(cls.capturevideo.videofile) - format->riffstackstartoffset[1]);
200 MSG_WriteLong(&format->riffindexbuffer, chunksize);
201}
static void GrowBuf(sizebuf_t *buf, int extralen)
Definition cap_avi.c:170
void MSG_WriteLong(sizebuf_t *sb, int c)
Definition com_msg.c:147
void MSG_WriteUnterminatedString(sizebuf_t *sb, const char *s)
Definition com_msg.c:181
float flags
fs_offset_t FS_Tell(qfile_t *file)
Definition fs.c:3461

References cls, flags, format, FS_Tell(), GrowBuf(), LOAD_FORMATSPECIFIC_AVI, MSG_WriteLong(), MSG_WriteUnterminatedString(), SCR_CaptureVideo_RIFF_Flush(), and Sys_Error().

Referenced by SCR_CaptureVideo_Avi_SoundFrame(), and SCR_CaptureVideo_Avi_VideoFrames().

◆ SCR_CaptureVideo_RIFF_MakeIxChunk()

static void SCR_CaptureVideo_RIFF_MakeIxChunk ( const char * fcc,
const char * dwChunkId,
fs_offset_t masteridx_counter,
int * masteridx_count,
fs_offset_t masteridx_start )
static

Definition at line 203 of file cap_avi.c.

204{
206 int nMatching;
207 int i;
209 fs_offset_t pos, sz;
210
211 if(!format->canseek)
212 Sys_Error("SCR_CaptureVideo_RIFF_MakeIxChunk called on non-seekable AVI");
213
214 if(*masteridx_count >= AVI_MASTER_INDEX_SIZE)
215 return;
216
217 nMatching = 0; // go through index and enumerate them
218 for(i = 0; i < format->riffindexbuffer.cursize; i += 16)
219 if(!memcmp(format->riffindexbuffer.data + i, dwChunkId, 4))
220 ++nMatching;
221
222 sz = 2+2+4+4+4+4+4;
223 for(i = 0; i < format->riffindexbuffer.cursize; i += 16)
224 if(!memcmp(format->riffindexbuffer.data + i, dwChunkId, 4))
225 sz += 8;
226
228 SCR_CaptureVideo_RIFF_Write16(2); // wLongsPerEntry
229 SCR_CaptureVideo_RIFF_Write16(0x0100); // bIndexType=1, bIndexSubType=0
230 SCR_CaptureVideo_RIFF_Write32(nMatching); // nEntriesInUse
231 SCR_CaptureVideo_RIFF_WriteFourCC(dwChunkId); // dwChunkId
232 SCR_CaptureVideo_RIFF_Write32(format->videofile_ix_movistart & (fs_offset_t) 0xFFFFFFFFu);
233 SCR_CaptureVideo_RIFF_Write32(((fs_offset_t) format->videofile_ix_movistart) >> 32);
234 SCR_CaptureVideo_RIFF_Write32(0); // dwReserved
235
236 for(i = 0; i < format->riffindexbuffer.cursize; i += 16)
237 if(!memcmp(format->riffindexbuffer.data + i, dwChunkId, 4))
238 {
239 unsigned int *p = (unsigned int *) (format->riffindexbuffer.data + i);
240 unsigned int flags = p[1];
241 unsigned int rpos = p[2];
242 unsigned int size = p[3];
243 size &= ~0x80000000;
244 if(!(flags & 0x10)) // no keyframe?
245 size |= 0x80000000;
248 }
249
253
254 if(FS_Seek(cls.capturevideo.videofile, masteridx_start + 16 * *masteridx_count, SEEK_SET) >= 0)
255 {
256 SCR_CaptureVideo_RIFF_Write32(ix & (fs_offset_t) 0xFFFFFFFFu);
261 }
262
263 if(FS_Seek(cls.capturevideo.videofile, masteridx_counter, SEEK_SET) >= 0)
264 {
265 SCR_CaptureVideo_RIFF_Write32(++*masteridx_count);
267 }
268
269 FS_Seek(cls.capturevideo.videofile, 0, SEEK_END); // return value doesn't matter here
270}
vector size
int64_t fs_offset_t
Definition fs.h:37

References AVI_MASTER_INDEX_SIZE, cls, flags, format, FS_Seek(), i, LOAD_FORMATSPECIFIC_AVI, NULL, SCR_CaptureVideo_RIFF_Flush(), SCR_CaptureVideo_RIFF_FlushNoIncrease(), SCR_CaptureVideo_RIFF_GetPosition(), SCR_CaptureVideo_RIFF_Pop(), SCR_CaptureVideo_RIFF_Push(), SCR_CaptureVideo_RIFF_Write16(), SCR_CaptureVideo_RIFF_Write32(), SCR_CaptureVideo_RIFF_WriteFourCC(), size, and Sys_Error().

Referenced by SCR_CaptureVideo_RIFF_Finish().

◆ SCR_CaptureVideo_RIFF_OverflowCheck()

static void SCR_CaptureVideo_RIFF_OverflowCheck ( int framesize)
static

Definition at line 309 of file cap_avi.c.

310{
312 fs_offset_t cursize;
313 //fs_offset_t curfilesize;
314 if (format->riffstacklevel != 2)
315 Sys_Error("SCR_CaptureVideo_RIFF_OverflowCheck: chunk stack leakage!\n");
316
317 if(!format->canseek)
318 return;
319
320 // check where we are in the file
322 cursize = SCR_CaptureVideo_RIFF_GetPosition() - format->riffstackstartoffset[0];
323 //curfilesize = SCR_CaptureVideo_RIFF_GetPosition();
324
325 // if this would overflow the windows limit of 1GB per RIFF chunk, we need
326 // to close the current RIFF chunk and open another for future frames
327 if (8 + cursize + framesize + format->riffindexbuffer.cursize + 8 + format->riffindexbuffer.cursize + 64 > 1<<30) // note that the Ix buffer takes less space... I just don't dare to / 2 here now... sorry, maybe later
328 {
330 // begin a new 1GB extended section of the AVI
331 SCR_CaptureVideo_RIFF_Push("RIFF", "AVIX", -1);
332 SCR_CaptureVideo_RIFF_Push("LIST", "movi", -1);
333 format->videofile_ix_movistart = format->riffstackstartoffset[1];
334 }
335}

References format, LOAD_FORMATSPECIFIC_AVI, SCR_CaptureVideo_RIFF_Finish(), SCR_CaptureVideo_RIFF_Flush(), SCR_CaptureVideo_RIFF_GetPosition(), SCR_CaptureVideo_RIFF_Push(), and Sys_Error().

Referenced by SCR_CaptureVideo_Avi_SoundFrame(), and SCR_CaptureVideo_Avi_VideoFrames().

◆ SCR_CaptureVideo_RIFF_Pop()

static void SCR_CaptureVideo_RIFF_Pop ( void )
static

Definition at line 132 of file cap_avi.c.

133{
135 fs_offset_t offset, sizehint;
136 int x;
137 unsigned char sizebytes[4];
138 // write out the chunk size and then return to the current file position
139 format->riffstacklevel--;
141
142 sizehint = format->riffstacksizehint[format->riffstacklevel];
143 x = (int)(offset - (format->riffstackstartoffset[format->riffstacklevel]));
144
145 if(x != sizehint)
146 {
147 if(sizehint != -1)
148 {
149 int i;
150 Con_Printf(CON_WARN "WARNING: invalid size hint %d when writing video data (actual size: %d)\n", (int) sizehint, x);
151 for(i = 0; i <= format->riffstacklevel; ++i)
152 {
153 Con_Printf(" RIFF level %d = %s\n", i, format->riffstackfourcc[i]);
154 }
155 }
156 sizebytes[0] = (x) & 0xff;sizebytes[1] = (x >> 8) & 0xff;sizebytes[2] = (x >> 16) & 0xff;sizebytes[3] = (x >> 24) & 0xff;
157 if(FS_Seek(cls.capturevideo.videofile, -(x + 4), SEEK_END) >= 0)
158 {
159 FS_Write(cls.capturevideo.videofile, sizebytes, 4);
160 }
161 FS_Seek(cls.capturevideo.videofile, 0, SEEK_END);
162 }
163
164 if (offset & 1)
165 {
166 SCR_CaptureVideo_RIFF_WriteBytes((unsigned char *) "\0", 1);
167 }
168}
#define CON_WARN
Definition console.h:101
GLuint GLuint GLintptr offset
Definition glquake.h:632

References cls, Con_Printf(), CON_WARN, format, FS_Seek(), FS_Write(), i, int(), LOAD_FORMATSPECIFIC_AVI, offset, SCR_CaptureVideo_RIFF_GetPosition(), SCR_CaptureVideo_RIFF_WriteBytes(), and x.

Referenced by SCR_CaptureVideo_Avi_BeginVideo(), SCR_CaptureVideo_Avi_SoundFrame(), SCR_CaptureVideo_Avi_VideoFrames(), SCR_CaptureVideo_RIFF_Finish(), and SCR_CaptureVideo_RIFF_MakeIxChunk().

◆ SCR_CaptureVideo_RIFF_Push()

static void SCR_CaptureVideo_RIFF_Push ( const char * chunkfourcc,
const char * listtypefourcc,
fs_offset_t sizeHint )
static

Definition at line 116 of file cap_avi.c.

117{
119 if (listtypefourcc && sizeHint >= 0)
120 sizeHint += 4; // size hint is for INNER size
124 format->riffstacksizehint[format->riffstacklevel] = sizeHint;
125 format->riffstackstartoffset[format->riffstacklevel] = SCR_CaptureVideo_RIFF_GetPosition();
126 format->riffstackfourcc[format->riffstacklevel] = chunkfourcc;
127 ++format->riffstacklevel;
128 if (listtypefourcc)
129 SCR_CaptureVideo_RIFF_WriteFourCC(listtypefourcc);
130}

References format, LOAD_FORMATSPECIFIC_AVI, SCR_CaptureVideo_RIFF_Flush(), SCR_CaptureVideo_RIFF_GetPosition(), SCR_CaptureVideo_RIFF_Write32(), and SCR_CaptureVideo_RIFF_WriteFourCC().

Referenced by SCR_CaptureVideo_Avi_BeginVideo(), SCR_CaptureVideo_Avi_SoundFrame(), SCR_CaptureVideo_Avi_VideoFrames(), SCR_CaptureVideo_RIFF_Finish(), SCR_CaptureVideo_RIFF_MakeIxChunk(), and SCR_CaptureVideo_RIFF_OverflowCheck().

◆ SCR_CaptureVideo_RIFF_Start()

static void SCR_CaptureVideo_RIFF_Start ( void )
static

Definition at line 33 of file cap_avi.c.

34{
36 memset(&format->riffbuffer, 0, sizeof(sizebuf_t));
37 format->riffbuffer.maxsize = sizeof(format->riffbufferdata);
38 format->riffbuffer.data = format->riffbufferdata;
39 format->position = 0;
40}

References format, and LOAD_FORMATSPECIFIC_AVI.

Referenced by SCR_CaptureVideo_Avi_BeginVideo().

◆ SCR_CaptureVideo_RIFF_Write16()

static void SCR_CaptureVideo_RIFF_Write16 ( int n)
static

Definition at line 84 of file cap_avi.c.

85{
87 if (format->riffbuffer.cursize + 2 > format->riffbuffer.maxsize)
89 MSG_WriteShort(&format->riffbuffer, n);
90}
void MSG_WriteShort(sizebuf_t *sb, int c)
Definition com_msg.c:138

References format, LOAD_FORMATSPECIFIC_AVI, MSG_WriteShort(), n, and SCR_CaptureVideo_RIFF_Flush().

Referenced by SCR_CaptureVideo_Avi_BeginVideo(), and SCR_CaptureVideo_RIFF_MakeIxChunk().

◆ SCR_CaptureVideo_RIFF_Write32()

static void SCR_CaptureVideo_RIFF_Write32 ( int n)
static

◆ SCR_CaptureVideo_RIFF_WriteBytes()

static void SCR_CaptureVideo_RIFF_WriteBytes ( const unsigned char * data,
size_t size )
static

Definition at line 67 of file cap_avi.c.

68{
71 if (!FS_Write(cls.capturevideo.videofile, data, size))
72 cls.capturevideo.error = true;
73 format->position += size;
74}
GLsizeiptr const GLvoid * data
Definition glquake.h:639

References cls, data, format, FS_Write(), LOAD_FORMATSPECIFIC_AVI, SCR_CaptureVideo_RIFF_Flush(), and size.

Referenced by SCR_CaptureVideo_Avi_BeginVideo(), SCR_CaptureVideo_Avi_SoundFrame(), SCR_CaptureVideo_Avi_VideoFrames(), SCR_CaptureVideo_RIFF_Finish(), and SCR_CaptureVideo_RIFF_Pop().

◆ SCR_CaptureVideo_RIFF_WriteFourCC()

static void SCR_CaptureVideo_RIFF_WriteFourCC ( const char * chunkfourcc)
static

Definition at line 92 of file cap_avi.c.

93{
95 if (format->riffbuffer.cursize + (int)strlen(chunkfourcc) > format->riffbuffer.maxsize)
97 MSG_WriteUnterminatedString(&format->riffbuffer, chunkfourcc);
98}

References format, LOAD_FORMATSPECIFIC_AVI, MSG_WriteUnterminatedString(), SCR_CaptureVideo_RIFF_Flush(), and strlen().

Referenced by SCR_CaptureVideo_Avi_BeginVideo(), SCR_CaptureVideo_RIFF_MakeIxChunk(), and SCR_CaptureVideo_RIFF_Push().

◆ SCR_CaptureVideo_RIFF_WriteTerminatedString()

static void SCR_CaptureVideo_RIFF_WriteTerminatedString ( const char * string)
static

Definition at line 100 of file cap_avi.c.

101{
103 if (format->riffbuffer.cursize + (int)strlen(string) > format->riffbuffer.maxsize)
105 MSG_WriteString(&format->riffbuffer, string);
106}
void MSG_WriteString(sizebuf_t *sb, const char *s)
Definition com_msg.c:173

References format, LOAD_FORMATSPECIFIC_AVI, MSG_WriteString(), SCR_CaptureVideo_RIFF_Flush(), and strlen().

Referenced by SCR_CaptureVideo_Avi_BeginVideo().