hack fix for Ogg sequence headers being wrong
[schroedinger/research-port.git] / tools / parse_header.c
blob14d02450ddbdb9f3fb8782ef727fa8b9d730676a
2 #ifdef HAVE_CONFIG_H
3 #include <config.h>
4 #endif
6 #include "dirac_parse.h"
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <errno.h>
12 int parse_packet (FILE *file, unsigned char **p_data, int *p_size);
14 int
15 main (int argc, char *argv[])
17 FILE *file;
18 int ret;
19 DiracSequenceHeader header = {0};
20 int size;
21 unsigned char *packet;
23 if (argc < 2) {
24 fprintf(stderr, "parse_header infile.drc\n");
25 return 1;
28 file = fopen (argv[1], "r");
29 if (file == NULL) {
30 printf("cannot open %s for reading: %s\n", argv[1], strerror(errno));
31 return 1;
34 while (1) {
35 ret = parse_packet (file, &packet, &size);
36 if (!ret) {
37 printf("parse error\n");
38 exit(1);
40 if (packet == NULL) break;
42 if (SCHRO_PARSE_CODE_IS_SEQ_HEADER(packet[4])) {
43 ret = dirac_sequence_header_parse (&header, packet + 13, size - 13);
45 if (!ret) {
46 printf("bad header\n");
47 exit(1);
50 #define PRINT(ack) printf( #ack ": %d\n", header. ack );
51 PRINT(major_version);
52 PRINT(minor_version);
53 PRINT(profile);
54 PRINT(level);
55 PRINT(index);
56 PRINT(width);
57 PRINT(height);
58 PRINT(chroma_format);
59 PRINT(interlaced);
60 PRINT(top_field_first);
61 PRINT(frame_rate_numerator);
62 PRINT(frame_rate_denominator);
63 PRINT(aspect_ratio_numerator);
64 PRINT(aspect_ratio_denominator);
65 PRINT(clean_width);
66 PRINT(clean_height);
67 PRINT(left_offset);
68 PRINT(top_offset);
69 PRINT(luma_offset);
70 PRINT(luma_excursion);
71 PRINT(chroma_offset);
72 PRINT(chroma_excursion);
73 PRINT(colour_primaries);
74 PRINT(colour_matrix);
75 PRINT(transfer_function);
76 PRINT(interlaced_coding);
78 exit(0);
81 free(packet);
84 return 0;
87 int
88 parse_packet (FILE *file, unsigned char **p_data, int *p_size)
90 unsigned char *packet;
91 unsigned char header[13];
92 int n;
93 int size;
95 n = fread (header, 1, 13, file);
96 if (n == 0) {
97 *p_data = NULL;
98 *p_size = 0;
99 return 1;
101 if (n < 13) {
102 printf("truncated header\n");
103 return 0;
106 if (header[0] != 'B' || header[1] != 'B' || header[2] != 'C' ||
107 header[3] != 'D') {
108 return 0;
111 size = (header[5]<<24) | (header[6]<<16) | (header[7]<<8) | (header[8]);
112 if (size == 0) {
113 size = 13;
115 if (size < 13) {
116 return 0;
118 if (size > 16*1024*1024) {
119 printf("packet too large? (%d > 16777216)\n", size);
120 return 0;
123 packet = malloc (size);
124 memcpy (packet, header, 13);
125 n = fread (packet + 13, 1, size - 13, file);
126 if (n < size - 13) {
127 free (packet);
128 return 0;
131 *p_data = packet;
132 *p_size = size;
133 return 1;