2 #include "dirac_parse.h"
5 #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
7 typedef struct _Unpack Unpack;
17 static void schro_unpack_init_with_data (Unpack * unpack, unsigned char *data,
18 int n_bytes, unsigned int guard_bit);
20 static unsigned int schro_unpack_decode_bit (Unpack * unpack);
21 static unsigned int schro_unpack_decode_uint (Unpack * unpack);
24 void schro_video_format_set_std_video_format (DiracSequenceHeader * format,
26 void schro_video_format_set_std_frame_rate (DiracSequenceHeader * format,
28 void schro_video_format_set_std_aspect_ratio (DiracSequenceHeader * format,
30 void schro_video_format_set_std_signal_range (DiracSequenceHeader * format,
32 void schro_video_format_set_std_colour_spec (DiracSequenceHeader * format,
39 dirac_sequence_header_parse (DiracSequenceHeader * header,
40 unsigned char *data, int n_bytes)
45 Unpack *unpack = &_unpack;
51 memset (header, 0, sizeof (*header));
53 schro_unpack_init_with_data (unpack, data, n_bytes, 1);
55 /* parse parameters */
56 major_version = schro_unpack_decode_uint (unpack);
57 minor_version = schro_unpack_decode_uint (unpack);
58 profile = schro_unpack_decode_uint (unpack);
59 level = schro_unpack_decode_uint (unpack);
61 /* base video header */
62 index = schro_unpack_decode_uint (unpack);
63 schro_video_format_set_std_video_format (header, index);
65 header->major_version = major_version;
66 header->minor_version = minor_version;
67 header->profile = profile;
68 header->level = level;
70 /* source parameters */
71 /* frame dimensions */
72 bit = schro_unpack_decode_bit (unpack);
74 header->width = schro_unpack_decode_uint (unpack);
75 header->height = schro_unpack_decode_uint (unpack);
79 bit = schro_unpack_decode_bit (unpack);
81 header->chroma_format = schro_unpack_decode_uint (unpack);
85 bit = schro_unpack_decode_bit (unpack);
87 header->interlaced = schro_unpack_decode_uint (unpack);
91 bit = schro_unpack_decode_bit (unpack);
93 index = schro_unpack_decode_uint (unpack);
95 header->frame_rate_numerator = schro_unpack_decode_uint (unpack);
96 header->frame_rate_denominator = schro_unpack_decode_uint (unpack);
98 schro_video_format_set_std_frame_rate (header, index);
103 bit = schro_unpack_decode_bit (unpack);
105 index = schro_unpack_decode_uint (unpack);
107 header->aspect_ratio_numerator = schro_unpack_decode_uint (unpack);
108 header->aspect_ratio_denominator = schro_unpack_decode_uint (unpack);
110 schro_video_format_set_std_aspect_ratio (header, index);
115 bit = schro_unpack_decode_bit (unpack);
117 header->clean_width = schro_unpack_decode_uint (unpack);
118 header->clean_height = schro_unpack_decode_uint (unpack);
119 header->left_offset = schro_unpack_decode_uint (unpack);
120 header->top_offset = schro_unpack_decode_uint (unpack);
124 bit = schro_unpack_decode_bit (unpack);
126 index = schro_unpack_decode_uint (unpack);
128 header->luma_offset = schro_unpack_decode_uint (unpack);
129 header->luma_excursion = schro_unpack_decode_uint (unpack);
130 header->chroma_offset = schro_unpack_decode_uint (unpack);
131 header->chroma_excursion = schro_unpack_decode_uint (unpack);
133 schro_video_format_set_std_signal_range (header, index);
138 bit = schro_unpack_decode_bit (unpack);
140 index = schro_unpack_decode_uint (unpack);
141 schro_video_format_set_std_colour_spec (header, index);
143 /* colour primaries */
144 bit = schro_unpack_decode_bit (unpack);
146 header->colour_primaries = schro_unpack_decode_uint (unpack);
149 bit = schro_unpack_decode_bit (unpack);
151 header->colour_matrix = schro_unpack_decode_uint (unpack);
153 /* transfer function */
154 bit = schro_unpack_decode_bit (unpack);
156 header->transfer_function = schro_unpack_decode_uint (unpack);
161 header->interlaced_coding = schro_unpack_decode_uint (unpack);
168 static DiracSequenceHeader schro_video_formats[] = {
171 640, 480, SCHRO_CHROMA_420,
179 176, 120, SCHRO_CHROMA_420,
187 176, 144, SCHRO_CHROMA_420,
195 352, 240, SCHRO_CHROMA_420,
203 352, 288, SCHRO_CHROMA_420,
211 704, 480, SCHRO_CHROMA_420,
219 704, 576, SCHRO_CHROMA_420,
227 720, 480, SCHRO_CHROMA_422,
235 720, 576, SCHRO_CHROMA_422,
243 1280, 720, SCHRO_CHROMA_422,
251 1280, 720, SCHRO_CHROMA_422,
259 1920, 1080, SCHRO_CHROMA_422,
267 1920, 1080, SCHRO_CHROMA_422,
275 1920, 1080, SCHRO_CHROMA_422,
283 1920, 1080, SCHRO_CHROMA_422,
291 2048, 1080, SCHRO_CHROMA_444,
295 256, 3504, 2048, 3584,
299 4096, 2160, SCHRO_CHROMA_444,
303 256, 3504, 2048, 3584,
308 schro_video_format_set_std_video_format (DiracSequenceHeader * format,
312 if (index < 0 || index >= ARRAY_SIZE (schro_video_formats)) {
316 memcpy (format, schro_video_formats + index, sizeof (DiracSequenceHeader));
319 typedef struct _SchroFrameRate SchroFrameRate;
320 struct _SchroFrameRate
326 static SchroFrameRate schro_frame_rates[] = {
341 schro_video_format_set_std_frame_rate (DiracSequenceHeader * format, int index)
343 if (index < 1 || index >= ARRAY_SIZE (schro_frame_rates)) {
347 format->frame_rate_numerator = schro_frame_rates[index].numerator;
348 format->frame_rate_denominator = schro_frame_rates[index].denominator;
351 typedef struct _SchroPixelAspectRatio SchroPixelAspectRatio;
352 struct _SchroPixelAspectRatio
358 static const SchroPixelAspectRatio schro_aspect_ratios[] = {
369 schro_video_format_set_std_aspect_ratio (DiracSequenceHeader * format,
372 if (index < 1 || index >= ARRAY_SIZE (schro_aspect_ratios)) {
376 format->aspect_ratio_numerator = schro_aspect_ratios[index].numerator;
377 format->aspect_ratio_denominator = schro_aspect_ratios[index].denominator;
381 typedef struct _SchroSignalRangeStruct SchroSignalRangeStruct;
382 struct _SchroSignalRangeStruct
387 int chroma_excursion;
390 static const SchroSignalRangeStruct schro_signal_ranges[] = {
395 {256, 3504, 2048, 3584}
399 schro_video_format_set_std_signal_range (DiracSequenceHeader * format, int i)
401 if (i < 1 || i >= ARRAY_SIZE (schro_signal_ranges)) {
405 format->luma_offset = schro_signal_ranges[i].luma_offset;
406 format->luma_excursion = schro_signal_ranges[i].luma_excursion;
407 format->chroma_offset = schro_signal_ranges[i].chroma_offset;
408 format->chroma_excursion = schro_signal_ranges[i].chroma_excursion;
411 typedef struct _SchroColourSpecStruct SchroColourSpecStruct;
412 struct _SchroColourSpecStruct
414 int colour_primaries;
416 int transfer_function;
419 static const SchroColourSpecStruct schro_colour_specs[] = {
421 SCHRO_COLOUR_PRIMARY_HDTV,
422 SCHRO_COLOUR_MATRIX_HDTV,
423 SCHRO_TRANSFER_CHAR_TV_GAMMA},
425 SCHRO_COLOUR_PRIMARY_SDTV_525,
426 SCHRO_COLOUR_MATRIX_SDTV,
427 SCHRO_TRANSFER_CHAR_TV_GAMMA},
429 SCHRO_COLOUR_PRIMARY_SDTV_625,
430 SCHRO_COLOUR_MATRIX_SDTV,
431 SCHRO_TRANSFER_CHAR_TV_GAMMA},
433 SCHRO_COLOUR_PRIMARY_HDTV,
434 SCHRO_COLOUR_MATRIX_HDTV,
435 SCHRO_TRANSFER_CHAR_TV_GAMMA},
437 SCHRO_COLOUR_PRIMARY_CINEMA,
438 SCHRO_COLOUR_MATRIX_HDTV,
439 SCHRO_TRANSFER_CHAR_TV_GAMMA}
443 schro_video_format_set_std_colour_spec (DiracSequenceHeader * format, int i)
445 if (i < 0 || i >= ARRAY_SIZE (schro_colour_specs)) {
449 format->colour_primaries = schro_colour_specs[i].colour_primaries;
450 format->colour_matrix = schro_colour_specs[i].colour_matrix;
451 format->transfer_function = schro_colour_specs[i].transfer_function;
458 schro_unpack_init_with_data (Unpack * unpack, unsigned char *data,
459 int n_bytes, unsigned int guard_bit)
461 memset (unpack, 0, sizeof (Unpack));
464 unpack->n_bits_left = 8 * n_bytes;
465 unpack->guard_bit = guard_bit;
469 schro_unpack_decode_bit (Unpack * unpack)
473 if (unpack->n_bits_left < 1) {
474 return unpack->guard_bit;
476 bit = (unpack->data[unpack->index >> 3] >> (7 - (unpack->index & 7))) & 1;
478 unpack->n_bits_left--;
484 schro_unpack_decode_uint (Unpack * unpack)
491 while (!schro_unpack_decode_bit (unpack)) {
494 value |= schro_unpack_decode_bit (unpack);
497 return (1 << count) - 1 + value;