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

流媒体/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_UTIL_INCLUDED__
  22. #define __MP4_UTIL_INCLUDED__
  23. #include <assert.h>
  24. #ifndef ASSERT
  25. #ifdef NDEBUG
  26. #define ASSERT(expr)
  27. #else
  28. #define ASSERT(expr) 
  29. if (!(expr)) { 
  30. fflush(stdout); 
  31. assert((expr)); 
  32. }
  33. #endif
  34. #endif
  35. #ifdef NDEBUG
  36. #define WARNING(expr)
  37. #else
  38. #define WARNING(expr) 
  39. if (expr) { 
  40. fflush(stdout); 
  41. fprintf(stderr, "Warning (%s) in %s at line %un", 
  42. __STRING(expr), __FILE__, __LINE__); 
  43. }
  44. #endif
  45. #define VERBOSE(exprverbosity, verbosity, expr)
  46. if (((exprverbosity) & (verbosity)) == (exprverbosity)) { expr; }
  47. #define VERBOSE_ERROR(verbosity, expr)
  48. VERBOSE(MP4_DETAILS_ERROR, verbosity, expr)
  49. #define VERBOSE_WARNING(verbosity, expr)
  50. VERBOSE(MP4_DETAILS_WARNING, verbosity, expr)
  51. #define VERBOSE_READ(verbosity, expr)
  52. VERBOSE(MP4_DETAILS_READ, verbosity, expr)
  53. #define VERBOSE_READ_TABLE(verbosity, expr)
  54. VERBOSE((MP4_DETAILS_READ | MP4_DETAILS_TABLE), verbosity, expr)
  55. #define VERBOSE_READ_SAMPLE(verbosity, expr)
  56. VERBOSE((MP4_DETAILS_READ | MP4_DETAILS_SAMPLE), verbosity, expr)
  57. #define VERBOSE_READ_HINT(verbosity, expr)
  58. VERBOSE((MP4_DETAILS_READ | MP4_DETAILS_HINT), verbosity, expr)
  59. #define VERBOSE_WRITE(verbosity, expr)
  60. VERBOSE(MP4_DETAILS_WRITE, verbosity, expr)
  61. #define VERBOSE_WRITE_TABLE(verbosity, expr)
  62. VERBOSE((MP4_DETAILS_WRITE | MP4_DETAILS_TABLE), verbosity, expr)
  63. #define VERBOSE_WRITE_SAMPLE(verbosity, expr)
  64. VERBOSE((MP4_DETAILS_WRITE | MP4_DETAILS_SAMPLE), verbosity, expr)
  65. #define VERBOSE_WRITE_HINT(verbosity, expr)
  66. VERBOSE((MP4_DETAILS_WRITE | MP4_DETAILS_HINT), verbosity, expr)
  67. #define VERBOSE_FIND(verbosity, expr)
  68. VERBOSE(MP4_DETAILS_FIND, verbosity, expr)
  69. #define VERBOSE_ISMA(verbosity, expr)
  70. VERBOSE(MP4_DETAILS_ISMA, verbosity, expr)
  71. #define VERBOSE_EDIT(verbosity, expr)
  72. VERBOSE(MP4_DETAILS_EDIT, verbosity, expr)
  73. inline void Indent(FILE* pFile, u_int8_t depth) {
  74. fprintf(pFile, "%*c", depth, ' ');
  75. }
  76. inline void MP4Printf(const char* fmt, ...) {
  77. va_list ap;
  78. va_start(ap, fmt);
  79. // TBD API call to set error_msg_func instead of just printf
  80. fprintf(stdout, fmt, ap);
  81. va_end(ap);
  82. }
  83. class MP4Error {
  84. public:
  85. MP4Error() {
  86. m_errno = 0;
  87. m_errstring = NULL;
  88. m_where = NULL;
  89. m_free = 0;
  90. }
  91. ~MP4Error() {
  92.   if (m_free != 0) {
  93.     free((void *)m_errstring);
  94.   }
  95. }
  96. MP4Error(int err, const char* where = NULL) {
  97. m_errno = err;
  98. m_errstring = NULL;
  99. m_where = where;
  100. m_free = 0;
  101. }
  102. MP4Error(const char *format, const char *where, ...) {
  103.   char *string;
  104.   m_errno = 0;
  105.   string = (char *)malloc(512);
  106.   m_where = where;
  107.   if (string) {
  108.     va_list ap;
  109.     va_start(ap, where);
  110.     vsnprintf(string, 512, format, ap);
  111.     va_end(ap);
  112.     m_errstring = string;
  113.     m_free = 1;
  114.   } else {
  115.     m_errstring = format;
  116.     m_free = 0;
  117.   }
  118. }
  119. MP4Error(int err, const char* format, const char* where, ...) {
  120.   char *string;
  121.   m_errno = err;
  122.   string = (char *)malloc(512);
  123.   m_where = where;
  124.   if (string) {
  125.     va_list ap;
  126.     va_start(ap, where);
  127.     vsnprintf(string, 512, format, ap);
  128.     va_end(ap);
  129.     m_errstring = string;
  130.     m_free = 1;
  131.   } else {
  132.     m_errstring = format;
  133.     m_free = 0;
  134.   }
  135. }
  136. void Print(FILE* pFile = stderr);
  137. int m_free;
  138. int m_errno;
  139. const char* m_errstring;
  140. const char* m_where;
  141. };
  142. void MP4HexDump(
  143. u_int8_t* pBytes, u_int32_t numBytes,
  144. FILE* pFile = stdout, u_int8_t indent = 0);
  145. inline void* MP4Malloc(size_t size) {
  146. void* p = malloc(size);
  147. if (p == NULL && size > 0) {
  148. throw new MP4Error(errno);
  149. }
  150. return p;
  151. }
  152. inline void* MP4Calloc(size_t size) {
  153. return memset(MP4Malloc(size), 0, size);
  154. }
  155. inline char* MP4Stralloc(const char* s1) {
  156. char* s2 = (char*)MP4Malloc(strlen(s1) + 1);
  157. strcpy(s2, s1);
  158. return s2;
  159. }
  160. inline void* MP4Realloc(void* p, u_int32_t newSize) {
  161. // workaround library bug
  162. if (p == NULL && newSize == 0) {
  163. return NULL;
  164. }
  165. p = realloc(p, newSize);
  166. if (p == NULL && newSize > 0) {
  167. throw new MP4Error(errno);
  168. }
  169. return p;
  170. }
  171. inline void MP4Free(void* p) {
  172. free(p);
  173. }
  174. inline u_int32_t STRTOINT32(const char* s) {
  175. return (s[0] << 24) | (s[1] << 16) | (s[2] << 8) | s[3];
  176. }
  177. inline void INT32TOSTR(u_int32_t i, char* s) {
  178. s[0] = ((i >> 24) & 0xFF); s[1] = ((i >> 16) & 0xFF); 
  179. s[2] = ((i >> 8) & 0xFF); s[3] = (i & 0xFF); s[4] = 0;
  180. }
  181. inline MP4Timestamp MP4GetAbsTimestamp() {
  182. struct timeval tv;
  183. gettimeofday(&tv, NULL);
  184. return tv.tv_sec + 209606400; // MP4 start date is 1/1/1904
  185. }
  186. u_int64_t MP4ConvertTime(u_int64_t t, 
  187. u_int32_t oldTimeScale, u_int32_t newTimeScale);
  188. bool MP4NameFirstMatches(const char* s1, const char* s2);
  189. bool MP4NameFirstIndex(const char* s, u_int32_t* pIndex);
  190. char* MP4NameFirst(const char *s);
  191. const char* MP4NameAfterFirst(const char *s);
  192. char* MP4ToBase16(const u_int8_t* pData, u_int32_t dataSize);
  193. char* MP4ToBase64(const u_int8_t* pData, u_int32_t dataSize);
  194. #endif /* __MP4_UTIL_INCLUDED__ */