Advertisement
Guest User

Untitled

a guest
Jul 5th, 2015
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.36 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. unsigned int swap_uint32(unsigned int num) {
  5. unsigned int swapped;
  6. swapped = ((num >> 24) & 0xff) |
  7. ((num << 8) & 0xff0000) |
  8. ((num >> 8) & 0xff00) |
  9. ((num << 24) & 0xff000000);
  10. return swapped;
  11. }
  12.  
  13. int swap_int32(int num) {
  14. int swapped;
  15. swapped = ((num >> 24) & 0xff) |
  16. ((num << 8) & 0xff0000) |
  17. ((num >> 8) & 0xff00) |
  18. ((num << 24) & 0xff000000);
  19. return swapped;
  20. }
  21.  
  22. double swap_float8(double num) {
  23. double swapped;
  24.  
  25. ((unsigned char*)&swapped)[0] = ((unsigned char*)&num)[7];
  26. ((unsigned char*)&swapped)[1] = ((unsigned char*)&num)[6];
  27. ((unsigned char*)&swapped)[2] = ((unsigned char*)&num)[5];
  28. ((unsigned char*)&swapped)[3] = ((unsigned char*)&num)[4];
  29. ((unsigned char*)&swapped)[4] = ((unsigned char*)&num)[3];
  30. ((unsigned char*)&swapped)[5] = ((unsigned char*)&num)[2];
  31. ((unsigned char*)&swapped)[6] = ((unsigned char*)&num)[1];
  32. ((unsigned char*)&swapped)[7] = ((unsigned char*)&num)[0];
  33.  
  34. return swapped;
  35. }
  36.  
  37. void read_float8(FILE *f, double *out) {
  38. double buffer;
  39.  
  40. fread(&buffer, sizeof(buffer), 1, f);
  41. *out = swap_float8(buffer);
  42. }
  43.  
  44. void read_int32(FILE *f, int *out) {
  45. int buffer;
  46.  
  47. fread(&buffer, sizeof(buffer), 1, f);
  48. *out = swap_int32(buffer);
  49. }
  50.  
  51. void read_uint32(FILE *f, unsigned int *out) {
  52. unsigned int buffer;
  53.  
  54. fread(&buffer, sizeof(buffer), 1, f);
  55. *out = swap_uint32(buffer);
  56. }
  57.  
  58. void read_byte(FILE *f, unsigned char *out) {
  59. unsigned char buffer;
  60.  
  61. fread(&buffer, sizeof(buffer), 1, f);
  62. }
  63.  
  64. void read_bytes(FILE *f, unsigned char **out, unsigned int length) {
  65. *out = malloc(length);
  66. fread(*out, length, 1, f);
  67. }
  68.  
  69. void read_string(FILE *f, char **out) {
  70. int len;
  71. char c;
  72. int pos;
  73.  
  74. len = 0;
  75. c = 0;
  76. pos = ftell(f);
  77. while (c != EOF) {
  78. c = fgetc(f);
  79. if (c == '\0') {
  80. break;
  81. }
  82. ++len;
  83. }
  84.  
  85. fseek(f, pos, SEEK_SET);
  86. *out = malloc(len + 1);
  87. fread(*out, len + 1, 1, f);
  88. }
  89.  
  90. typedef struct s_segment {
  91. unsigned int timecode;
  92. unsigned int length;
  93. unsigned int crc32Checksum;
  94.  
  95. unsigned int numChunks;
  96. unsigned int *chunks;
  97. } t_segment;
  98.  
  99. void read_segment(FILE *f, t_segment *segment) {
  100. unsigned int i;
  101.  
  102. read_uint32(f, &segment->timecode);
  103. read_uint32(f, &segment->length);
  104. read_uint32(f, &segment->crc32Checksum);
  105.  
  106. read_uint32(f, &segment->numChunks);
  107. segment->chunks = malloc(segment->numChunks * sizeof(*segment->chunks));
  108. for (i = 0; i < segment->numChunks; ++i) {
  109. read_uint32(f, &segment->chunks[i]);
  110. }
  111. }
  112.  
  113. void dump_segment(t_segment *segment) {
  114. unsigned int i;
  115.  
  116. printf(" Timecode: %d\n"
  117. " Length: %d\n"
  118. " Checksum: 0x%X\n"
  119. " Chunks: %d\n",
  120. segment->timecode,
  121. segment->length,
  122. segment->crc32Checksum,
  123. segment->numChunks);
  124.  
  125. for (i = 0; i < segment->numChunks; ++i) {
  126. printf(" Chunks[%d]: 0x%X\n", i, segment->chunks[i]);
  127. }
  128. }
  129.  
  130. typedef struct s_stream {
  131. unsigned char type;
  132. char *mimeType;
  133. unsigned int bandwidth;
  134. int width;
  135. int height;
  136. int numChannels;
  137. int sampleFrequency;
  138. unsigned int chunksize;
  139.  
  140. unsigned int initLength;
  141. unsigned char *initData;
  142.  
  143. unsigned int numSegments;
  144. t_segment *segments;
  145. } t_stream;
  146.  
  147. void read_stream(FILE *f, t_stream *stream) {
  148. unsigned int i;
  149.  
  150. read_byte(f, &stream->type);
  151. read_string(f, &stream->mimeType);
  152. read_uint32(f, &stream->bandwidth);
  153. read_int32(f, &stream->width);
  154. read_int32(f, &stream->height);
  155. read_int32(f, &stream->numChannels);
  156. read_int32(f, &stream->sampleFrequency);
  157. read_uint32(f, &stream->chunksize);
  158. read_uint32(f, &stream->initLength);
  159. read_bytes(f, &stream->initData, stream->initLength);
  160.  
  161. read_uint32(f, &stream->numSegments);
  162. stream->segments = malloc(stream->numSegments * sizeof(*stream->segments));
  163. for (i = 0; i < stream->numSegments; ++i) {
  164. read_segment(f, &stream->segments[i]);
  165. }
  166. }
  167.  
  168. void dump_stream(t_stream *stream) {
  169. unsigned int i;
  170.  
  171. printf(" Type: %d\n"
  172. " MimeType: {%s}\n"
  173. " Bandwidth: %d\n"
  174. " Width: %d\n"
  175. " Height: %d\n"
  176. " Channels: %d\n"
  177. " Sample Frequency: %d\n"
  178. " Chunk Size: %d\n"
  179. " Init Segment Length: %d\n",
  180. stream->type,
  181. stream->mimeType,
  182. stream->bandwidth,
  183. stream->width,
  184. stream->height,
  185. stream->numChannels,
  186. stream->sampleFrequency,
  187. stream->chunksize,
  188. stream->initLength);
  189.  
  190. for (i = 0; i < stream->numSegments; ++i) {
  191. printf(" Segment %d\n", i);
  192. dump_segment(&stream->segments[i]);
  193. }
  194. }
  195.  
  196. typedef struct s_header {
  197. unsigned int magic;
  198. unsigned int version;
  199. char *checksumAlgorithm;
  200. unsigned int timecodeScale;
  201. double duration;
  202.  
  203. unsigned int numTrackers;
  204. char **trackers;
  205.  
  206. unsigned int numStreams;
  207. t_stream *streams;
  208. } t_header;
  209.  
  210. void read_header(FILE *f, t_header *header) {
  211. unsigned int i;
  212.  
  213. read_uint32(f, &header->magic);
  214. read_uint32(f, &header->version);
  215. read_string(f, &header->checksumAlgorithm);
  216. read_uint32(f, &header->timecodeScale);
  217. read_float8(f, &header->duration);
  218.  
  219. read_uint32(f, &header->numTrackers);
  220. header->trackers = malloc(header->numTrackers * sizeof(*header->trackers));
  221. for (i = 0; i < header->numTrackers; ++i) {
  222. read_string(f, &header->trackers[i]);
  223. }
  224.  
  225. read_uint32(f, &header->numStreams);
  226. header->streams = malloc(header->numStreams * sizeof(*header->streams));
  227. for (i = 0; i < header->numStreams; ++i) {
  228. read_stream(f, &header->streams[i]);
  229. }
  230. }
  231.  
  232. void dump_header(t_header *header) {
  233. unsigned int i;
  234.  
  235. printf("Magic: %d\n"
  236. "Version: %d\n"
  237. "Checksum Algo: {%s}\n"
  238. "TimecodeScale: %d\n"
  239. "Duration: %f\n"
  240. "Num Trackers: %d\n",
  241. header->magic,
  242. header->version,
  243. header->checksumAlgorithm,
  244. header->timecodeScale,
  245. header->duration,
  246. header->numTrackers);
  247. for (i = 0; i < header->numTrackers; ++i) {
  248. printf("Tracker[%d] = {%s}\n", i, header->trackers[i]);
  249. }
  250. for (i = 0; i < header->numStreams; ++i) {
  251. printf("Stream %d\n", i);
  252. dump_stream(&header->streams[i]);
  253. }
  254. }
  255.  
  256. int main(int ac, char **av) {
  257. FILE *f;
  258. t_header header;
  259.  
  260. if (ac < 2) {
  261. printf("usage: %s <peeracleFile>\n", av[0]);
  262. return EXIT_FAILURE;
  263. }
  264.  
  265. f = fopen(av[1],"rb");
  266. if (f == NULL) {
  267. printf("Can't open %s\n", av[1]);
  268. return EXIT_FAILURE;
  269. }
  270.  
  271. read_header(f, &header);
  272. dump_header(&header);
  273.  
  274. fclose(f);
  275. return 0;
  276. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement