/* ================== SCR_ReadNextFrame ================== */ byte *SCR_ReadNextFrame (void) { int32_t r; int32_t command; byte samples[22050/14*4]; byte compressed[0x20000]; int32_t size; byte *pic; cblock_t in, huf1; int32_t start, end, count; // read the next frame r = FS_FRead (&command, 4, 1, cl.cinematic_file); if (r == 0) // we'll give it one more chance r = FS_FRead (&command, 4, 1, cl.cinematic_file); if (r != 4) return NULL; command = LittleLong(command); if (command == 2) return NULL; // last frame marker if (command == 1) { // read palette FS_Read (cl.cinematicpalette, sizeof(cl.cinematicpalette), cl.cinematic_file); cl.cinematicpalette_active = 0; // dubious.... exposes an edge case } // decompress the next frame FS_Read (&size, 4, cl.cinematic_file); size = LittleLong(size); if (size > sizeof(compressed) || size < 1) Com_Error (ERR_DROP, "Bad compressed frame size"); FS_Read (compressed, size, cl.cinematic_file); // read sound start = cl.cinematicframe*cin.s_rate/14; end = (cl.cinematicframe+1)*cin.s_rate/14; count = end - start; FS_Read (samples, count*cin.s_width*cin.s_channels, cl.cinematic_file); S_RawSamples (count, cin.s_rate, cin.s_width, cin.s_channels, samples, Cvar_VariableValue("s_volume")); in.data = compressed; in.count = size; huf1 = Huff1Decompress (in); pic = huf1.data; cl.cinematicframe++; return pic; }
byte * SCR_ReadNextFrame(void) { int r; int command; byte samples[22050 / 14 * 4]; byte compressed[0x20000]; int size; byte *pic; cblock_t in, huf1; int start, end, count; /* read the next frame */ r = FS_FRead(&command, 4, 1, cl.cinematic_file); if (r == 0) { /* we'll give it one more chance */ r = FS_FRead(&command, 4, 1, cl.cinematic_file); } if (r != 4) { return NULL; } command = LittleLong(command); if (command == 2) { return NULL; /* last frame marker */ } if (command == 1) { /* read palette */ FS_Read(cl.cinematicpalette, sizeof(cl.cinematicpalette), cl.cinematic_file); cl.cinematicpalette_active = 0; } /* decompress the next frame */ FS_Read(&size, 4, cl.cinematic_file); size = LittleLong(size); if (((unsigned long)size > sizeof(compressed)) || (size < 1)) { Com_Error(ERR_DROP, "Bad compressed frame size"); } FS_Read(compressed, size, cl.cinematic_file); /* read sound */ start = cl.cinematicframe * cin.s_rate / 14; end = (cl.cinematicframe + 1) * cin.s_rate / 14; count = end - start; FS_Read(samples, count * cin.s_width * cin.s_channels, cl.cinematic_file); if (cin.s_width == 2) { for (r = 0; r < count * cin.s_channels; r++) { ((short *)samples)[r] = LittleShort(((short *)samples)[r]); } } S_RawSamples(count, cin.s_rate, cin.s_width, cin.s_channels, samples, Cvar_VariableValue("s_volume")); in.data = compressed; in.count = size; huf1 = Huff1Decompress(in); pic = huf1.data; cl.cinematicframe++; return pic; }