[soc]: r3770 - in dirac/libavcodec: dirac.c dirac.h diracdec.c
Author: conrad Date: Mon Nov 10 04:11:05 2008 New Revision: 3770 Log: Update parsing source paramaters to the latest specification The distinction between source and sequence no longer exists Modified: dirac/libavcodec/dirac.c dirac/libavcodec/dirac.h dirac/libavcodec/diracdec.c Modified: dirac/libavcodec/dirac.c ============================================================================== --- dirac/libavcodec/dirac.c (original) +++ dirac/libavcodec/dirac.c Mon Nov 10 04:11:05 2008 @@ -37,43 +37,31 @@ #include "dirac_wavelet.h" #include "mpeg12data.h" -/* Defaults for sequence parameters. */ -const struct sequence_parameters dirac_sequence_parameters_defaults[13] = -{ - /* Width Height Chroma format Depth */ - { 640, 480, 2, 8 }, - { 176, 120, 2, 8 }, - { 176, 144, 2, 8 }, - { 352, 240, 2, 8 }, - { 352, 288, 2, 8 }, - { 704, 480, 2, 8 }, - { 704, 576, 2, 8 }, - - { 720, 480, 2, 8 }, - { 720, 576, 2, 8 }, - { 1280, 720, 2, 8 }, - { 1920, 1080, 2, 8 }, - { 2048, 1556, 0, 16 }, - { 4096, 3112, 0, 16 }, -}; - /* Defaults for source parameters. */ -const struct source_parameters dirac_source_parameters_defaults[13] = +const struct source_parameters dirac_source_parameters_defaults[] = { - { 0, 1, 0, {30, 1}, {1, 1}, 640, 480, 0, 0, 0, 255, 128, 254, 0, 0, 0.2126, 0.0722, TRANSFER_FUNC_TV }, - { 0, 1, 0, {15000, 1001}, {10, 11}, 176, 120, 0, 0, 0, 255, 128, 254, 1, 0, 0.299, 0.144, TRANSFER_FUNC_TV }, - { 0, 1, 0, {25, 2}, {12, 11}, 176, 144, 0, 0, 0, 255, 128, 254, 2, 0, 0.299, 0.144, TRANSFER_FUNC_TV }, - { 0, 1, 0, {15000, 1001}, {10, 11}, 352, 240, 0, 0, 0, 255, 128, 254, 1, 0, 0.299, 0.144, TRANSFER_FUNC_TV }, - { 0, 1, 0, {25, 2}, {12, 11}, 352, 288, 0, 0, 0, 255, 128, 254, 2, 0, 0.299, 0.144, TRANSFER_FUNC_TV }, - { 0, 1, 0, {15000, 1001}, {10, 11}, 704, 480, 0, 0, 0, 255, 128, 254, 1, 0, 0.299, 0.144, TRANSFER_FUNC_TV }, - { 0, 1, 0, {25, 2}, {12, 11}, 704, 576, 0, 0, 0, 255, 128, 254, 2, 0, 0.299, 0.144, TRANSFER_FUNC_TV }, + { 640, 480, 2, 0, 0, 1, 1, 640, 480, 0, 0, 1, 0 }, + { 176, 120, 2, 0, 0, 9, 2, 176, 120, 0, 0, 1, 1 }, + { 176, 144, 2, 0, 1, 10, 3, 176, 144, 0, 0, 1, 2 }, + { 352, 240, 2, 0, 0, 9, 2, 352, 240, 0, 0, 1, 1 }, + { 352, 288, 2, 0, 1, 10, 3, 352, 288, 0, 0, 1, 2 }, + { 704, 480, 2, 0, 0, 9, 2, 704, 480, 0, 0, 1, 1 }, + { 704, 576, 2, 0, 1, 10, 3, 704, 576, 0, 0, 1, 2 }, + { 720, 480, 1, 1, 0, 4, 2, 704, 480, 8, 0, 3, 1 }, + { 720, 576, 1, 1, 1, 3, 3, 704, 576, 8, 0, 3, 2 }, - { 0, 1, 0, {24000, 1001}, {10, 11}, 720, 480, 0, 0, 16, 235, 128, 224, 1, 0, 0.299, 0.144, TRANSFER_FUNC_TV }, - { 0, 1, 0, {35, 1}, {12, 11}, 720, 576, 0, 0, 16, 235, 128, 224, 2, 0, 0.299, 0.144, TRANSFER_FUNC_TV }, - { 0, 1, 0, {24, 1}, {1, 1}, 1280, 720, 0, 0, 16, 235, 128, 224, 0, 0, 0.2126, 0.0722, TRANSFER_FUNC_TV }, - { 0, 1, 0, {24, 1}, {1, 1}, 1920, 1080, 0, 0, 16, 235, 128, 224, 0, 0, 0.2126, 0.0722, TRANSFER_FUNC_TV }, - { 0, 1, 0, {24, 1}, {1, 1}, 2048, 1536, 0, 0, 0, 65535, 32768, 65534, 3, 0, 0.25, 0.25, TRANSFER_FUNC_LINEAR }, - { 0, 1, 0, {24, 1}, {1, 1}, 4096, 3072, 0, 0, 0, 65535, 32768, 65534, 3, 0, 0.25, 0.25, TRANSFER_FUNC_LINEAR }, + { 1280, 720, 1, 0, 1, 7, 1, 1280, 720, 0, 0, 3, 3 }, + { 1280, 720, 1, 0, 1, 6, 1, 1280, 720, 0, 0, 3, 3 }, + { 1920, 1080, 1, 1, 1, 4, 1, 1920, 1080, 0, 0, 3, 3 }, + { 1920, 1080, 1, 1, 1, 3, 1, 1920, 1080, 0, 0, 3, 3 }, + { 1920, 1080, 1, 0, 1, 7, 1, 1920, 1080, 0, 0, 3, 3 }, + { 2048, 1080, 0, 0, 1, 2, 1, 2048, 1080, 0, 0, 4, 4 }, + { 4096, 2160, 0, 0, 1, 2, 1, 4096, 2160, 0, 0, 4, 4 }, + + { 3840, 2160, 1, 0, 1, 7, 1, 3840, 2160, 0, 0, 3, 3 }, + { 3840, 2160, 1, 0, 1, 6, 1, 3840, 2160, 0, 0, 3, 3 }, + { 7680, 4320, 1, 0, 1, 7, 1, 3840, 2160, 0, 0, 3, 3 }, + { 7680, 4320, 1, 0, 1, 6, 1, 3840, 2160, 0, 0, 3, 3 }, }; /* Defaults for decoding parameters. */ @@ -95,22 +83,31 @@ const struct decoding_parameters dirac_d { 4, 6, 0, 16, 24, 16, 24, 2, 1, 1, 1, 1, 1, 4, 3, 1, 1, 8, 6, 12, 8, 48, 48, 1024 } }; -const AVRational dirac_preset_aspect_ratios[3] = +const AVRational dirac_preset_aspect_ratios[] = { - {1, 1}, {10, 11}, {12, 11} + {1, 1}, {10, 11}, {12, 11}, + {40, 33}, + {16, 11}, + {4, 3}, }; -const uint8_t dirac_preset_luma_offset[3] = { 0, 16, 64 }; -const uint16_t dirac_preset_luma_excursion[3] = { 255, 235, 876 }; -const uint16_t dirac_preset_chroma_offset[3] = { 128, 128, 512 }; -const uint16_t dirac_preset_chroma_excursion[3] = { 255, 224, 896 }; - -const uint8_t dirac_preset_primaries[4] = { 0, 1, 2, 3 }; -const uint8_t dirac_preset_matrix[4] = {0, 1, 1, 2 }; -const transfer_func_t dirac_preset_transfer_func[4] = +const AVRational ff_dirac_frame_rate[] = { - TRANSFER_FUNC_TV, TRANSFER_FUNC_TV, - TRANSFER_FUNC_TV, TRANSFER_FUNC_DCI_GAMMA + {15000, 1001}, + {25, 2}, +}; + +const uint16_t dirac_preset_luma_offset[] = { 0, 16, 64, 256 }; +const uint16_t dirac_preset_luma_excursion[] = { 255, 219, 876, 3504 }; +const uint16_t dirac_preset_chroma_offset[] = { 128, 128, 512, 2048 }; +const uint16_t dirac_preset_chroma_excursion[] = { 255, 224, 896, 3584 }; + +const color_specification ff_dirac_color_spec_presets[] = { + { COLOR_PRIMARY_HDTV, COLOR_MATRIX_HDTV, TRANSFER_FUNC_TV }, + { COLOR_PRIMARY_SDTV_525, COLOR_MATRIX_SDTV, TRANSFER_FUNC_TV }, + { COLOR_PRIMARY_SDTV_625, COLOR_MATRIX_SDTV, TRANSFER_FUNC_TV }, + { COLOR_PRIMARY_HDTV, COLOR_MATRIX_HDTV, TRANSFER_FUNC_TV }, + { COLOR_PRIMARY_HDTV, COLOR_MATRIX_HDTV, TRANSFER_FUNC_DCI_GAMMA }, }; const float dirac_preset_kr[3] = { 0.2126, 0.299, 0 /* XXX */ }; const float dirac_preset_kb[3] = {0.0722, 0.114, 0 /* XXX */ }; @@ -146,45 +143,28 @@ const weights_t eighthpel_weights[16] = }; /** - * Dump the sequence parameters. DEBUG needs to be defined. - */ -void dirac_dump_sequence_parameters(AVCodecContext *avctx) { - DiracContext *s = avctx->priv_data; - struct sequence_parameters *seq = &s->sequence; - const char *chroma_format_str[] = { "4:4:4", "4:2:2", "4:2:0" }; - - dprintf(avctx, "-----------------------------------------------------\n"); - dprintf(avctx, " Dumping the sequence parameters:\n"); - dprintf(avctx, "-----------------------------------------------------\n"); - - - dprintf(avctx, "Luma size=%dx%d\n", - seq->luma_width, seq->luma_height); - dprintf(avctx, "Chroma size=%dx%d, format: %s\n", - seq->chroma_width, seq->chroma_height, - chroma_format_str[seq->chroma_format]); - dprintf(avctx, "Video depth: %d bpp\n", seq->video_depth); - - dprintf(avctx, "-----------------------------------------------------\n"); - -} - -/** * Dump the source parameters. DEBUG needs to be defined. */ void dirac_dump_source_parameters(AVCodecContext *avctx) { DiracContext *s = avctx->priv_data; struct source_parameters *source = &s->source; + const char *chroma_format_str[] = { "4:4:4", "4:2:2", "4:2:0" }; dprintf(avctx, "-----------------------------------------------------\n"); dprintf(avctx, " Dumping source parameters:\n"); dprintf(avctx, "-----------------------------------------------------\n"); + dprintf(avctx, "Luma size=%dx%d\n", + source->luma_width, source->luma_height); + dprintf(avctx, "Chroma size=%dx%d, format: %s\n", + source->chroma_width, source->chroma_height, + chroma_format_str[source->chroma_format]); + if (! source->interlaced) dprintf(avctx, "No interlacing\n"); else - dprintf(avctx, "Interlacing: top fields first=%d\n, seq. fields=%d\n", - source->top_field_first, source->sequential_fields); + dprintf(avctx, "Interlacing: top fields first=%d\n", + source->top_field_first); dprintf(avctx, "Frame rate: %d/%d = %f\n", source->frame_rate.num, source->frame_rate.den, @@ -942,15 +922,15 @@ int dirac_motion_compensation(DiracConte int hbits, vbits; if (comp == 0) { - s->width = s->sequence.luma_width; - s->height = s->sequence.luma_height; + s->width = s->source.luma_width; + s->height = s->source.luma_height; s->xblen = s->frame_decoding.luma_xblen; s->yblen = s->frame_decoding.luma_yblen; s->xbsep = s->frame_decoding.luma_xbsep; s->ybsep = s->frame_decoding.luma_ybsep; } else { - s->width = s->sequence.chroma_width; - s->height = s->sequence.chroma_height; + s->width = s->source.chroma_width; + s->height = s->source.chroma_height; s->xblen = s->frame_decoding.chroma_xblen; s->yblen = s->frame_decoding.chroma_yblen; s->xbsep = s->frame_decoding.chroma_xbsep; Modified: dirac/libavcodec/dirac.h ============================================================================== --- dirac/libavcodec/dirac.h (original) +++ dirac/libavcodec/dirac.h Mon Nov 10 04:11:05 2008 @@ -35,12 +35,31 @@ #include "dirac_arith.h" typedef enum { + COLOR_PRIMARY_HDTV, ///< ITU-R BT. 709, also computer/web/sRGB + COLOR_PRIMARY_SDTV_525, ///< SMPTE 170M, 525 primaries + COLOR_PRIMARY_SDTV_625, ///< EBU Tech 3213-E, 625 primaries + COLOR_PRIMARY_DCINEMA, ///< SMPTE 428.1, CIE XYZ +} color_primary_t; + +typedef enum { + COLOR_MATRIX_HDTV, ///< ITU-R BT.709, also computer/web + COLOR_MATRIX_SDTV, ///< ITU-R BT.601 + COLOR_MATRIX_REVERSIBLE, ///< ITU-T H.264 +} color_matrix_t; + +typedef enum { TRANSFER_FUNC_TV, TRANSFER_FUNC_EXTENDED_GAMUT, TRANSFER_FUNC_LINEAR, TRANSFER_FUNC_DCI_GAMMA } transfer_func_t; +typedef struct { + color_primary_t primaries; + color_matrix_t matrix; + transfer_func_t transfer_function; +} color_specification; + #define DIRAC_SIGN(x) ((x) > 0 ? 2 : ((x) < 0 ? 1 : 0)) #define DIRAC_PARSE_INFO_PREFIX 0x42424344 #define CALC_PADDING(size, depth) \ @@ -49,14 +68,18 @@ typedef enum { struct source_parameters { + /* Information about the frames. */ + unsigned int luma_width; ///< the luma component width + unsigned int luma_height; ///< the luma component height + /** Choma format: 0: 4:4:4, 1: 4:2:2, 2: 4:2:0 */ + unsigned int chroma_format; + /* Interlacing. */ char interlaced; ///< flag for interlacing char top_field_first; - char sequential_fields; - - AVRational frame_rate; ///< frame rate - AVRational aspect_ratio; ///< aspect ratio + unsigned int frame_rate_index; ///< index into dirac_frame_rate[] + unsigned int aspect_ratio_index; ///< index into dirac_aspect_ratio[] /* Clean area. */ uint16_t clean_width; @@ -64,33 +87,25 @@ struct source_parameters uint16_t clean_left_offset; uint16_t clean_right_offset; + unsigned int signal_range_index; ///< index into dirac_signal_range[] + unsigned int color_spec_index; ///< index into ff_dirac_color_spec_presets[] + + /* Calculated: */ + unsigned int chroma_width; ///< the chroma component width + unsigned int chroma_height; ///< the chroma component height + + AVRational frame_rate; + AVRational aspect_ratio; + /* Luma and chroma offsets. */ uint16_t luma_offset; uint16_t luma_excursion; uint16_t chroma_offset; uint16_t chroma_excursion; - uint16_t color_spec; - uint16_t color_primaries; /* XXX: ??? */ - + color_specification color_spec; float k_r; float k_b; /* XXX: ??? */ - - transfer_func_t transfer_function; -}; - -struct sequence_parameters -{ - /* Information about the frames. */ - unsigned int luma_width; ///< the luma component width - unsigned int luma_height; ///< the luma component height - /** Choma format: 0: 4:4:4, 1: 4:2:2, 2: 4:2:0 */ - unsigned int chroma_format; - unsigned char video_depth; ///< depth in bits - - /* Calculated: */ - unsigned int chroma_width; ///< the chroma component width - unsigned int chroma_height; ///< the chroma component height }; struct decoding_parameters @@ -137,16 +152,16 @@ struct globalmc_parameters { }; /* Defaults for sequence parameters. */ -extern const struct sequence_parameters dirac_sequence_parameters_defaults[13]; -extern const struct source_parameters dirac_source_parameters_defaults[13]; +extern const struct source_parameters dirac_source_parameters_defaults[]; extern const struct decoding_parameters dirac_decoding_parameters_defaults[13]; -extern const AVRational dirac_preset_aspect_ratios[3]; -extern const uint8_t dirac_preset_luma_offset[3]; -extern const uint16_t dirac_preset_luma_excursion[3]; -extern const uint16_t dirac_preset_chroma_offset[3]; -extern const uint16_t dirac_preset_chroma_excursion[3]; +extern const AVRational ff_dirac_frame_rate[]; +extern const AVRational dirac_preset_aspect_ratios[]; +extern const uint16_t dirac_preset_luma_offset[]; +extern const uint16_t dirac_preset_luma_excursion[]; +extern const uint16_t dirac_preset_chroma_offset[]; +extern const uint16_t dirac_preset_chroma_excursion[]; +extern const color_specification ff_dirac_color_spec_presets[]; extern const uint8_t dirac_preset_primaries[4]; -extern const uint8_t dirac_preset_matrix[4]; extern const transfer_func_t dirac_preset_transfer_func[4]; extern const float dirac_preset_kr[3]; extern const float dirac_preset_kb[3]; @@ -199,7 +214,6 @@ typedef struct DiracContext { int16_t *mcpic; struct source_parameters source; - struct sequence_parameters sequence; struct decoding_parameters decoding; struct decoding_parameters frame_decoding; @@ -586,8 +600,6 @@ int dirac_motion_compensation(DiracConte int dirac_decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size); -void dirac_dump_sequence_parameters(AVCodecContext *avctx); - void dirac_dump_source_parameters(AVCodecContext *avctx); #endif /* AVCODEC_DIRAC_H */ Modified: dirac/libavcodec/diracdec.c ============================================================================== --- dirac/libavcodec/diracdec.c (original) +++ dirac/libavcodec/diracdec.c Mon Nov 10 04:11:05 2008 @@ -50,79 +50,66 @@ static int decode_end(AVCodecContext *av } /** - * Parse the sequence parameters in the access unit header + * Parse the source parameters in the access unit header */ -static void parse_sequence_parameters(DiracContext *s) { +static int parse_source_parameters(DiracContext *s) { GetBitContext *gb = &s->gb; /* Override the luma dimensions. */ if (get_bits1(gb)) { - s->sequence.luma_width = svq3_get_ue_golomb(gb); - s->sequence.luma_height = svq3_get_ue_golomb(gb); + s->source.luma_width = svq3_get_ue_golomb(gb); + s->source.luma_height = svq3_get_ue_golomb(gb); } /* Override the chroma format. */ if (get_bits1(gb)) - s->sequence.chroma_format = svq3_get_ue_golomb(gb); + s->source.chroma_format = svq3_get_ue_golomb(gb); /* Calculate the chroma dimensions. */ - s->chroma_hshift = s->sequence.chroma_format > 0; - s->chroma_vshift = s->sequence.chroma_format > 1; - s->sequence.chroma_width = s->sequence.luma_width >> s->chroma_hshift; - s->sequence.chroma_height = s->sequence.luma_height >> s->chroma_vshift; -} - -/** - * Parse the source parameters in the access unit header - */ -static int parse_source_parameters(DiracContext *s) { - GetBitContext *gb = &s->gb; + s->chroma_hshift = s->source.chroma_format > 0; + s->chroma_vshift = s->source.chroma_format > 1; + s->source.chroma_width = s->source.luma_width >> s->chroma_hshift; + s->source.chroma_height = s->source.luma_height >> s->chroma_vshift; - /* Access Unit Source parameters. */ if (get_bits1(gb)) { /* Interlace. */ s->source.interlaced = get_bits1(gb); - - if (s->source.interlaced) { - if (get_bits1(gb)) - s->source.top_field_first = get_bits1(gb); - - if (get_bits1(gb)) - s->source.sequential_fields = get_bits1(gb); - } } /* Framerate. */ if (get_bits1(gb)) { - unsigned int idx = svq3_get_ue_golomb(gb); + s->source.frame_rate_index = svq3_get_ue_golomb(gb); - if (idx > 8) + if (s->source.frame_rate_index > 10) return -1; - if (! idx) { + if (! s->source.frame_rate_index) { s->source.frame_rate.num = svq3_get_ue_golomb(gb); s->source.frame_rate.den = svq3_get_ue_golomb(gb); - } else { - /* Use a pre-set framerate. */ - s->source.frame_rate = ff_frame_rate_tab[idx]; } } + if (s->source.frame_rate_index > 0 && s->source.frame_rate_index <= 10) { + if (s->source.frame_rate_index <= 8) + s->source.frame_rate = ff_frame_rate_tab[s->source.frame_rate_index]; + else + s->source.frame_rate = ff_dirac_frame_rate[s->source.frame_rate_index-9]; + } /* Override aspect ratio. */ if (get_bits1(gb)) { - unsigned int idx = svq3_get_ue_golomb(gb); + s->source.aspect_ratio_index = svq3_get_ue_golomb(gb); - if (idx > 3) + if (s->source.aspect_ratio_index > 6) return -1; - if (! idx) { + if (! s->source.aspect_ratio_index) { s->source.aspect_ratio.num = svq3_get_ue_golomb(gb); s->source.aspect_ratio.den = svq3_get_ue_golomb(gb); - } else { - /* Use a pre-set aspect ratio. */ - s->source.aspect_ratio = dirac_preset_aspect_ratios[idx - 1]; } } + if (s->source.aspect_ratio_index > 0 && s->source.aspect_ratio_index <= 6) + s->source.aspect_ratio = + dirac_preset_aspect_ratios[s->source.aspect_ratio_index-1]; /* Override clean area. */ if (get_bits1(gb)) { @@ -134,40 +121,37 @@ static int parse_source_parameters(Dirac /* Override signal range. */ if (get_bits1(gb)) { - unsigned int idx = svq3_get_ue_golomb(gb); + s->source.signal_range_index = svq3_get_ue_golomb(gb); - if (idx > 3) + if (s->source.signal_range_index > 4) return -1; - if (! idx) { + if (! s->source.signal_range_index) { s->source.luma_offset = svq3_get_ue_golomb(gb); s->source.luma_excursion = svq3_get_ue_golomb(gb); s->source.chroma_offset = svq3_get_ue_golomb(gb); s->source.chroma_excursion = svq3_get_ue_golomb(gb); - } else { - /* Use a pre-set signal range. */ - s->source.luma_offset = dirac_preset_luma_offset[idx - 1]; - s->source.luma_excursion = dirac_preset_luma_excursion[idx - 1]; - s->source.chroma_offset = dirac_preset_chroma_offset[idx - 1]; - s->source.chroma_excursion = dirac_preset_chroma_excursion[idx - 1]; } } + if (s->source.signal_range_index > 0 && s->source.signal_range_index <= 4) { + int idx = s->source.signal_range_index - 1; + s->source.luma_offset = dirac_preset_luma_offset [idx]; + s->source.luma_excursion = dirac_preset_luma_excursion [idx]; + s->source.chroma_offset = dirac_preset_chroma_offset [idx]; + s->source.chroma_excursion = dirac_preset_chroma_excursion[idx]; + } /* Color spec. */ + s->source.color_spec = ff_dirac_color_spec_presets[s->source.color_spec_index]; if (get_bits1(gb)) { - unsigned int idx = svq3_get_ue_golomb(gb); + s->source.color_spec_index = svq3_get_ue_golomb(gb); - if (idx > 3) + if (s->source.color_spec_index > 4) return -1; - s->source.color_primaries = dirac_preset_primaries[idx]; - s->source.k_r = dirac_preset_kr[dirac_preset_matrix[idx]]; - s->source.k_b = dirac_preset_kb[dirac_preset_matrix[idx]]; - s->source.transfer_function = dirac_preset_transfer_func[idx]; - - /* XXX: color_spec? */ + s->source.color_spec = ff_dirac_color_spec_presets[s->source.color_spec_index]; - if (! idx) { + if (! s->source.color_spec_index) { /* Color primaries. */ if (get_bits1(gb)) { unsigned int primaries_idx = svq3_get_ue_golomb(gb); @@ -175,18 +159,17 @@ static int parse_source_parameters(Dirac if (primaries_idx > 3) return -1; - s->source.color_primaries = dirac_preset_primaries[primaries_idx]; + s->source.color_spec.primaries = primaries_idx; } /* Override matrix. */ if (get_bits1(gb)) { unsigned int matrix_idx = svq3_get_ue_golomb(gb); - if (matrix_idx > 3) + if (matrix_idx > 2) return -1; - s->source.k_r = dirac_preset_kr[dirac_preset_matrix[matrix_idx]]; - s->source.k_b = dirac_preset_kb[dirac_preset_matrix[matrix_idx]]; + s->source.color_spec.matrix = matrix_idx; } /* Transfer function. */ @@ -196,12 +179,12 @@ static int parse_source_parameters(Dirac if (tf_idx > 3) return -1; - s->source.transfer_function = dirac_preset_transfer_func[tf_idx]; + s->source.color_spec.transfer_function = tf_idx; } - } else { - /* XXX: Use the index. */ } } + s->source.k_r = dirac_preset_kr[s->source.color_spec_index]; + s->source.k_b = dirac_preset_kb[s->source.color_spec_index]; return 0; } @@ -214,6 +197,7 @@ static int parse_sequence_header(DiracCo unsigned int version_major; unsigned int version_minor; unsigned int video_format; + unsigned int picture_coding_mode; /* Parse parameters. */ version_major = svq3_get_ue_golomb(gb); @@ -232,15 +216,9 @@ static int parse_sequence_header(DiracCo video_format = svq3_get_ue_golomb(gb); dprintf(s->avctx, "Video format: %d\n", video_format); - if (video_format > 12) + if (video_format > 20) return -1; - /* Fill in defaults for the sequence parameters. */ - s->sequence = dirac_sequence_parameters_defaults[video_format]; - - /* Override the defaults. */ - parse_sequence_parameters(s); - /* Fill in defaults for the source parameters. */ s->source = dirac_source_parameters_defaults[video_format]; @@ -248,6 +226,8 @@ static int parse_sequence_header(DiracCo if (parse_source_parameters(s)) return -1; + picture_coding_mode = svq3_get_ue_golomb(gb); + /* Fill in defaults for the decoding parameters. */ s->decoding = dirac_decoding_parameters_defaults[video_format]; @@ -692,9 +672,9 @@ static int dirac_unpack_prediction_data( #define DIVRNDUP(a, b) ((a + b - 1) / b) - s->sbwidth = DIVRNDUP(s->sequence.luma_width, + s->sbwidth = DIVRNDUP(s->source.luma_width, (s->frame_decoding.luma_xbsep << 2)); - s->sbheight = DIVRNDUP(s->sequence.luma_height, + s->sbheight = DIVRNDUP(s->source.luma_height, (s->frame_decoding.luma_ybsep << 2)); s->blwidth = s->sbwidth << 2; s->blheight = s->sbheight << 2; @@ -890,13 +870,13 @@ START_TIMER int width, height; if (comp == 0) { - width = s->sequence.luma_width; - height = s->sequence.luma_height; + width = s->source.luma_width; + height = s->source.luma_height; s->padded_width = s->padded_luma_width; s->padded_height = s->padded_luma_height; } else { - width = s->sequence.chroma_width; - height = s->sequence.chroma_height; + width = s->source.chroma_width; + height = s->source.chroma_height; s->padded_width = s->padded_chroma_width; s->padded_height = s->padded_chroma_height; } @@ -1037,13 +1017,13 @@ static int parse_frame(DiracContext *s) (((size + (1 << depth) - 1) >> depth) << depth) /* Round up to a multiple of 2^depth. */ - s->padded_luma_width = CALC_PADDING(s->sequence.luma_width, + s->padded_luma_width = CALC_PADDING(s->source.luma_width, s->frame_decoding.wavelet_depth); - s->padded_luma_height = CALC_PADDING(s->sequence.luma_height, + s->padded_luma_height = CALC_PADDING(s->source.luma_height, s->frame_decoding.wavelet_depth); - s->padded_chroma_width = CALC_PADDING(s->sequence.chroma_width, + s->padded_chroma_width = CALC_PADDING(s->source.chroma_width, s->frame_decoding.wavelet_depth); - s->padded_chroma_height = CALC_PADDING(s->sequence.chroma_height, + s->padded_chroma_height = CALC_PADDING(s->source.chroma_height, s->frame_decoding.wavelet_depth); return 0; @@ -1083,7 +1063,6 @@ int dirac_decode_frame(AVCodecContext *a /* Dump the header. */ #if 0 - dirac_dump_sequence_parameters(avctx); dirac_dump_source_parameters(avctx); #endif @@ -1101,15 +1080,15 @@ int dirac_decode_frame(AVCodecContext *a avctx->pix_fmt = PIX_FMT_YUVJ420P; /* XXX */ - if (avcodec_check_dimensions(avctx, s->sequence.luma_width, - s->sequence.luma_height)) { + if (avcodec_check_dimensions(avctx, s->source.luma_width, + s->source.luma_height)) { av_log(avctx, AV_LOG_ERROR, "avcodec_check_dimensions() failed\n"); return -1; } - avcodec_set_dimensions(avctx, s->sequence.luma_width, - s->sequence.luma_height); + avcodec_set_dimensions(avctx, s->source.luma_width, + s->source.luma_height); if (s->picture.data[0] != NULL) avctx->release_buffer(avctx, &s->picture);
participants (1)
-
conrad