public static AviStreamHeader Read(FourCCHeader fcc, BinaryReader br) { var r = new AviStreamHeader(); r.fcc = fcc.fourcc; r.cb = fcc.bytes; if (0 != r.fcc.CompareTo("strh") || 56 != r.cb) { throw new ArgumentException("AviStreamHeader fourcc/size mismatch"); } r.fccType = Common.ReadFourCC(br); r.fccHandler = Common.ReadFourCC(br); r.dwFlags = br.ReadUInt32(); r.wPriority = br.ReadUInt16(); r.wLanguage = br.ReadUInt16(); r.dwInitialFrames = br.ReadUInt32(); r.dwScale = br.ReadUInt32(); r.dwRate = br.ReadUInt32(); r.dwStart = br.ReadUInt32(); r.dwLength = br.ReadUInt32(); r.dwSuggestedBufferSize = br.ReadUInt32(); r.dwQuality = br.ReadUInt32(); r.dwSampleSize = br.ReadUInt32(); r.left = br.ReadInt16(); r.top = br.ReadInt16(); r.right = br.ReadInt16(); r.bottom = br.ReadInt16(); return(r); }
/* RIFF "AVI " * LIST "hdrl" * avih AviMainHeader * LIST "strl" * strh AviStreamHeader * strf BitmapInfoHeader * LIST "movi" * 00db * 00db * ... * RIFF "AVIX" * LIST "movi" * 00db * 00db * ... */ public bool Open(string path) { mImagePos.Clear(); mBr = new BinaryReader(new FileStream(path, FileMode.Open, FileAccess.Read)); var riffHeader = RiffHeader.Read(mBr); if (0 != riffHeader.riff.CompareTo("RIFF") || 0 != riffHeader.type.CompareTo("AVI ")) { Console.WriteLine("E: this is not AVI"); return(false); } try { do { var fcc = FourCCHeader.Read(mBr); Console.WriteLine("{0}", fcc.fourcc); switch (fcc.fourcc) { case "RIFF": var riffType = Common.ReadFourCC(mBr); if (0 != riffType.CompareTo("AVIX")) { Console.WriteLine("D: Unknown Riff {0}", riffType); } break; case "LIST": var lst = ListHeader.Read(fcc, mBr); break; case "avih": mAviMainHeader = AviMainHeader.Read(fcc, mBr); break; case "strh": mAviStreamHeader = AviStreamHeader.Read(fcc, mBr); break; case "strf": if (0 == mAviStreamHeader.fccType.CompareTo("vids")) { mBmpih = BitmapInfoHeader.Read(fcc, mBr); } else { SkipUnknownHeader(fcc); } break; case "00db": case "00dc": ReadOneImage(fcc); break; default: SkipUnknownHeader(fcc); break; } } while (true); } catch (EndOfStreamException) { // OK } Console.WriteLine("Total {0} images", mImagePos.Count); if (mImagePos.Count == 0) { Close(); return(false); } return(true); }