void RoQReset() { iFile.Seek(0, FS_SEEK.SET); iFile.Read(file, 16); RoQ_init(); status = CinStatus.FMV_LOOPED; }
public CinematicLocal() { image = null; status = CinStatus.FMV_EOF; buf = null; iFile = null; qStatus0 = new byte *[32768]; qStatus1 = new byte *[32768]; }
public override void Close() { if (image != null) { Marshal.FreeHGlobal((IntPtr)image); image = null; buf = null; status = CinStatus.FMV_EOF; } RoQShutdown(); }
void RoQShutdown() { if (status == CinStatus.FMV_IDLE) { return; } status = CinStatus.FMV_IDLE; if (iFile != null) { fileSystem.CloseFile(iFile); iFile = null; } fileName = ""; }
public override bool InitFromFile(string qpath, bool looping) { ushort RoQID; Close(); inMemory = false; animationLength = 100000; fileName = !qpath.Contains('/') && !qpath.Contains('\\') ? $"video/{qpath}" : qpath; iFile = fileSystem.OpenFileRead(fileName); if (iFile == null) { return(false); } ROQSize = iFile.Length; this.looping = looping; CIN_HEIGHT = DEFAULT_CIN_HEIGHT; CIN_WIDTH = DEFAULT_CIN_WIDTH; samplesPerPixel = 4; startTime = 0; buf = null; iFile.Read(file, 16); RoQID = (ushort)(file[0] + (file[1] * 256)); frameRate = file[6]; if (frameRate == 32f) { frameRate = 1000f / 32f; } if (RoQID == ROQ_FILE) { RoQ_init(); status = CinStatus.FMV_PLAY; ImageForTime(0); status = looping ? CinStatus.FMV_PLAY : CinStatus.FMV_IDLE; return(true); } RoQShutdown(); return(false); }
void RoQInterrupt() { byte *framedata; iFile.Read(file, RoQFrameSize + 8); if (RoQPlayed >= ROQSize) { if (looping) { RoQReset(); } else { status = CinStatus.FMV_EOF; } return; } framedata = file; // new frame is ready redump: switch (roq_id) { case ROQ_QUAD_VQ: if ((numQuads & 1) != 0) { normalBuffer0 = t1; RoQPrepMcomp(roqF0, roqF1); blitVQQuad32fs(qStatus1, framedata); buf = image + screenDelta; } else { normalBuffer0 = t0; RoQPrepMcomp(roqF0, roqF1); blitVQQuad32fs(qStatus0, framedata); buf = image; } // first frame if (numQuads == 0) { Unsafe.CopyBlock(image + screenDelta, image, (uint)(samplesPerLine * ysize)); } numQuads++; dirty = true; break; case ROQ_CODEBOOK: decodeCodeBook(framedata, (ushort)roq_flags); break; case ZA_SOUND_MONO: break; case ZA_SOUND_STEREO: break; case ROQ_QUAD_INFO: if (numQuads == -1) { readQuadInfo(framedata); setupQuad(0, 0); } if (numQuads != 1) { numQuads = 0; } break; case ROQ_PACKET: inMemory = roq_flags != 0; RoQFrameSize = 0; break; // for header case ROQ_QUAD_HANG: RoQFrameSize = 0; break; case ROQ_QUAD_JPEG: if (numQuads == 0) { normalBuffer0 = t0; JPEGBlit(image, framedata, RoQFrameSize); Unsafe.CopyBlock(image + screenDelta, image, (uint)(samplesPerLine * ysize)); numQuads++; } break; default: status = CinStatus.FMV_EOF; break; } // read in next frame data if (RoQPlayed >= ROQSize) { if (looping) { RoQReset(); } else { status = CinStatus.FMV_EOF; } return; } framedata += RoQFrameSize; roq_id = framedata[0] + framedata[1] * 256; RoQFrameSize = framedata[2] + framedata[3] * 256 + framedata[4] * 65536; roq_flags = framedata[6] + framedata[7] * 256; roqF0 = framedata[7]; roqF1 = framedata[6]; if (RoQFrameSize > 65536 || roq_id == 0x1084) { common.DPrintf("roq_size>65536||roq_id==0x1084\n"); status = CinStatus.FMV_EOF; if (looping) { RoQReset(); } return; } if (inMemory && status != CinStatus.FMV_EOF) { inMemory = false; framedata += 8; goto redump; } // one more frame hits the dust // // assert(RoQFrameSize <= 65536); // r = Sys_StreamedRead( file, RoQFrameSize+8, 1, iFile ); RoQPlayed += RoQFrameSize + 8; }
public override void ResetTime(int time) { startTime = -1; //: backEnd.viewDef ? 1000 * backEnd.viewDef.floatTime : -1; status = CinStatus.FMV_PLAY; }
public override CinData ImageForTime(int milliseconds) { CinData cinData = default; if (milliseconds < 0) { milliseconds = 0; } if (r_skipROQ.Bool || status == CinStatus.FMV_EOF || status == CinStatus.FMV_IDLE) { return(cinData); } if (buf == null || startTime == -1) { if (startTime == -1) { RoQReset(); } startTime = milliseconds; } tfps = (int)((milliseconds - startTime) * frameRate / 1000); if (tfps < 0) { tfps = 0; } if (tfps < numQuads) { RoQReset(); buf = null; status = CinStatus.FMV_PLAY; } if (buf == null) { while (buf == null) { RoQInterrupt(); } } else { while (tfps != numQuads && status == CinStatus.FMV_PLAY) { RoQInterrupt(); } } if (status == CinStatus.FMV_LOOPED) { status = CinStatus.FMV_PLAY; while (buf == null && status == CinStatus.FMV_PLAY) { RoQInterrupt(); } startTime = milliseconds; } if (status == CinStatus.FMV_EOF) { if (looping) { RoQReset(); buf = null; if (status == CinStatus.FMV_LOOPED) { status = CinStatus.FMV_PLAY; } while (buf == null && status == CinStatus.FMV_PLAY) { RoQInterrupt(); } startTime = milliseconds; } else { status = CinStatus.FMV_IDLE; RoQShutdown(); } } cinData.imageWidth = CIN_WIDTH; cinData.imageHeight = CIN_HEIGHT; cinData.status = (int)status; cinData.image = buf; return(cinData); }