Exemple #1
0
 void RoQReset()
 {
     iFile.Seek(0, FS_SEEK.SET);
     iFile.Read(file, 16);
     RoQ_init();
     status = CinStatus.FMV_LOOPED;
 }
Exemple #2
0
        public CinematicLocal()
        {
            image  = null;
            status = CinStatus.FMV_EOF;
            buf    = null;
            iFile  = null;

            qStatus0 = new byte *[32768];
            qStatus1 = new byte *[32768];
        }
Exemple #3
0
 public override void Close()
 {
     if (image != null)
     {
         Marshal.FreeHGlobal((IntPtr)image);
         image  = null;
         buf    = null;
         status = CinStatus.FMV_EOF;
     }
     RoQShutdown();
 }
Exemple #4
0
        void RoQShutdown()
        {
            if (status == CinStatus.FMV_IDLE)
            {
                return;
            }
            status = CinStatus.FMV_IDLE;

            if (iFile != null)
            {
                fileSystem.CloseFile(iFile); iFile = null;
            }

            fileName = "";
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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;
        }
Exemple #7
0
 public override void ResetTime(int time)
 {
     startTime = -1; //: backEnd.viewDef ? 1000 * backEnd.viewDef.floatTime : -1;
     status    = CinStatus.FMV_PLAY;
 }
Exemple #8
0
        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);
        }