DarkPlaces
Game engine based on the Quake 1 engine by id Software, developed by LadyHavoc
 
cap_ogg.h File Reference
#include "qtypes.h"
+ Include dependency graph for cap_ogg.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

qbool SCR_CaptureVideo_Ogg_Available (void)
 
void SCR_CaptureVideo_Ogg_BeginVideo (void)
 
void SCR_CaptureVideo_Ogg_CloseDLL (void)
 
void SCR_CaptureVideo_Ogg_Init (void)
 

Function Documentation

◆ SCR_CaptureVideo_Ogg_Available()

qbool SCR_CaptureVideo_Ogg_Available ( void )

Definition at line 593 of file cap_ogg.c.

594{
595 return og_dll && th_dll && vo_dll && ve_dll;
596}
static dllhandle_t og_dll
Definition cap_ogg.c:506
static dllhandle_t ve_dll
Definition cap_ogg.c:506
static dllhandle_t vo_dll
Definition cap_ogg.c:506
static dllhandle_t th_dll
Definition cap_ogg.c:506

References og_dll, th_dll, ve_dll, and vo_dll.

◆ SCR_CaptureVideo_Ogg_BeginVideo()

void SCR_CaptureVideo_Ogg_BeginVideo ( void )

Definition at line 921 of file cap_ogg.c.

