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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include <ctype.h>
  2. #include "quicktime.h"
  3. int quicktime_atom_reset(quicktime_atom_t *atom)
  4. {
  5. atom->end = 0;
  6. atom->type[0] = atom->type[1] = atom->type[2] = atom->type[3] = 0;
  7. return 0;
  8. }
  9. int quicktime_atom_read_header(quicktime_t *file, quicktime_atom_t *atom)
  10. {
  11. char header[10];
  12. int result;
  13. long size2;
  14. atom->start = quicktime_position(file);
  15. quicktime_atom_reset(atom);
  16. if(!quicktime_read_data(file, header, HEADER_LENGTH)) return 1;
  17. result = quicktime_atom_read_type(header, atom->type);
  18. atom->size = quicktime_atom_read_size(header);
  19. if (atom->size == 0) {
  20. atom->size = file->total_length - atom->start;
  21. }
  22. atom->end = atom->start + atom->size;
  23. /* Skip placeholder atom */
  24. if(quicktime_match_32(atom->type, "wide"))
  25. {
  26. atom->start = quicktime_position(file);
  27. quicktime_atom_reset(atom);
  28. if(!quicktime_read_data(file, header, HEADER_LENGTH)) 
  29. return 1;
  30. result = quicktime_atom_read_type(header, atom->type);
  31. atom->size -= 8;
  32. if(!atom->size)
  33. {
  34. /* Wrapper ended.  Get new atom size */
  35. atom->size = quicktime_atom_read_size(header);
  36. if (atom->size == 0) {
  37. atom->size = file->total_length - atom->start;
  38. }
  39. }
  40. atom->end = atom->start + atom->size;
  41. }
  42. else
  43. /* Get extended size */
  44. if(atom->size == 1)
  45. {
  46. if(!quicktime_read_data(file, header, HEADER_LENGTH)) return 1;
  47. atom->size = quicktime_atom_read_size64(header);
  48. }
  49. #ifdef DEBUG
  50. printf("Reading atom %.4s length %un", atom->type, atom->size);
  51. #endif
  52. return result;
  53. }
  54. int quicktime_atom_write_header(quicktime_t *file, quicktime_atom_t *atom, char *text)
  55. {
  56. atom->start = quicktime_position(file);
  57. quicktime_write_int32(file, 0);
  58. quicktime_write_char32(file, text);
  59. }
  60. int quicktime_atom_write_footer(quicktime_t *file, quicktime_atom_t *atom)
  61. {
  62. atom->end = quicktime_position(file);
  63. quicktime_set_position(file, atom->start);
  64. quicktime_write_int32(file, atom->end - atom->start);
  65. quicktime_set_position(file, atom->end);
  66. }
  67. int quicktime_atom_is(quicktime_atom_t *atom, char *type)
  68. {
  69. if(atom->type[0] == type[0] &&
  70. atom->type[1] == type[1] &&
  71. atom->type[2] == type[2] &&
  72. atom->type[3] == type[3])
  73. return 1;
  74. else
  75. return 0;
  76. }
  77. long quicktime_atom_read_size(char *data)
  78. {
  79. unsigned long result;
  80. unsigned long a, b, c, d;
  81. a = (unsigned char)data[0];
  82. b = (unsigned char)data[1];
  83. c = (unsigned char)data[2];
  84. d = (unsigned char)data[3];
  85. result = (a<<24) | (b<<16) | (c<<8) | d;
  86. if(result > 0 && result < HEADER_LENGTH) result = HEADER_LENGTH;
  87. return (long)result;
  88. }
  89. u_int64_t quicktime_atom_read_size64(char *data)
  90. {
  91. u_int64_t result = 0;
  92. int i;
  93. for (i = 0; i < 8; i++) {
  94. result |= data[i];
  95. if (i < 7) {
  96. result <<= 8;
  97. }
  98. }
  99. if(result < HEADER_LENGTH) 
  100. result = HEADER_LENGTH;
  101. return result;
  102. }
  103. int quicktime_atom_read_type(char *data, char *type)
  104. {
  105. type[0] = data[4];
  106. type[1] = data[5];
  107. type[2] = data[6];
  108. type[3] = data[7];
  109. /*printf("%c%c%c%c ", type[0], type[1], type[2], type[3]); */
  110. /* need this for quicktime_check_sig */
  111. if(isalpha(type[0]) && isalpha(type[1]) && isalpha(type[2]) && isalpha(type[3]))
  112. return 0;
  113. else
  114. return 1;
  115. }
  116. int quicktime_atom_skip(quicktime_t *file, quicktime_atom_t *atom)
  117. {
  118. /* printf("skipping atom %.4s, size %un", atom->type, atom->size); */
  119. return quicktime_set_position(file, atom->end);
  120. }