atom.c
上传用户:luping1608
上传日期:2007-01-06
资源大小:38k
文件大小:2k
源码类别:

多媒体

开发平台:

Unix_Linux

  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(FILE *stream, quicktime_atom_t *atom)
  10. {
  11. char header[10];
  12. int result;
  13. atom->start = ftell(stream);
  14. quicktime_atom_reset(atom);
  15. if(!fread(header, HEADER_LENGTH, 1, stream)) return 1;
  16. atom->size = quicktime_atom_read_size(header);
  17. atom->end = atom->start + atom->size;
  18. result = quicktime_atom_read_type(header, atom->type);
  19. //printf("%c%c%c%cn", atom->type[0], atom->type[1], atom->type[2], atom->type[3]);
  20. return result;
  21. }
  22. int quicktime_atom_write_header(quicktime_t *file, quicktime_atom_t *atom, char *text)
  23. {
  24. atom->start = quicktime_position(file);
  25. quicktime_write_int32(file, 0);
  26. quicktime_write_char32(file, text);
  27. }
  28. int quicktime_atom_write_footer(quicktime_t *file, quicktime_atom_t *atom)
  29. {
  30. atom->end = quicktime_position(file);
  31. quicktime_set_position(file, atom->start);
  32. quicktime_write_int32(file, atom->end - atom->start);
  33. quicktime_set_position(file, atom->end);
  34. }
  35. int quicktime_atom_is(quicktime_atom_t *atom, char *type)
  36. {
  37. if(atom->type[0] == type[0] &&
  38. atom->type[1] == type[1] &&
  39. atom->type[2] == type[2] &&
  40. atom->type[3] == type[3])
  41. return 1;
  42. else
  43. return 0;
  44. }
  45. long quicktime_atom_read_size(char *data)
  46. {
  47. unsigned long result;
  48. unsigned long a, b, c, d;
  49. a = (unsigned char)data[0];
  50. b = (unsigned char)data[1];
  51. c = (unsigned char)data[2];
  52. d = (unsigned char)data[3];
  53. result = (a<<24) | (b<<16) | (c<<8) | d;
  54. if(result < HEADER_LENGTH) result = HEADER_LENGTH;
  55. return (long)result;
  56. }
  57. int quicktime_atom_read_type(char *data, char *type)
  58. {
  59. type[0] = data[4];
  60. type[1] = data[5];
  61. type[2] = data[6];
  62. type[3] = data[7];
  63. //printf("%c%c%c%c ", type[0], type[1], type[2], type[3]);
  64. // need this for quicktime_check_sig
  65. if(isalpha(type[0]) && isalpha(type[1]) && isalpha(type[2]) && isalpha(type[3]))
  66. return 0;
  67. else
  68. return 1;
  69. }
  70. int quicktime_atom_skip(quicktime_t *file, quicktime_atom_t *atom)
  71. {
  72. return fseek(file->stream, atom->end, SEEK_SET);
  73. }