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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include <time.h>
  2. #include "quicktime.h"
  3. /* Disk I/O */
  4. /* Read entire buffer from the preload buffer */
  5. int quicktime_read_preload(quicktime_t *file, char *data, int size)
  6. {
  7. long selection_start = file->file_position;
  8. long selection_end = file->file_position + size;
  9. long fragment_start, fragment_len, fragment_end;
  10. fragment_start = file->preload_ptr + (selection_start - file->preload_start);
  11. while(fragment_start < 0) fragment_start += file->preload_size;
  12. while(fragment_start >= file->preload_size) fragment_start -= file->preload_size;
  13. while(selection_start < selection_end)
  14. {
  15. fragment_len = selection_end - selection_start;
  16. if(fragment_start + fragment_len > file->preload_size)
  17. fragment_len = file->preload_size - fragment_start;
  18. fragment_end = fragment_start + fragment_len;
  19. while(fragment_start < fragment_end)
  20. {
  21. *data++ = file->preload_buffer[fragment_start++];
  22. }
  23. if(fragment_start >= file->preload_size) fragment_start = 0;
  24. selection_start += fragment_len;
  25. }
  26. return 0;
  27. }
  28. int quicktime_read_data(quicktime_t *file, char *data, int size)
  29. {
  30. int result = 1;
  31. if(!file->preload_size)
  32. {
  33. if(ftell(file->stream) != file->file_position) fseek(file->stream, file->file_position, SEEK_SET);
  34. result = fread(data, size, 1, file->stream);
  35. }
  36. else
  37. {
  38. long selection_start = file->file_position;
  39. long selection_end = file->file_position + size;
  40. long fragment_start, fragment_len, fragment_end;
  41. if(selection_end - selection_start > file->preload_size)
  42. {
  43. /* Size is larger than preload size.  Should never happen. */
  44. if(ftell(file->stream) != file->file_position) fseek(file->stream, file->file_position, SEEK_SET);
  45. result = fread(data, size, 1, file->stream);
  46. }
  47. else
  48. if(selection_start >= file->preload_start && 
  49. selection_start < file->preload_end &&
  50. selection_end <= file->preload_end &&
  51. selection_end > file->preload_start)
  52. {
  53. /* Entire range is in buffer */
  54. quicktime_read_preload(file, data, size);
  55. }
  56. else
  57. if(selection_end > file->preload_end && selection_end - file->preload_size < file->preload_end)
  58. {
  59. /* Range is after buffer */
  60. /* Move the preload start to within one preload length of the selection_end */
  61. while(selection_end - file->preload_start > file->preload_size)
  62. {
  63. fragment_len = selection_end - file->preload_start - file->preload_size;
  64. if(file->preload_ptr + fragment_len > file->preload_size) fragment_len = file->preload_size - file->preload_ptr;
  65. file->preload_start += fragment_len;
  66. file->preload_ptr += fragment_len;
  67. if(file->preload_ptr >= file->preload_size) file->preload_ptr = 0;
  68. }
  69. /* Append sequential data after the preload end to the new end */
  70. fragment_start = file->preload_ptr + file->preload_end - file->preload_start;
  71. while(fragment_start >= file->preload_size) fragment_start -= file->preload_size;
  72. while(file->preload_end < selection_end)
  73. {
  74. fragment_len = selection_end - file->preload_end;
  75. if(fragment_start + fragment_len > file->preload_size) fragment_len = file->preload_size - fragment_start;
  76. if(ftell(file->stream) != file->preload_end) fseek(file->stream, file->preload_end, SEEK_SET);
  77. result = fread(&(file->preload_buffer[fragment_start]), fragment_len, 1, file->stream);
  78. file->preload_end += fragment_len;
  79. fragment_start += fragment_len;
  80. if(fragment_start >= file->preload_size) fragment_start = 0;
  81. }
  82. quicktime_read_preload(file, data, size);
  83. }
  84. else
  85. {
  86. /*printf("quicktime_read_data 4 selection_start %ld selection_end %ld preload_start %ldn", selection_start, selection_end, file->preload_start); */
  87. /* Range is before buffer or over a preload_size away from the end of the buffer. */
  88. /* Replace entire preload buffer with range. */
  89. if(ftell(file->stream) != file->file_position) fseek(file->stream, file->file_position, SEEK_SET);
  90. result = fread(file->preload_buffer, size, 1, file->stream);
  91. file->preload_start = file->file_position;
  92. file->preload_end = file->file_position + size;
  93. file->preload_ptr = 0;
  94. quicktime_read_preload(file, data, size);
  95. }
  96. }
  97. file->file_position += size;
  98. return result;
  99. }
  100. int quicktime_write_data(quicktime_t *file, char *data, int size)
  101. {
  102. int result;
  103. if(ftell(file->stream) != file->file_position) fseek(file->stream, file->file_position, SEEK_SET);
  104. result = fwrite(data, size, 1, file->stream);
  105. file->file_position += size;
  106. return result;
  107. }
  108. int quicktime_test_position(quicktime_t *file)
  109. {
  110. if (quicktime_position(file) < 0)
  111. {
  112. printf("quicktime_test_position: 32 bit overflown");
  113. return 1;
  114. }
  115. else
  116. return 0;
  117. }
  118. int quicktime_read_pascal(quicktime_t *file, char *data)
  119. {
  120. char len = quicktime_read_char(file);
  121. quicktime_read_data(file, data, len);
  122. data[len] = 0;
  123. }
  124. int quicktime_write_pascal(quicktime_t *file, char *data)
  125. {
  126. char len = strlen(data);
  127. quicktime_write_data(file, &len, 1);
  128. quicktime_write_data(file, data, len);
  129. }
  130. float quicktime_read_fixed32(quicktime_t *file)
  131. {
  132. unsigned long a, b, c, d;
  133. unsigned char data[4];
  134. quicktime_read_data(file, data, 4);
  135. /* fread(data, 4, 1, file->stream); */
  136. a = data[0];
  137. b = data[1];
  138. c = data[2];
  139. d = data[3];
  140. a = (a << 8) + b;
  141. b = (c << 8) + d;
  142. return (float)a + (float)b / 65536;
  143. }
  144. int quicktime_write_fixed32(quicktime_t *file, float number)
  145. {
  146. unsigned char data[4];
  147. int a, b;
  148. a = number;
  149. b = (number - a) * 65536;
  150. data[0] = a >> 8;
  151. data[1] = a & 0xff;
  152. data[2] = b >> 8;
  153. data[3] = b & 0xff;
  154. return quicktime_write_data(file, data, 4);
  155. }
  156. int quicktime_write_int64(quicktime_t *file, u_int64_t value)
  157. {
  158. unsigned char data[8];
  159. int i;
  160. for (i = 7; i >= 0; i--) {
  161. data[i] = value & 0xff;
  162. value >>= 8;
  163. }
  164. return quicktime_write_data(file, data, 8);
  165. }
  166. int quicktime_write_int32(quicktime_t *file, long value)
  167. {
  168. unsigned char data[4];
  169. data[0] = (value & 0xff000000) >> 24;
  170. data[1] = (value & 0xff0000) >> 16;
  171. data[2] = (value & 0xff00) >> 8;
  172. data[3] = value & 0xff;
  173. return quicktime_write_data(file, data, 4);
  174. }
  175. int quicktime_write_char32(quicktime_t *file, char *string)
  176. {
  177. return quicktime_write_data(file, string, 4);
  178. }
  179. float quicktime_read_fixed16(quicktime_t *file)
  180. {
  181. unsigned char data[2];
  182. quicktime_read_data(file, data, 2);
  183. return (float)data[0] + (float)data[1] / 256;
  184. }
  185. int quicktime_write_fixed16(quicktime_t *file, float number)
  186. {
  187. unsigned char data[2];
  188. int a, b;
  189. a = number;
  190. b = (number - a) * 256;
  191. data[0] = a;
  192. data[1] = b;
  193. return quicktime_write_data(file, data, 2);
  194. }
  195. u_int64_t quicktime_read_int64(quicktime_t *file)
  196. {
  197. u_char data[8];
  198. u_int64_t result = 0;
  199. int i;
  200. quicktime_read_data(file, data, 8);
  201. for (i = 0; i < 8; i++) {
  202. result |= ((u_int64_t)data[i]) << ((7 - i) * 8);
  203. }
  204. return result;
  205. }
  206. long quicktime_read_int32(quicktime_t *file)
  207. {
  208. unsigned long result;
  209. unsigned long a, b, c, d;
  210. char data[4];
  211. quicktime_read_data(file, data, 4);
  212. a = (unsigned char)data[0];
  213. b = (unsigned char)data[1];
  214. c = (unsigned char)data[2];
  215. d = (unsigned char)data[3];
  216. result = (a<<24) | (b<<16) | (c<<8) | d;
  217. return (long)result;
  218. }
  219. long quicktime_read_int24(quicktime_t *file)
  220. {
  221. unsigned long result;
  222. unsigned long a, b, c;
  223. char data[4];
  224. quicktime_read_data(file, data, 3);
  225. /* fread(data, 3, 1, file->stream); */
  226. a = (unsigned char)data[0];
  227. b = (unsigned char)data[1];
  228. c = (unsigned char)data[2];
  229. result = (a<<16) | (b<<8) | c;
  230. return (long)result;
  231. }
  232. int quicktime_write_int24(quicktime_t *file, long number)
  233. {
  234. unsigned char data[3];
  235. data[0] = (number & 0xff0000) >> 16;
  236. data[1] = (number & 0xff00) >> 8;
  237. data[2] = (number & 0xff);
  238. return quicktime_write_data(file, data, 3);
  239. /* return fwrite(data, 3, 1, file->stream); */
  240. }
  241. int quicktime_read_int16(quicktime_t *file)
  242. {
  243. unsigned long result;
  244. unsigned long a, b;
  245. char data[2];
  246. quicktime_read_data(file, data, 2);
  247. /* fread(data, 2, 1, file->stream); */
  248. a = (unsigned char)data[0];
  249. b = (unsigned char)data[1];
  250. result = (a<<8) | b;
  251. return (int)result;
  252. }
  253. int quicktime_write_int16(quicktime_t *file, int number)
  254. {
  255. unsigned char data[2];
  256. data[0] = (number & 0xff00) >> 8;
  257. data[1] = (number & 0xff);
  258. return quicktime_write_data(file, data, 2);
  259. /* return fwrite(data, 2, 1, file->stream); */
  260. }
  261. int quicktime_read_char(quicktime_t *file)
  262. {
  263. char output;
  264. quicktime_read_data(file, &output, 1);
  265. return output;
  266. }
  267. int quicktime_write_char(quicktime_t *file, char x)
  268. {
  269. return quicktime_write_data(file, &x, 1);
  270. }
  271. int quicktime_read_char32(quicktime_t *file, char *string)
  272. {
  273. quicktime_read_data(file, string, 4);
  274. /* fread(string, 4, 1, file->stream); */
  275. }
  276. long quicktime_position(quicktime_t *file) 
  277. return file->file_position; 
  278. }
  279. int quicktime_set_position(quicktime_t *file, long position) 
  280. {
  281. file->file_position = position;
  282. return 0;
  283. /* fseek(file->stream, position, SEEK_SET);  */
  284. }
  285. int quicktime_copy_char32(char *output, char *input)
  286. {
  287. *output++ = *input++;
  288. *output++ = *input++;
  289. *output++ = *input++;
  290. *output = *input;
  291. }
  292. int quicktime_print_chars(char *desc, char *input, int len)
  293. {
  294. int i;
  295. printf("%s", desc);
  296. for(i = 0; i < len; i++) printf("%c", input[i]);
  297. printf("n");
  298. }
  299. unsigned long quicktime_current_time()
  300. {
  301. time_t t;
  302. time (&t);
  303. return (t+(66*31536000)+1468800);
  304. }
  305. int quicktime_match_32(char *input, char *output)
  306. {
  307. if(input[0] == output[0] &&
  308. input[1] == output[1] &&
  309. input[2] == output[2] &&
  310. input[3] == output[3])
  311. return 1;
  312. else 
  313. return 0;
  314. }
  315. int quicktime_read_mp4_descr_length(quicktime_t *file)
  316. {
  317. u_int8_t b;
  318. u_int8_t numBytes = 0;
  319. u_int32_t length = 0;
  320. do {
  321. b = quicktime_read_char(file);
  322. numBytes++;
  323. length = (length << 7) | (b & 0x7F);
  324. } while ((b & 0x80) && numBytes < 4);
  325. return length;
  326. }
  327. int quicktime_write_mp4_descr_length(quicktime_t *file, int length, bool compact)
  328. {
  329. u_int8_t b;
  330. int8_t i;
  331. int8_t numBytes;
  332. if (compact) {
  333. if (length <= 0x7F) {
  334. numBytes = 1;
  335. } else if (length <= 0x3FFF) {
  336. numBytes = 2;
  337. } else if (length <= 0x1FFFFF) {
  338. numBytes = 3;
  339. } else {
  340. numBytes = 4;
  341. }
  342. } else {
  343. numBytes = 4;
  344. }
  345. for (i = numBytes-1; i >= 0; i--) {
  346. b = (length >> (i * 7)) & 0x7F;
  347. if (i != 0) {
  348. b |= 0x80;
  349. }
  350. quicktime_write_char(file, b);
  351. }
  352. return numBytes; 
  353. }
  354. void quicktime_atom_hexdump(quicktime_t* file, quicktime_atom_t* atom)
  355. {
  356. int i;
  357. int oldPos;
  358. oldPos = quicktime_position(file);
  359. quicktime_set_position(file, atom->start);
  360. printf("atom hex dump:n");
  361. for (i = 0; i < atom->size; i++) {
  362. printf("%02x ", (u_int8_t)quicktime_read_char(file));
  363. if ((i % 16) == 0 && i > 0) {
  364. printf("n");
  365. }
  366. }
  367. printf("n");
  368. quicktime_set_position(file, oldPos);
  369. }