15 unsigned int unknown1;
16 unsigned int unknown2;
22 unsigned int unknown3;
23 unsigned int unknown4;
24 unsigned int unknown5;
27 struct redcode_handle {
29 struct red_reob * reob;
38 unsigned int read_be32(unsigned int val)
40 unsigned char * v = (unsigned char*) & val;
42 return (v[0] << 24) | (v[1] << 16) | (v[2] << 8) | v[3];
45 static unsigned char* read_packet(FILE * fp, char * expect)
51 fread(&len, 4, 1, fp);
52 fread(&head, 4, 1, fp);
58 if (strcmp(expect, head) != 0) {
59 fprintf(stderr, "Read: %s, expect: %s\n", head, expect);
63 rv = (unsigned char*) malloc(len + 8);
66 memcpy(rv + 4, &head, 4);
68 fread(rv + 8, len, 1, fp);
73 static unsigned int * read_index_packet(FILE * fp, char * expect)
75 unsigned int * rv = (unsigned int*) read_packet(fp, expect);
82 for (i = 2; i < rv[0]/4; i++) {
83 rv[i] = read_be32(rv[i]);
88 static struct red_reob * read_reob(FILE * fp)
90 fseek(fp, -0x38, SEEK_END);
92 return (struct red_reob *) read_index_packet(fp, "REOB");
95 static unsigned int * read_index(FILE * fp, unsigned int i, char * expect)
97 fseek(fp, i, SEEK_SET);
99 return (unsigned int*) read_index_packet(fp, expect);
102 static unsigned char * read_data(FILE * fp, unsigned int i, char * expect)
104 fseek(fp, i, SEEK_SET);
106 return read_packet(fp, expect);
109 struct redcode_handle * redcode_open(const char * fname)
111 struct redcode_handle * rv = NULL;
112 struct red_reob * reob = NULL;
115 FILE * fp = fopen(fname, "rb");
121 reob = read_reob(fp);
127 rv = (struct redcode_handle*) calloc(1, sizeof(struct redcode_handle));
131 rv->rdvo = read_index(fp, reob->rdvo, "RDVO");
132 rv->rdvs = read_index(fp, reob->rdvs, "RDVS");
133 rv->rdao = read_index(fp, reob->rdao, "RDAO");
134 rv->rdas = read_index(fp, reob->rdas, "RDAS");
136 if (!rv->rdvo || !rv->rdvs || !rv->rdao || !rv->rdas) {
141 for (i = 0; i < (rv->rdvo[0] - 8)/4; i++) {
142 if (rv->rdvo[i + 2]) {
150 void redcode_close(struct redcode_handle * handle)
171 long redcode_get_length(struct redcode_handle * handle)
173 return handle->length;
176 struct redcode_frame * redcode_read_video_frame(
177 struct redcode_handle * handle, long frame)
179 struct redcode_frame * rv;
180 unsigned char * data;
182 if (frame > handle->rdvo[0]/4 || handle->rdvo[frame + 2] == 0) {
185 data = read_data(handle->fp, handle->rdvo[frame + 2], "REDV");
190 rv = (struct redcode_frame*) calloc(1, sizeof(struct redcode_frame));
193 rv->length = *(unsigned int*)data - rv->offset;
199 struct redcode_frame * redcode_read_audio_frame(
200 struct redcode_handle * handle, long frame)
202 struct redcode_frame * rv;
203 unsigned char * data;
205 if (frame > handle->rdao[0]/4 || handle->rdao[frame + 2] == 0) {
208 data = read_data(handle->fp, handle->rdao[frame+2], "REDA");
213 rv = (struct redcode_frame*) calloc(1, sizeof(struct redcode_frame));
216 rv->length = *(unsigned int*)data - rv->offset;
222 void redcode_free_frame(struct redcode_frame * frame)