mp4array.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:3k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  */
  21. #ifndef __MP4_ARRAY_INCLUDED__
  22. #define __MP4_ARRAY_INCLUDED__
  23. typedef u_int32_t MP4ArrayIndex;
  24. class MP4Array {
  25. public:
  26. MP4Array() {
  27. m_numElements = 0;
  28. m_maxNumElements = 0;
  29. }
  30. inline bool ValidIndex(MP4ArrayIndex index) {
  31. if (m_numElements == 0 || index > m_numElements - 1) {
  32. return false;
  33. }
  34. return true;
  35. }
  36. inline MP4ArrayIndex Size(void) {
  37. return m_numElements;
  38. }
  39. inline MP4ArrayIndex MaxSize(void) {
  40. return m_maxNumElements;
  41. }
  42. protected:
  43. MP4ArrayIndex m_numElements;
  44. MP4ArrayIndex m_maxNumElements;
  45. };
  46. // macro to generate subclasses
  47. // we use this as an alternative to templates
  48. // due to the excessive compile time price of extensive template usage
  49. #define MP4ARRAY_DECL(name, type) 
  50. class name##Array : public MP4Array { 
  51. public: 
  52. name##Array() { 
  53. m_elements = NULL; 
  54. ~name##Array() { 
  55. MP4Free(m_elements); 
  56. inline void Add(type newElement) { 
  57. Insert(newElement, m_numElements); 
  58. void Insert(type newElement, MP4ArrayIndex newIndex) { 
  59. if (newIndex > m_numElements) { 
  60. throw new MP4Error(ERANGE, "MP4Array::Insert"); 
  61. if (m_numElements == m_maxNumElements) { 
  62. m_maxNumElements = MAX(m_maxNumElements, 1) * 2; 
  63. m_elements = (type*)MP4Realloc(m_elements, 
  64. m_maxNumElements * sizeof(type)); 
  65. memmove(&m_elements[newIndex + 1], &m_elements[newIndex], 
  66. (m_numElements - newIndex) * sizeof(type)); 
  67. m_elements[newIndex] = newElement; 
  68. m_numElements++; 
  69. void Delete(MP4ArrayIndex index) { 
  70. if (!ValidIndex(index)) { 
  71. throw new MP4Error(ERANGE, "MP4Array::Delete"); 
  72. memmove(&m_elements[index], &m_elements[index + 1], 
  73. (m_numElements - index) * sizeof(type)); 
  74. m_numElements--; 
  75. void Resize(MP4ArrayIndex newSize) { 
  76. m_numElements = newSize; 
  77. m_maxNumElements = newSize; 
  78. m_elements = (type*)MP4Realloc(m_elements, 
  79. m_maxNumElements * sizeof(type)); 
  80. type& operator[](MP4ArrayIndex index) { 
  81. if (!ValidIndex(index)) { 
  82. throw new MP4Error(ERANGE, "MP4Array::[]"); 
  83. return m_elements[index]; 
  84. protected: 
  85. type* m_elements; 
  86. };
  87. MP4ARRAY_DECL(MP4Integer8, u_int8_t)
  88. MP4ARRAY_DECL(MP4Integer16, u_int16_t)
  89. MP4ARRAY_DECL(MP4Integer32, u_int32_t)
  90. MP4ARRAY_DECL(MP4Integer64, u_int64_t)
  91. MP4ARRAY_DECL(MP4Float32, float)
  92. MP4ARRAY_DECL(MP4Float64, double)
  93. MP4ARRAY_DECL(MP4String, char*)
  94. MP4ARRAY_DECL(MP4Bytes, u_int8_t*)
  95. #endif /* __MP4_ARRAY_INCLUDED__ */