예제 #1
0
        private static AVIStreamHeader ParseStreamHeader(AtomicBinaryReader br, long p)
        {
            var strh = new AVIStreamHeader();

            strh.fccType               = br.ReadUInt32(ref p);
            strh.fccHandler            = br.ReadUInt32(ref p);
            strh.dwFlags               = br.ReadUInt32(ref p);
            strh.wPriority             = br.ReadUInt16(ref p);
            strh.wLanguage             = br.ReadUInt16(ref p);
            strh.dwInitialFrames       = br.ReadUInt32(ref p);
            strh.dwScale               = br.ReadUInt32(ref p);
            strh.dwRate                = br.ReadUInt32(ref p);
            strh.dwStart               = br.ReadUInt32(ref p);
            strh.dwLength              = br.ReadUInt32(ref p);
            strh.dwSuggestedBufferSize = br.ReadUInt32(ref p);
            strh.dwQuality             = br.ReadUInt32(ref p);
            strh.dwSampleSize          = br.ReadUInt32(ref p);
            strh.rcFrameLeft           = br.ReadInt16(ref p);
            strh.rcFrameTop            = br.ReadInt16(ref p);
            strh.rcFrameRight          = br.ReadInt16(ref p);
            strh.rcFrameBottom         = br.ReadInt16(ref p);
            return(strh);
        }
예제 #2
0
        private void ProcessAviChunk(RiffParser rp, uint fourCC, int unpaddedLength, int paddedLength)
        {
            //Debug.Log("CHUNK " + RiffParser.FromFourCC(fourCC) + " " + rp.Position + " " + unpaddedLength + " " + paddedLength);
            switch (fourCC)
            {
            case ID_avih:
                avi.avih = ParseMainHeader(rp.reader, rp.Position);
                break;

            case ID_strh:
                AVIStreamHeader strh = ParseStreamHeader(rp.reader, rp.Position);
                currentStrh4CC = strh.fccType;
                if (currentStrh4CC == FCC_vids)
                {
                    avi.strhVideo = strh;
                }
                else if (currentStrh4CC == FCC_auds)
                {
                    avi.strhAudio = strh;
                }
                else
                {
                                        #if MP_DEBUG
                    Debug.LogWarning("Skipping unknown stream header with fccType=" + currentStrh4CC);
                                        #endif
                }
                break;

            case ID_strf:
                if (currentStrh4CC == FCC_vids)
                {
                    avi.strfVideo = ParseVideoFormatHeader(rp.reader, rp.Position);
                }
                else if (currentStrh4CC == FCC_auds)
                {
                    avi.strfAudio = ParseAudioFormatHeader(rp.reader, rp.Position);
                }
                break;

            case ID_idx1:
                idx1Offset = rp.Position;
                idx1Size   = unpaddedLength;
                // index.idx1 will be filled later in ParseIndex method
                break;

            case ID_dmlh:             // OpenDML header
                avi.odml = ParseOdmlHeader(rp.reader, rp.Position);
                break;

            case ID_indx:             // OpenDML index
                uint streamId;
                var  index = ParseOdmlIndex(rp.reader, rp.Position, out streamId);
                if (streamId == ID_00dc || streamId == ID_00db)
                {
                    avi.videoIndex = index;
                }
                else if (streamId == ID_01wb)
                {
                    avi.audioIndex = index;
                }
                                #if MP_DEBUG
                else
                {
                    Debug.LogWarning("Ignoring index for unknown stream " + RiffParser.FromFourCC(streamId));
                }
                                #endif
                break;

                        #if MP_DEBUG
            default:
                // comment in for logging chunks that are ignored (not relevant for us)
                //Debug.Log("Ignoring CHUNK " + RiffParser.FromFourCC(fourCC) + " " + unpaddedLength + " " + paddedLength);
                break;
                        #endif
            }
        }