AVIReadHandler.cpp
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:55k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. // VirtualDub - Video processing and capture application
  2. // Copyright (C) 1998-2001 Avery Lee
  3. //
  4. // This program is free software; you can redistribute it and/or modify
  5. // it under the terms of the GNU General Public License as published by
  6. // the Free Software Foundation; either version 2 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // This program is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. // GNU General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU General Public License
  15. // along with this program; if not, write to the Free Software
  16. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. #include <crtdbg.h>
  18. #include <windows.h>
  19. #include "AVIReadHandler.h"
  20. #include "FastReadStream.h"
  21. //#include "ProgressDialog.h"
  22. #include "AVIIndex.h"
  23. #include "Error.h"
  24. #include "List.h"
  25. #include "Fixes.h"
  26. #include "File64.h"
  27. #include "Avisynth.h"
  28. //#define STREAMING_DEBUG
  29. // HACK!!!!
  30. CRITICAL_SECTION g_diskcs;
  31. bool g_disklockinited=false;
  32. ///////////////////////////////////////////
  33. typedef __int64 QUADWORD;
  34. // The following comes from the OpenDML 1.0 spec for extended AVI files
  35. // bIndexType codes
  36. //
  37. #define AVI_INDEX_OF_INDEXES 0x00 // when each entry in aIndex
  38. // array points to an index chunk
  39. #define AVI_INDEX_OF_CHUNKS 0x01 // when each entry in aIndex
  40. // array points to a chunk in the file
  41. #define AVI_INDEX_IS_DATA 0x80 // when each entry is aIndex is
  42. // really the data
  43. // bIndexSubtype codes for INDEX_OF_CHUNKS
  44. #define AVI_INDEX_2FIELD 0x01 // when fields within frames
  45. // are also indexed
  46. struct _avisuperindex_entry {
  47. QUADWORD qwOffset; // absolute file offset, offset 0 is
  48. // unused entry??
  49. DWORD dwSize; // size of index chunk at this offset
  50. DWORD dwDuration; // time span in stream ticks
  51. };
  52. struct _avistdindex_entry {
  53. DWORD dwOffset; // qwBaseOffset + this is absolute file offset
  54. DWORD dwSize; // bit 31 is set if this is NOT a keyframe
  55. };
  56. struct _avifieldindex_entry {
  57. DWORD dwOffset;
  58. DWORD dwSize;
  59. DWORD dwOffsetField2;
  60. };
  61. #pragma pack(push)
  62. #pragma pack(2)
  63. typedef struct _avisuperindex_chunk {
  64. FOURCC fcc; // 抜x##