922{
923 char vabuf[1024];
924 cls.capturevideo.format = CAPTUREVIDEOFORMAT_OGG_VORBIS_THEORA;
925 cls.capturevideo.formatextension = "ogv";
926 cls.capturevideo.videofile = FS_OpenRealFile(va(vabuf, sizeof(vabuf), "%s.%s", cls.capturevideo.basename, cls.capturevideo.formatextension), "wb", false);
927 if (!cls.capturevideo.videofile)
928 {
929 Con_Printf(CON_ERROR "Failed to open video file \"%s\", cancelling video capture.\n", vabuf);
930 cls.capturevideo.error = true;
931 return;
932 }
933 cls.capturevideo.writeEndVideo = SCR_CaptureVideo_Ogg_EndVideo;
934 cls.capturevideo.writeVideoFrame = SCR_CaptureVideo_Ogg_VideoFrames;
935 cls.capturevideo.writeSoundFrame = SCR_CaptureVideo_Ogg_SoundFrame;
936 cls.capturevideo.formatspecific = Mem_Alloc(tempmempool, sizeof(capturevideostate_ogg_formatspecific_t));
937 {
939 int num, denom, i;
940 ogg_page pg;
941 ogg_packet pt, pt2, pt3;
944 theora_info ti;
945 int vp3compat;
946
947 format->serial1 = rand();
948 qogg_stream_init(&format->to, format->serial1);
949
950 if(cls.capturevideo.soundrate)
951 {
952 do
953 {
954 format->serial2 = rand();
955 }
956 while(format->serial1 == format->serial2);
957 qogg_stream_init(&format->vo, format->serial2);
958 }
959
960 format->videopage.len = format->audiopage.len = 0;
961
963 ti.frame_width = cls.capturevideo.width;
964 ti.frame_height = cls.capturevideo.height;
965 ti.width = (ti.frame_width + 15) & ~15;
966 ti.height = (ti.frame_height + 15) & ~15;
967 //ti.offset_x = ((ti.width - ti.frame_width) / 2) & ~1;
968 //ti.offset_y = ((ti.height - ti.frame_height) / 2) & ~1;
969
970 for(i = 0; i < 2; ++i)
971 {
972 format->yuv[i].y_width = ti.width;
973 format->yuv[i].y_height = ti.height;
974 format->yuv[i].y_stride = ti.width;
975 format->yuv[i].uv_width = ti.width / 2;
976 format->yuv[i].uv_height = ti.height / 2;
977 format->yuv[i].uv_stride = ti.width / 2;
978 format->yuv[i].y = (unsigned char *) Mem_Alloc(tempmempool, format->yuv[i].y_stride * format->yuv[i].y_height);
979 format->yuv[i].u = (unsigned char *) Mem_Alloc(tempmempool, format->yuv[i].uv_stride * format->yuv[i].uv_height);
980 format->yuv[i].v = (unsigned char *) Mem_Alloc(tempmempool, format->yuv[i].uv_stride * format->yuv[i].uv_height);
981 }
982 format->yuvi = -1; // -1: no frame valid yet, write into 0
983
984 FindFraction(cls.capturevideo.framerate / cls.capturevideo.framestep, &num, &denom, 1001);
985 ti.fps_numerator = num;
986 ti.fps_denominator = denom;
987
988 FindFraction(1 / vid_pixelheight.value, &num, &denom, 1000);
989 ti.aspect_numerator = num;
990 ti.aspect_denominator = denom;
991
994
995 ti.quick_p = true; // http://mlblog.osdir.com/multimedia.ogg.theora.general/2004-07/index.shtml
996 ti.dropframes_p = false;
997
1000
1001 if(ti.target_bitrate <= 0)
1002 {
1003 ti.target_bitrate = -1;
1004 ti.keyframe_data_target_bitrate = (unsigned int)-1;
1005 }
1006 else
1007 {
1009
1010 if(ti.target_bitrate < 45000 || ti.target_bitrate > 2000000)
1011 Con_DPrintf("WARNING: requesting an odd bitrate for theora (sensible values range from 45 to 2000 kbps)\n");
1012 }
1013
1014 if(ti.quality < 0 || ti.quality > 63)
1015 {
1016 ti.quality = 63;
1017 if(ti.target_bitrate <= 0)
1018 {
1019 ti.target_bitrate = 0x7FFFFFFF;
1020 ti.keyframe_data_target_bitrate = 0x7FFFFFFF;
1021 }
1022 }
1023
1024 // this -1 magic is because ti.keyframe_frequency and ti.keyframe_mindistance use different metrics
1030
1033
1034 qtheora_encode_init(&format->ts, &ti);
1035 qtheora_info_clear(&ti);
1036
1038 {
1039 vp3compat = 1;
1040 qtheora_control(&format->ts, TH_ENCCTL_SET_VP3_COMPATIBLE, &vp3compat, sizeof(vp3compat));
1041 if(!vp3compat)
1042 Con_DPrintf("Warning: theora stream is not fully VP3 compatible\n");
1043 }
1044
1045 // vorbis?
1046 if(cls.capturevideo.soundrate)
1047 {
1049 qvorbis_encode_init_vbr(&format->vi, cls.capturevideo.soundchannels, cls.capturevideo.soundrate, bound(-1, cl_capturevideo_ogg_vorbis_quality.value, 10) * 0.099);
1052 qvorbis_block_init(&format->vd, &format->vb);
1053 }
1054
1056
1057 /* create the remaining theora headers */
1058 qtheora_encode_header(&format->ts, &pt);
1059 qogg_stream_packetin(&format->to, &pt);
1060 if (qogg_stream_pageout (&format->to, &pg) != 1)
1061 fprintf (stderr, "Internal Ogg library error.\n");
1062 FS_Write(cls.capturevideo.videofile, pg.header, pg.header_len);
1063 FS_Write(cls.capturevideo.videofile, pg.body, pg.body_len);
1064
1066 qogg_stream_packetin(&format->to, &pt);
1067 qtheora_encode_tables(&format->ts, &pt);
1068 qogg_stream_packetin (&format->to, &pt);
1069
1071
1072 if(cls.capturevideo.soundrate)
1073 {
1074 qvorbis_analysis_headerout(&format->vd, &vc, &pt, &pt2, &pt3);
1075 qogg_stream_packetin(&format->vo, &pt);
1076 if (qogg_stream_pageout (&format->vo, &pg) != 1)
1077 fprintf (stderr, "Internal Ogg library error.\n");
1078 FS_Write(cls.capturevideo.videofile, pg.header, pg.header_len);
1079 FS_Write(cls.capturevideo.videofile, pg.body, pg.body_len);
1080
1081 qogg_stream_packetin(&format->vo, &pt2);
1082 qogg_stream_packetin(&format->vo, &pt3);
1083
1085 }
1086
1087 for(;;)
1088 {
1089 int result = qogg_stream_flush (&format->to, &pg);
1090 if (result < 0)
1091 fprintf (stderr, "Internal Ogg library error.\n"); // TODO Sys_Error
1092 if (result <= 0)
1093 break;
1094 FS_Write(cls.capturevideo.videofile, pg.header, pg.header_len);
1095 FS_Write(cls.capturevideo.videofile, pg.body, pg.body_len);
1096 }
1097
1098 if(cls.capturevideo.soundrate)
1099 for(;;)
1100 {
1101 int result = qogg_stream_flush (&format->vo, &pg);
1102 if (result < 0)
1103 fprintf (stderr, "Internal Ogg library error.\n"); // TODO Sys_Error
1104 if (result <= 0)
1105 break;
1106 FS_Write(cls.capturevideo.videofile, pg.header, pg.header_len);
1107 FS_Write(cls.capturevideo.videofile, pg.body, pg.body_len);
1108 }
1109 }
1110}
static int(* qvorbis_encode_init_vbr)(vorbis_info *vi, long channels, long rate, float base_quality)
Definition cap_ogg.c:287
static void(* qvorbis_comment_init)(vorbis_comment *vc)
Definition cap_ogg.c:257
static void SCR_CaptureVideo_Ogg_VideoFrames(int num, u8 *in)
Definition cap_ogg.c:850
static int(* qtheora_encode_comment)(theora_comment *tc, ogg_packet *op)
Definition cap_ogg.c:438
static int(* qtheora_control)(theora_state *th, int req, void *buf, size_t buf_sz)
Definition cap_ogg.c:446
static int(* qvorbis_analysis_init)(vorbis_dsp_state *v, vorbis_info *vi)
Definition cap_ogg.c:268
static int(* qvorbis_block_init)(vorbis_dsp_state *v, vorbis_block *vb)
Definition cap_ogg.c:260
#define TH_ENCCTL_SET_VP3_COMPATIBLE
Definition cap_ogg.c:297
static void(* qtheora_info_init)(theora_info *c)
Definition cap_ogg.c:440
static cvar_t cl_capturevideo_ogg_theora_keyframe_auto_threshold
Definition cap_ogg.c:14
static cvar_t cl_capturevideo_ogg_theora_sharpness
Definition cap_ogg.c:16
static int(* qtheora_encode_init)(theora_state *th, theora_info *ti)
Definition cap_ogg.c:433
static int(* qvorbis_analysis_headerout)(vorbis_dsp_state *v, vorbis_comment *vc, ogg_packet *op, ogg_packet *op_comm, ogg_packet *op_code)
Definition cap_ogg.c:270
static void(* qvorbis_info_init)(vorbis_info *vi)
Definition cap_ogg.c:255
static void(* qtheora_info_clear)(theora_info *c)
Definition cap_ogg.c:441
#define LOAD_FORMATSPECIFIC_OGG()
Definition cap_ogg.c:637
static cvar_t cl_capturevideo_ogg_theora_vp3compat
Definition cap_ogg.c:8
static cvar_t cl_capturevideo_ogg_theora_bitrate
Definition cap_ogg.c:10
static int(* qtheora_encode_tables)(theora_state *t, ogg_packet *op)
Definition cap_ogg.c:439
@ OC_CS_UNSPECIFIED
The colorspace is unknown or unspecified.
Definition cap_ogg.c:317
static void(* qtheora_comment_clear)(theora_comment *tc)
Definition cap_ogg.c:444
static cvar_t cl_capturevideo_ogg_theora_keyframe_maxinterval
Definition cap_ogg.c:12
static void(* qtheora_comment_init)(theora_comment *tc)
Definition cap_ogg.c:443
static cvar_t cl_capturevideo_ogg_theora_keyframe_bitrate_multiplier
Definition cap_ogg.c:11
static int(* qogg_stream_pageout)(ogg_stream_state *os, ogg_page *og)
Definition cap_ogg.c:106
static cvar_t cl_capturevideo_ogg_theora_quality
Definition cap_ogg.c:9
static void SCR_CaptureVideo_Ogg_EndVideo(void)
Definition cap_ogg.c:715
static cvar_t cl_capturevideo_ogg_theora_keyframe_mininterval
Definition cap_ogg.c:13
static int(* qogg_stream_packetin)(ogg_stream_state *os, ogg_packet *op)
Definition cap_ogg.c:105
static void(* qvorbis_comment_clear)(vorbis_comment *vc)
Definition cap_ogg.c:258
@ OC_PF_420
Chroma subsampling by 2 in each direction (4:2:0)
Definition cap_ogg.c:331
static int(* qtheora_encode_header)(theora_state *t, ogg_packet *op)
Definition cap_ogg.c:437
static int(* qogg_stream_flush)(ogg_stream_state *os, ogg_page *og)
Definition cap_ogg.c:107
static cvar_t cl_capturevideo_ogg_vorbis_quality
Definition cap_ogg.c:17
static cvar_t cl_capturevideo_ogg_theora_noise_sensitivity
Definition cap_ogg.c:15
static void SCR_CaptureVideo_Ogg_SoundFrame(const portable_sampleframe_t *paintbuffer, size_t length)
Definition cap_ogg.c:891
static int(* qogg_stream_init)(ogg_stream_state *os, int serialno)
Definition cap_ogg.c:111
client_static_t cls
Definition cl_main.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_DPrintf(const char *fmt,...)
A Con_Printf that only shows up if the "developer" cvar is set.
Definition console.c:1544
void Con_Printf(const char *fmt,...)
Prints to all appropriate console targets.
Definition console.c:1514
#define CON_ERROR
Definition console.h:102
fs_offset_t FS_Write(qfile_t *file, const void *data, size_t datasize)
Definition fs.c:3019
qfile_t * FS_OpenRealFile(const char *filepath, const char *mode, qbool quiet)
Definition fs.c:2901
static int(ZEXPORT *qz_inflate)(z_stream *strm
GLint GLint GLint GLsizei GLsizei GLenum format
Definition glquake.h:649
#define max(A, B)
Definition mathlib.h:38
#define bound(min, num, max)
Definition mathlib.h:34
int i
void vec2 tc
float value
Definition cvar.h:74
int integer
Definition cvar.h:73
unsigned char * header
Definition cap_ogg.c:31
long body_len
Definition cap_ogg.c:34
long header_len
Definition cap_ogg.c:32
unsigned char * body
Definition cap_ogg.c:33
Comment header metadata.
Definition cap_ogg.c:426
Theora bitstream info.
Definition cap_ogg.c:357
int32_t keyframe_auto_threshold
Definition cap_ogg.c:387
int target_bitrate
nominal bitrate in bits per second
Definition cap_ogg.c:369
int keyframe_auto_p
Definition cap_ogg.c:382
uint32_t frame_height
display frame height
Definition cap_ogg.c:361
int quick_p
Quick encode/decode.
Definition cap_ogg.c:371
uint32_t aspect_denominator
pixel aspect ratio denominator
Definition cap_ogg.c:367
uint32_t fps_numerator
frame rate numerator
Definition cap_ogg.c:364
uint32_t keyframe_data_target_bitrate
Definition cap_ogg.c:386
theora_colorspace colorspace
colorspace
Definition cap_ogg.c:368
theora_pixelformat pixelformat
chroma subsampling mode to expect
Definition cap_ogg.c:392
uint32_t width
encoded frame width
Definition cap_ogg.c:358
int quality
Nominal quality setting, 0-63.
Definition cap_ogg.c:370
uint32_t keyframe_frequency_force
Definition cap_ogg.c:384
uint32_t aspect_numerator
pixel aspect ratio numerator
Definition cap_ogg.c:366
uint32_t height
encoded frame height
Definition cap_ogg.c:359
uint32_t keyframe_frequency
Definition cap_ogg.c:383
uint32_t keyframe_mindistance
Definition cap_ogg.c:388
int32_t noise_sensitivity
Definition cap_ogg.c:389
int32_t sharpness
Definition cap_ogg.c:390
uint32_t frame_width
display frame width
Definition cap_ogg.c:360
int dropframes_p
Definition cap_ogg.c:381
uint32_t fps_denominator
frame rate denominator
Definition cap_ogg.c:365
mempool_t * tempmempool
Definition zone.c:794
#define Mem_Alloc(pool, size)
Definition zone.h:92

References theora_info::aspect_denominator, theora_info::aspect_numerator, ogg_page::body, ogg_page::body_len, bound, cl_capturevideo_ogg_theora_bitrate, cl_capturevideo_ogg_theora_keyframe_auto_threshold, cl_capturevideo_ogg_theora_keyframe_bitrate_multiplier, cl_capturevideo_ogg_theora_keyframe_maxinterval, cl_capturevideo_ogg_theora_keyframe_mininterval, cl_capturevideo_ogg_theora_noise_sensitivity, cl_capturevideo_ogg_theora_quality, cl_capturevideo_ogg_theora_sharpness, cl_capturevideo_ogg_theora_vp3compat, cl_capturevideo_ogg_vorbis_quality, cls, theora_info::colorspace, Con_DPrintf(), CON_ERROR, Con_Printf(), theora_info::dropframes_p, FindFraction(), format, theora_info::fps_denominator, theora_info::fps_numerator, theora_info::frame_height, theora_info::frame_width, FS_OpenRealFile(), FS_Write(), ogg_page::header, ogg_page::header_len, theora_info::height, i, int(), cvar_t::integer, theora_info::keyframe_auto_p, theora_info::keyframe_auto_threshold, theora_info::keyframe_data_target_bitrate, theora_info::keyframe_frequency, theora_info::keyframe_frequency_force, theora_info::keyframe_mindistance, LOAD_FORMATSPECIFIC_OGG, max, Mem_Alloc, theora_info::noise_sensitivity, OC_CS_UNSPECIFIED, OC_PF_420, theora_info::pixelformat, qogg_stream_flush, qogg_stream_init, qogg_stream_packetin, qogg_stream_pageout, qtheora_comment_clear, qtheora_comment_init, qtheora_control, qtheora_encode_comment, qtheora_encode_header, qtheora_encode_init, qtheora_encode_tables, qtheora_info_clear, qtheora_info_init, theora_info::quality, theora_info::quick_p, qvorbis_analysis_headerout, qvorbis_analysis_init, qvorbis_block_init, qvorbis_comment_clear, qvorbis_comment_init, qvorbis_encode_init_vbr, qvorbis_info_init, SCR_CaptureVideo_Ogg_EndVideo(), SCR_CaptureVideo_Ogg_SoundFrame(), SCR_CaptureVideo_Ogg_VideoFrames(), theora_info::sharpness, theora_info::target_bitrate, tc, tempmempool, TH_ENCCTL_SET_VP3_COMPATIBLE, va(), cvar_t::value, vid_pixelheight, and theora_info::width.

◆ SCR_CaptureVideo_Ogg_CloseDLL()

void SCR_CaptureVideo_Ogg_CloseDLL ( void )

Definition at line 598 of file cap_ogg.c.

599{
604}
void Sys_FreeLibrary(dllhandle_t *handle)
Definition sys_shared.c:245

References og_dll, Sys_FreeLibrary(), th_dll, ve_dll, and vo_dll.

◆ SCR_CaptureVideo_Ogg_Init()

void SCR_CaptureVideo_Ogg_Init ( void )

Definition at line 577 of file cap_ogg.c.

References cl_capturevideo_ogg_theora_bitrate, cl_capturevideo_ogg_theora_keyframe_auto_threshold, cl_capturevideo_ogg_theora_keyframe_bitrate_multiplier, cl_capturevideo_ogg_theora_keyframe_maxinterval, cl_capturevideo_ogg_theora_keyframe_mininterval, cl_capturevideo_ogg_theora_noise_sensitivity, cl_capturevideo_ogg_theora_quality, cl_capturevideo_ogg_theora_sharpness, cl_capturevideo_ogg_theora_vp3compat, cl_capturevideo_ogg_vorbis_quality, Cvar_RegisterVariable(), and SCR_CaptureVideo_Ogg_OpenLibrary().

Referenced by CL_Screen_Init().