?? cl_cin.c
字號:
/*
===========================================================================
Copyright (C) 1999-2005 Id Software, Inc.
This file is part of Quake III Arena source code.
Quake III Arena source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
Quake III Arena source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
/*****************************************************************************
* name: cl_cin.c
*
* desc: video and cinematic playback
*
* $Archive: /MissionPack/code/client/cl_cin.c $
*
* cl_glconfig.hwtype trtypes 3dfx/ragepro need 256x256
*
*****************************************************************************/
#include "client.h"
#include "snd_local.h"
#define MAXSIZE 8
#define MINSIZE 4
#define DEFAULT_CIN_WIDTH 512
#define DEFAULT_CIN_HEIGHT 512
#define ROQ_QUAD 0x1000
#define ROQ_QUAD_INFO 0x1001
#define ROQ_CODEBOOK 0x1002
#define ROQ_QUAD_VQ 0x1011
#define ROQ_QUAD_JPEG 0x1012
#define ROQ_QUAD_HANG 0x1013
#define ROQ_PACKET 0x1030
#define ZA_SOUND_MONO 0x1020
#define ZA_SOUND_STEREO 0x1021
#define MAX_VIDEO_HANDLES 16
extern glconfig_t glConfig;
extern int s_paintedtime;
extern int s_rawend;
static void RoQ_init( void );
/******************************************************************************
*
* Class: trFMV
*
* Description: RoQ/RnR manipulation routines
* not entirely complete for first run
*
******************************************************************************/
static long ROQ_YY_tab[256];
static long ROQ_UB_tab[256];
static long ROQ_UG_tab[256];
static long ROQ_VG_tab[256];
static long ROQ_VR_tab[256];
static unsigned short vq2[256*16*4];
static unsigned short vq4[256*64*4];
static unsigned short vq8[256*256*4];
typedef struct {
byte linbuf[DEFAULT_CIN_WIDTH*DEFAULT_CIN_HEIGHT*4*2];
byte file[65536];
short sqrTable[256];
unsigned int mcomp[256];
byte *qStatus[2][32768];
long oldXOff, oldYOff, oldysize, oldxsize;
int currentHandle;
} cinematics_t;
typedef struct {
char fileName[MAX_OSPATH];
int CIN_WIDTH, CIN_HEIGHT;
int xpos, ypos, width, height;
qboolean looping, holdAtEnd, dirty, alterGameState, silent, shader;
fileHandle_t iFile;
e_status status;
unsigned int startTime;
unsigned int lastTime;
long tfps;
long RoQPlayed;
long ROQSize;
unsigned int RoQFrameSize;
long onQuad;
long numQuads;
long samplesPerLine;
unsigned int roq_id;
long screenDelta;
void ( *VQ0)(byte *status, void *qdata );
void ( *VQ1)(byte *status, void *qdata );
void ( *VQNormal)(byte *status, void *qdata );
void ( *VQBuffer)(byte *status, void *qdata );
long samplesPerPixel; // defaults to 2
byte* gray;
unsigned int xsize, ysize, maxsize, minsize;
qboolean half, smootheddouble, inMemory;
long normalBuffer0;
long roq_flags;
long roqF0;
long roqF1;
long t[2];
long roqFPS;
int playonwalls;
byte* buf;
long drawX, drawY;
} cin_cache;
static cinematics_t cin;
static cin_cache cinTable[MAX_VIDEO_HANDLES];
static int currentHandle = -1;
static int CL_handle = -1;
extern int s_soundtime; // sample PAIRS
extern int s_paintedtime; // sample PAIRS
void CIN_CloseAllVideos(void) {
int i;
for ( i = 0 ; i < MAX_VIDEO_HANDLES ; i++ ) {
if (cinTable[i].fileName[0] != 0 ) {
CIN_StopCinematic(i);
}
}
}
static int CIN_HandleForVideo(void) {
int i;
for ( i = 0 ; i < MAX_VIDEO_HANDLES ; i++ ) {
if ( cinTable[i].fileName[0] == 0 ) {
return i;
}
}
Com_Error( ERR_DROP, "CIN_HandleForVideo: none free" );
return -1;
}
extern int CL_ScaledMilliseconds(void);
//-----------------------------------------------------------------------------
// RllSetupTable
//
// Allocates and initializes the square table.
//
// Parameters: None
//
// Returns: Nothing
//-----------------------------------------------------------------------------
static void RllSetupTable()
{
int z;
for (z=0;z<128;z++) {
cin.sqrTable[z] = (short)(z*z);
cin.sqrTable[z+128] = (short)(-cin.sqrTable[z]);
}
}
//-----------------------------------------------------------------------------
// RllDecodeMonoToMono
//
// Decode mono source data into a mono buffer.
//
// Parameters: from -> buffer holding encoded data
// to -> buffer to hold decoded data
// size = number of bytes of input (= # of shorts of output)
// signedOutput = 0 for unsigned output, non-zero for signed output
// flag = flags from asset header
//
// Returns: Number of samples placed in output buffer
//-----------------------------------------------------------------------------
long RllDecodeMonoToMono(unsigned char *from,short *to,unsigned int size,char signedOutput ,unsigned short flag)
{
unsigned int z;
int prev;
if (signedOutput)
prev = flag - 0x8000;
else
prev = flag;
for (z=0;z<size;z++) {
prev = to[z] = (short)(prev + cin.sqrTable[from[z]]);
}
return size; //*sizeof(short));
}
//-----------------------------------------------------------------------------
// RllDecodeMonoToStereo
//
// Decode mono source data into a stereo buffer. Output is 4 times the number
// of bytes in the input.
//
// Parameters: from -> buffer holding encoded data
// to -> buffer to hold decoded data
// size = number of bytes of input (= 1/4 # of bytes of output)
// signedOutput = 0 for unsigned output, non-zero for signed output
// flag = flags from asset header
//
// Returns: Number of samples placed in output buffer
//-----------------------------------------------------------------------------
long RllDecodeMonoToStereo(unsigned char *from,short *to,unsigned int size,char signedOutput,unsigned short flag)
{
unsigned int z;
int prev;
if (signedOutput)
prev = flag - 0x8000;
else
prev = flag;
for (z = 0; z < size; z++) {
prev = (short)(prev + cin.sqrTable[from[z]]);
to[z*2+0] = to[z*2+1] = (short)(prev);
}
return size; // * 2 * sizeof(short));
}
//-----------------------------------------------------------------------------
// RllDecodeStereoToStereo
//
// Decode stereo source data into a stereo buffer.
//
// Parameters: from -> buffer holding encoded data
// to -> buffer to hold decoded data
// size = number of bytes of input (= 1/2 # of bytes of output)
// signedOutput = 0 for unsigned output, non-zero for signed output
// flag = flags from asset header
//
// Returns: Number of samples placed in output buffer
//-----------------------------------------------------------------------------
long RllDecodeStereoToStereo(unsigned char *from,short *to,unsigned int size,char signedOutput, unsigned short flag)
{
unsigned int z;
unsigned char *zz = from;
int prevL, prevR;
if (signedOutput) {
prevL = (flag & 0xff00) - 0x8000;
prevR = ((flag & 0x00ff) << 8) - 0x8000;
} else {
prevL = flag & 0xff00;
prevR = (flag & 0x00ff) << 8;
}
for (z=0;z<size;z+=2) {
prevL = (short)(prevL + cin.sqrTable[*zz++]);
prevR = (short)(prevR + cin.sqrTable[*zz++]);
to[z+0] = (short)(prevL);
to[z+1] = (short)(prevR);
}
return (size>>1); //*sizeof(short));
}
//-----------------------------------------------------------------------------
// RllDecodeStereoToMono
//
// Decode stereo source data into a mono buffer.
//
// Parameters: from -> buffer holding encoded data
// to -> buffer to hold decoded data
// size = number of bytes of input (= # of bytes of output)
// signedOutput = 0 for unsigned output, non-zero for signed output
// flag = flags from asset header
//
// Returns: Number of samples placed in output buffer
//-----------------------------------------------------------------------------
long RllDecodeStereoToMono(unsigned char *from,short *to,unsigned int size,char signedOutput, unsigned short flag)
{
unsigned int z;
int prevL,prevR;
if (signedOutput) {
prevL = (flag & 0xff00) - 0x8000;
prevR = ((flag & 0x00ff) << 8) -0x8000;
} else {
prevL = flag & 0xff00;
prevR = (flag & 0x00ff) << 8;
}
for (z=0;z<size;z+=1) {
prevL= prevL + cin.sqrTable[from[z*2]];
prevR = prevR + cin.sqrTable[from[z*2+1]];
to[z] = (short)((prevL + prevR)/2);
}
return size;
}
/******************************************************************************
*
* Function:
*
* Description:
*
******************************************************************************/
static void move8_32( byte *src, byte *dst, int spl )
{
double *dsrc, *ddst;
int dspl;
dsrc = (double *)src;
ddst = (double *)dst;
dspl = spl>>3;
ddst[0] = dsrc[0]; ddst[1] = dsrc[1]; ddst[2] = dsrc[2]; ddst[3] = dsrc[3];
dsrc += dspl; ddst += dspl;
ddst[0] = dsrc[0]; ddst[1] = dsrc[1]; ddst[2] = dsrc[2]; ddst[3] = dsrc[3];
dsrc += dspl; ddst += dspl;
ddst[0] = dsrc[0]; ddst[1] = dsrc[1]; ddst[2] = dsrc[2]; ddst[3] = dsrc[3];
dsrc += dspl; ddst += dspl;
ddst[0] = dsrc[0]; ddst[1] = dsrc[1]; ddst[2] = dsrc[2]; ddst[3] = dsrc[3];
dsrc += dspl; ddst += dspl;
ddst[0] = dsrc[0]; ddst[1] = dsrc[1]; ddst[2] = dsrc[2]; ddst[3] = dsrc[3];
dsrc += dspl; ddst += dspl;
ddst[0] = dsrc[0]; ddst[1] = dsrc[1]; ddst[2] = dsrc[2]; ddst[3] = dsrc[3];
dsrc += dspl; ddst += dspl;
ddst[0] = dsrc[0]; ddst[1] = dsrc[1]; ddst[2] = dsrc[2]; ddst[3] = dsrc[3];
dsrc += dspl; ddst += dspl;
ddst[0] = dsrc[0]; ddst[1] = dsrc[1]; ddst[2] = dsrc[2]; ddst[3] = dsrc[3];
}
/******************************************************************************
*
* Function:
*
* Description:
*
******************************************************************************/
static void move4_32( byte *src, byte *dst, int spl )
{
double *dsrc, *ddst;
int dspl;
dsrc = (double *)src;
ddst = (double *)dst;
dspl = spl>>3;
ddst[0] = dsrc[0]; ddst[1] = dsrc[1];
dsrc += dspl; ddst += dspl;
ddst[0] = dsrc[0]; ddst[1] = dsrc[1];
dsrc += dspl; ddst += dspl;
ddst[0] = dsrc[0]; ddst[1] = dsrc[1];
dsrc += dspl; ddst += dspl;
ddst[0] = dsrc[0]; ddst[1] = dsrc[1];
}
/******************************************************************************
*
* Function:
*
* Description:
*
******************************************************************************/
static void blit8_32( byte *src, byte *dst, int spl )
{
double *dsrc, *ddst;
int dspl;
dsrc = (double *)src;
ddst = (double *)dst;
dspl = spl>>3;
ddst[0] = dsrc[0]; ddst[1] = dsrc[1]; ddst[2] = dsrc[2]; ddst[3] = dsrc[3];
dsrc += 4; ddst += dspl;
ddst[0] = dsrc[0]; ddst[1] = dsrc[1]; ddst[2] = dsrc[2]; ddst[3] = dsrc[3];
dsrc += 4; ddst += dspl;
ddst[0] = dsrc[0]; ddst[1] = dsrc[1]; ddst[2] = dsrc[2]; ddst[3] = dsrc[3];
dsrc += 4; ddst += dspl;
ddst[0] = dsrc[0]; ddst[1] = dsrc[1]; ddst[2] = dsrc[2]; ddst[3] = dsrc[3];
dsrc += 4; ddst += dspl;
ddst[0] = dsrc[0]; ddst[1] = dsrc[1]; ddst[2] = dsrc[2]; ddst[3] = dsrc[3];
dsrc += 4; ddst += dspl;
ddst[0] = dsrc[0]; ddst[1] = dsrc[1]; ddst[2] = dsrc[2]; ddst[3] = dsrc[3];
dsrc += 4; ddst += dspl;
ddst[0] = dsrc[0]; ddst[1] = dsrc[1]; ddst[2] = dsrc[2]; ddst[3] = dsrc[3];
dsrc += 4; ddst += dspl;
ddst[0] = dsrc[0]; ddst[1] = dsrc[1]; ddst[2] = dsrc[2]; ddst[3] = dsrc[3];
}
/******************************************************************************
*
* Function:
*
* Description:
*
******************************************************************************/
#define movs double
static void blit4_32( byte *src, byte *dst, int spl )
{
movs *dsrc, *ddst;
int dspl;
dsrc = (movs *)src;
ddst = (movs *)dst;
dspl = spl>>3;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -