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

多媒体编程

开发平台:

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. #ifndef f_AVISTRIPESYSTEM_H
  18. #define f_AVISTRIPESYSTEM_H
  19. #include <vfw.h>
  20. #include "VirtualDub.h"
  21. #include "AVIReadHandler.h"
  22. #pragma warning(push)
  23. #pragma warning(disable: 4200) // nonstandard extension used
  24. class AVIStripe {
  25. public:
  26. enum {
  27. FLAG_INDEX = 1,
  28. FLAG_VIDEO = 2,
  29. FLAG_AUDIO = 4,
  30. MODE_MASTER = FLAG_INDEX | FLAG_AUDIO, // contains index + *all* audio
  31. MODE_INDEX = FLAG_INDEX, // contains index only
  32. MODE_VIDEO = FLAG_VIDEO, // contains video segments
  33. MODE_AUDIO = FLAG_AUDIO, // contains audio segments
  34. MODE_BOTH = FLAG_VIDEO | FLAG_AUDIO, // contains a/v segments
  35. };
  36. long lBufferSize, lChunkSize;
  37. int iNameLen;
  38. char cStripeMode;
  39. signed char scPriority;
  40. char szName[];
  41. void *operator new(size_t stSize, int iNameBytes);
  42. BOOL isIndex() { return !!(cStripeMode & FLAG_INDEX); }
  43. BOOL isVideo() { return !!(cStripeMode & FLAG_VIDEO); }
  44. BOOL isAudio() { return !!(cStripeMode & FLAG_AUDIO); }
  45. };
  46. #pragma warning(pop)
  47. class AVIStripeSystem {
  48. private:
  49. int nStripes;
  50. AVIStripe **stripe;
  51. void _construct(int nStripes);
  52. void _destruct();
  53. public:
  54. AVIStripeSystem(int nStripes);
  55. AVIStripeSystem(char *szFile);
  56. ~AVIStripeSystem();
  57. void Save(char *szFile);
  58. int getStripeCount();
  59. AVIStripe * getStripeInfo(int nStripe);
  60. };
  61. ////////////////////////////////////
  62. class AVIStripeIndexEntry {
  63. public:
  64. long lSampleFirst;
  65. long lSampleCount;
  66. long lStripe;
  67. long lStripeSample;
  68. };
  69. #define DEFINETEST(type) bool inline operator##type(long lSample, AVIStripeIndexEntry& asie)
  70. DEFINETEST(< ) { return lSample <  asie.lSampleFirst; }
  71. DEFINETEST(>=) { return lSample >= asie.lSampleFirst; }
  72. DEFINETEST(> ) { return lSample >= asie.lSampleFirst + asie.lSampleCount; }
  73. DEFINETEST(<=) { return lSample <  asie.lSampleFirst + asie.lSampleCount; }
  74. DEFINETEST(==) {
  75. long t = lSample - asie.lSampleFirst;
  76. return t>=0 && t<asie.lSampleCount;
  77. }
  78. DEFINETEST(!=) {
  79. long t = lSample - asie.lSampleFirst;
  80. return t<0 || t>=asie.lSampleCount;
  81. }
  82. #undef DEFINETEST
  83. ////////////////////////////////////
  84. class AVIStripeIndexLookup {
  85. private:
  86. AVIStripeIndexEntry *index_table;
  87. long index_table_size;
  88. public:
  89. AVIStripeIndexLookup(IAVIReadStream *pAVIIndex);
  90. ~AVIStripeIndexLookup();
  91. AVIStripeIndexEntry *lookup(long sample);
  92. };
  93. #endif