public static ListHeader Read(FourCCHeader fcc, BinaryReader br) { var r = new ListHeader(); if (0 != fcc.fourcc.CompareTo("LIST")) { throw new ArgumentException("LIST header mismatch"); } r.fcc = fcc.fourcc; r.bytes = fcc.bytes; r.type = Common.ReadFourCC(br); 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); }