[soc]: r3798 - in dirac/libavcodec: dirac.c dirac.h diracdec.c
Author: conrad Date: Mon Nov 10 04:12:11 2008 New Revision: 3798 Log: Move parse_sequence_headers to dirac.c 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:12:11 2008 @@ -171,6 +171,194 @@ void dirac_dump_source_parameters(AVCode dprintf(avctx, "-----------------------------------------------------\n"); } +/** + * Parse the source parameters in the access unit header + */ +static int parse_source_parameters(DiracContext *s) +{ + GetBitContext *gb = &s->gb; + + /* Override the luma dimensions. */ + if (get_bits1(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->source.chroma_format = svq3_get_ue_golomb(gb); + + /* Calculate the chroma dimensions. */ + 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; + + if (get_bits1(gb)) + /* Interlace. */ + s->source.interlaced = svq3_get_ue_golomb(gb); + if (s->source.interlaced > 1) + return -1; + + /* Framerate. */ + if (get_bits1(gb)) { + s->source.frame_rate_index = svq3_get_ue_golomb(gb); + + if (s->source.frame_rate_index > 10) + return -1; + + 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); + } + } + 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)) { + s->source.aspect_ratio_index = svq3_get_ue_golomb(gb); + + if (s->source.aspect_ratio_index > 6) + return -1; + + 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); + } + } + if (s->source.aspect_ratio_index > 0 && s->source.aspect_ratio_index <= 6) + s->source.aspect_ratio = + ff_dirac_preset_aspect_ratios[s->source.aspect_ratio_index-1]; + + /* Override clean area. */ + if (get_bits1(gb)) { + s->source.clean_width = svq3_get_ue_golomb(gb); + s->source.clean_height = svq3_get_ue_golomb(gb); + s->source.clean_left_offset = svq3_get_ue_golomb(gb); + s->source.clean_right_offset = svq3_get_ue_golomb(gb); + } + + /* Override signal range. */ + if (get_bits1(gb)) { + s->source.signal_range_index = svq3_get_ue_golomb(gb); + + if (s->source.signal_range_index > 4) + return -1; + + 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); + } + } + 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 = ff_dirac_preset_luma_offset [idx]; + s->source.luma_excursion = ff_dirac_preset_luma_excursion [idx]; + s->source.chroma_offset = ff_dirac_preset_chroma_offset [idx]; + s->source.chroma_excursion = ff_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)) { + s->source.color_spec_index = svq3_get_ue_golomb(gb); + + if (s->source.color_spec_index > 4) + return -1; + + s->source.color_spec = ff_dirac_color_spec_presets[s->source.color_spec_index]; + + if (! s->source.color_spec_index) { + /* Color primaries. */ + if (get_bits1(gb)) { + unsigned int primaries_idx = svq3_get_ue_golomb(gb); + + if (primaries_idx > 3) + return -1; + + 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 > 2) + return -1; + + s->source.color_spec.matrix = matrix_idx; + } + + /* Transfer function. */ + if (get_bits1(gb)) { + unsigned int tf_idx = svq3_get_ue_golomb(gb); + + if (tf_idx > 3) + return -1; + + s->source.color_spec.transfer_function = tf_idx; + } + } + } + s->source.k_r = ff_dirac_preset_kr[s->source.color_spec_index]; + s->source.k_b = ff_dirac_preset_kb[s->source.color_spec_index]; + + s->source.luma_depth = av_log2(s->source.luma_excursion + 1); + s->source.chroma_depth = av_log2(s->source.chroma_excursion + 1); + + return 0; +} + +/** + * Parse the sequence header + */ +int ff_dirac_parse_sequence_header(DiracContext *s) +{ + GetBitContext *gb = &s->gb; + 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); + version_minor = svq3_get_ue_golomb(gb); + /* XXX: Don't check the version yet, existing encoders do not yet + set this to a sane value (0.6 at the moment). */ + + /* XXX: Not yet documented in the spec. This is actually the main + thing that is missing. */ + s->profile = svq3_get_ue_golomb(gb); + s->level = svq3_get_ue_golomb(gb); + dprintf(s->avctx, "Access unit header: Version %d.%d\n", + version_major, version_minor); + dprintf(s->avctx, "Profile: %d, Level: %d\n", s->profile, s->level); + + video_format = svq3_get_ue_golomb(gb); + dprintf(s->avctx, "Video format: %d\n", video_format); + + if (video_format > 20) + return -1; + + /* Fill in defaults for the source parameters. */ + s->source = ff_dirac_source_parameters_defaults[video_format]; + + /* Override the defaults. */ + if (parse_source_parameters(s)) + return -1; + + picture_coding_mode = svq3_get_ue_golomb(gb); + + return 0; +} + struct dirac_arith_context_set ff_dirac_context_set_split = { .follow = { ARITH_CONTEXT_SB_F1, ARITH_CONTEXT_SB_F2, Modified: dirac/libavcodec/dirac.h ============================================================================== --- dirac/libavcodec/dirac.h (original) +++ dirac/libavcodec/dirac.h Mon Nov 10 04:12:11 2008 @@ -590,4 +590,6 @@ int dirac_decode_frame(AVCodecContext *a void dirac_dump_source_parameters(AVCodecContext *avctx); +int ff_dirac_parse_sequence_header(DiracContext *s); + #endif /* AVCODEC_DIRAC_H */ Modified: dirac/libavcodec/diracdec.c ============================================================================== --- dirac/libavcodec/diracdec.c (original) +++ dirac/libavcodec/diracdec.c Mon Nov 10 04:12:11 2008 @@ -51,194 +51,6 @@ static int decode_end(AVCodecContext *av } /** - * Parse the source parameters in the access unit header - */ -static int parse_source_parameters(DiracContext *s) -{ - GetBitContext *gb = &s->gb; - - /* Override the luma dimensions. */ - if (get_bits1(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->source.chroma_format = svq3_get_ue_golomb(gb); - - /* Calculate the chroma dimensions. */ - 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; - - if (get_bits1(gb)) - /* Interlace. */ - s->source.interlaced = svq3_get_ue_golomb(gb); - if (s->source.interlaced > 1) - return -1; - - /* Framerate. */ - if (get_bits1(gb)) { - s->source.frame_rate_index = svq3_get_ue_golomb(gb); - - if (s->source.frame_rate_index > 10) - return -1; - - 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); - } - } - 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)) { - s->source.aspect_ratio_index = svq3_get_ue_golomb(gb); - - if (s->source.aspect_ratio_index > 6) - return -1; - - 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); - } - } - if (s->source.aspect_ratio_index > 0 && s->source.aspect_ratio_index <= 6) - s->source.aspect_ratio = - ff_dirac_preset_aspect_ratios[s->source.aspect_ratio_index-1]; - - /* Override clean area. */ - if (get_bits1(gb)) { - s->source.clean_width = svq3_get_ue_golomb(gb); - s->source.clean_height = svq3_get_ue_golomb(gb); - s->source.clean_left_offset = svq3_get_ue_golomb(gb); - s->source.clean_right_offset = svq3_get_ue_golomb(gb); - } - - /* Override signal range. */ - if (get_bits1(gb)) { - s->source.signal_range_index = svq3_get_ue_golomb(gb); - - if (s->source.signal_range_index > 4) - return -1; - - 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); - } - } - 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 = ff_dirac_preset_luma_offset [idx]; - s->source.luma_excursion = ff_dirac_preset_luma_excursion [idx]; - s->source.chroma_offset = ff_dirac_preset_chroma_offset [idx]; - s->source.chroma_excursion = ff_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)) { - s->source.color_spec_index = svq3_get_ue_golomb(gb); - - if (s->source.color_spec_index > 4) - return -1; - - s->source.color_spec = ff_dirac_color_spec_presets[s->source.color_spec_index]; - - if (! s->source.color_spec_index) { - /* Color primaries. */ - if (get_bits1(gb)) { - unsigned int primaries_idx = svq3_get_ue_golomb(gb); - - if (primaries_idx > 3) - return -1; - - 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 > 2) - return -1; - - s->source.color_spec.matrix = matrix_idx; - } - - /* Transfer function. */ - if (get_bits1(gb)) { - unsigned int tf_idx = svq3_get_ue_golomb(gb); - - if (tf_idx > 3) - return -1; - - s->source.color_spec.transfer_function = tf_idx; - } - } - } - s->source.k_r = ff_dirac_preset_kr[s->source.color_spec_index]; - s->source.k_b = ff_dirac_preset_kb[s->source.color_spec_index]; - - s->source.luma_depth = av_log2(s->source.luma_excursion + 1); - s->source.chroma_depth = av_log2(s->source.chroma_excursion + 1); - - return 0; -} - -/** - * Parse the sequence header - */ -static int parse_sequence_header(DiracContext *s) -{ - GetBitContext *gb = &s->gb; - 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); - version_minor = svq3_get_ue_golomb(gb); - /* XXX: Don't check the version yet, existing encoders do not yet - set this to a sane value (0.6 at the moment). */ - - /* XXX: Not yet documented in the spec. This is actually the main - thing that is missing. */ - s->profile = svq3_get_ue_golomb(gb); - s->level = svq3_get_ue_golomb(gb); - dprintf(s->avctx, "Access unit header: Version %d.%d\n", - version_major, version_minor); - dprintf(s->avctx, "Profile: %d, Level: %d\n", s->profile, s->level); - - video_format = svq3_get_ue_golomb(gb); - dprintf(s->avctx, "Video format: %d\n", video_format); - - if (video_format > 20) - return -1; - - /* Fill in defaults for the source parameters. */ - s->source = ff_dirac_source_parameters_defaults[video_format]; - - /* Override the defaults. */ - if (parse_source_parameters(s)) - return -1; - - picture_coding_mode = svq3_get_ue_golomb(gb); - - return 0; -} - -/** * Dequantize a coefficient * * @param coeff coefficient to dequantize @@ -1044,7 +856,7 @@ int dirac_decode_frame(AVCodecContext *a s->avctx = avctx; if (parse_code == pc_seq_header) { - if (parse_sequence_header(s)) + if (ff_dirac_parse_sequence_header(s)) return -1; /* Dump the header. */
participants (1)
-
conrad