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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include "quicktime.h"
  2. #define DEFAULT_INFO "Made with Quicktime for Linux"
  3. int quicktime_udta_init(quicktime_udta_t *udta)
  4. {
  5. udta->copyright = 0;
  6. udta->copyright_len = 0;
  7. udta->name = 0;
  8. udta->name_len = 0;
  9. udta->info = malloc(strlen(DEFAULT_INFO) + 1);
  10. udta->info_len = strlen(DEFAULT_INFO);
  11. sprintf(udta->info, DEFAULT_INFO);
  12. quicktime_hnti_init(&(udta->hnti));
  13. return 0;
  14. }
  15. int quicktime_udta_delete(quicktime_udta_t *udta)
  16. {
  17. if(udta->copyright_len)
  18. {
  19. free(udta->copyright);
  20. }
  21. if(udta->name_len)
  22. {
  23. free(udta->name);
  24. }
  25. if(udta->info_len)
  26. {
  27. free(udta->info);
  28. }
  29. quicktime_hnti_delete(&(udta->hnti));
  30. quicktime_udta_init(udta);
  31. return 0;
  32. }
  33. int quicktime_udta_dump(quicktime_udta_t *udta)
  34. {
  35. printf(" user data (udta)n");
  36. if(udta->copyright_len) printf("  copyright -> %sn", udta->copyright);
  37. if(udta->name_len) printf("  name -> %sn", udta->name);
  38. if(udta->info_len) printf("  info -> %sn", udta->info);
  39. quicktime_hnti_dump(&udta->hnti);
  40. }
  41. int quicktime_read_udta(quicktime_t *file, quicktime_udta_t *udta, quicktime_atom_t *udta_atom)
  42. {
  43. quicktime_atom_t leaf_atom;
  44. int result = 0;
  45. do
  46. {
  47. /* udta atoms can be terminated by a 4 byte zero */
  48. if (udta_atom->end - quicktime_position(file) < HEADER_LENGTH) {
  49. u_char trash[HEADER_LENGTH];
  50. int remainder = udta_atom->end - quicktime_position(file);
  51. quicktime_read_data(file, trash, remainder);
  52. break;
  53. }
  54. quicktime_atom_read_header(file, &leaf_atom);
  55. if(quicktime_atom_is(&leaf_atom, "ヽpy"))
  56. {
  57. result += quicktime_read_udta_string(file, &(udta->copyright), &(udta->copyright_len));
  58. }
  59. else
  60. if(quicktime_atom_is(&leaf_atom, "﹏am"))
  61. {
  62. result += quicktime_read_udta_string(file, &(udta->name), &(udta->name_len));
  63. }
  64. else
  65. if(quicktime_atom_is(&leaf_atom, "﹊nf"))
  66. {
  67. result += quicktime_read_udta_string(file, &(udta->info), &(udta->info_len));
  68. }
  69. else if (quicktime_atom_is(&leaf_atom, "hnti")) {
  70. quicktime_read_hnti(file, &(udta->hnti), &leaf_atom);
  71. }
  72. else
  73. quicktime_atom_skip(file, &leaf_atom);
  74. }while(quicktime_position(file) < udta_atom->end);
  75. return result;
  76. }
  77. int quicktime_write_udta(quicktime_t *file, quicktime_udta_t *udta)
  78. {
  79. quicktime_atom_t atom, subatom;
  80. /*
  81.  * Empty udta atom makes Darwin Streaming Server unhappy
  82.  * so avoid it
  83.  */
  84. if (file->use_mp4) {
  85. if (udta->copyright_len == 0
  86.   && udta->hnti.rtp.string == NULL) {
  87. return;
  88. }
  89. } else {
  90. if (udta->copyright_len + udta->name_len + udta->info_len == 0
  91.   && udta->hnti.rtp.string == NULL) {
  92. return;
  93. }
  94. }
  95. quicktime_atom_write_header(file, &atom, "udta");
  96. if(udta->copyright_len)
  97. {
  98. quicktime_atom_write_header(file, &subatom, "ヽpy");
  99. quicktime_write_udta_string(file, udta->copyright, udta->copyright_len);
  100. quicktime_atom_write_footer(file, &subatom);
  101. }
  102. if(udta->name_len && !file->use_mp4)
  103. {
  104. quicktime_atom_write_header(file, &subatom, "﹏am");
  105. quicktime_write_udta_string(file, udta->name, udta->name_len);
  106. quicktime_atom_write_footer(file, &subatom);
  107. }
  108. if(udta->info_len && !file->use_mp4)
  109. {
  110. quicktime_atom_write_header(file, &subatom, "﹊nf");
  111. quicktime_write_udta_string(file, udta->info, udta->info_len);
  112. quicktime_atom_write_footer(file, &subatom);
  113. }
  114. if (udta->hnti.rtp.string != NULL) {
  115. quicktime_write_hnti(file, &(udta->hnti));
  116. }
  117. quicktime_atom_write_footer(file, &atom);
  118. }
  119. int quicktime_read_udta_string(quicktime_t *file, char **string, int *size)
  120. {
  121. int result;
  122. if(*size) free(*string);
  123. *size = quicktime_read_int16(file);  /* Size of string */
  124. quicktime_read_int16(file);  /* Discard language code */
  125. *string = malloc(*size + 1);
  126. result = quicktime_read_data(file, *string, *size);
  127. (*string)[*size] = 0;
  128. return !result;
  129. }
  130. int quicktime_write_udta_string(quicktime_t *file, char *string, int size)
  131. {
  132. int new_size = strlen(string);
  133. int result;
  134. quicktime_write_int16(file, new_size);    /* String size */
  135. quicktime_write_int16(file, 0);    /* Language code */
  136. result = quicktime_write_data(file, string, new_size);
  137. return !result;
  138. }
  139. int quicktime_set_udta_string(char **string, int *size, char *new_string)
  140. {
  141. if(*size) free(*string);
  142. *size = strlen(new_string + 1);
  143. *string = malloc(*size + 1);
  144. strcpy(*string, new_string);
  145. return 0;
  146. }