[soc]: r3775 - in dirac/libavcodec: dirac.c dirac.h diracdec.c
Author: conrad Date: Mon Nov 10 04:11:19 2008 New Revision: 3775 Log: Update the picture header parsing to the latest spec 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:19 2008 @@ -64,25 +64,6 @@ const struct source_parameters dirac_sou { 7680, 4320, 1, 0, 1, 6, 1, 3840, 2160, 0, 0, 3, 3 }, }; -/* Defaults for decoding parameters. */ -const struct decoding_parameters dirac_decoding_parameters_defaults[13] = -{ - { 4, 0, 1, 8, 12, 8, 12, 2, 1, 1, 1, 1, 1, 4, 3, 1, 1, 8, 6, 12, 8, 32, 32, 512 }, - { 4, 0, 1, 4, 8, 4, 8, 2, 1, 1, 1, 1, 1, 4, 3, 1, 1, 8, 6, 12, 8, 16, 16, 512 }, - { 4, 0, 1, 4, 8, 4, 8, 2, 1, 1, 1, 1, 1, 4, 3, 1, 1, 8, 6, 12, 8, 16, 16, 512 }, - { 4, 0, 1, 8, 12, 8, 12, 2, 1, 1, 1, 1, 1, 4, 3, 1, 1, 8, 6, 12, 8, 32, 32, 512 }, - { 4, 0, 1, 8, 12, 8, 12, 2, 1, 1, 1, 1, 1, 4, 3, 1, 1, 8, 6, 12, 8, 32, 32, 512 }, - { 4, 0, 1, 8, 12, 8, 12, 2, 1, 1, 1, 1, 1, 4, 3, 1, 1, 8, 6, 12, 8, 32, 32, 512 }, - { 4, 0, 1, 8, 12, 8, 12, 2, 1, 1, 1, 1, 1, 4, 3, 1, 1, 8, 6, 12, 8, 32, 32, 512 }, - - { 4, 0, 1, 8, 12, 8, 12, 2, 1, 1, 1, 1, 1, 4, 3, 1, 1, 8, 6, 12, 8, 32, 32, 512 }, - { 4, 0, 1, 8, 12, 8, 12, 2, 1, 1, 1, 1, 1, 4, 3, 1, 1, 8, 6, 12, 8, 32, 32, 512 }, - { 4, 0, 1, 12, 16, 12, 16, 2, 1, 1, 1, 1, 1, 4, 3, 1, 1, 8, 6, 12, 8, 48, 48, 768 }, - { 4, 0, 1, 16, 24, 16, 24, 2, 1, 1, 1, 1, 1, 4, 3, 1, 1, 8, 6, 12, 8, 48, 48, 1024 }, - { 4, 6, 1, 16, 24, 16, 24, 2, 1, 1, 1, 1, 1, 4, 3, 1, 1, 8, 6, 12, 8, 48, 48, 1024 }, - { 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[] = { {1, 1}, {10, 11}, {12, 11}, Modified: dirac/libavcodec/dirac.h ============================================================================== --- dirac/libavcodec/dirac.h (original) +++ dirac/libavcodec/dirac.h Mon Nov 10 04:11:19 2008 @@ -113,8 +113,6 @@ struct source_parameters struct decoding_parameters { uint8_t wavelet_depth; ///< depth of the IDWT - uint8_t wavelet_idx_intra; ///< wavelet transform for intra frames - uint8_t wavelet_idx_inter; ///< wavelet transform for inter frames uint8_t luma_xbsep; uint8_t luma_xblen; @@ -127,18 +125,6 @@ struct decoding_parameters int16_t picture_weight_ref2; unsigned int picture_weight_precision; - /* Codeblocks h*v. */ - int intra_hlevel_012, intra_vlevel_012; - int intra_hlevel_other, intra_vlevel_other; - int inter_hlevel_01, inter_vlevel_01; - int inter_hlevel_2, inter_vlevel_2; - int inter_hlevel_other, inter_vlevel_other; - - int slice_width; - int slide_height; - int slice_bits; - - /* Calculated. */ uint8_t chroma_xbsep; uint8_t chroma_xblen; uint8_t chroma_ybsep; @@ -146,9 +132,9 @@ struct decoding_parameters }; struct globalmc_parameters { - unsigned int b[2]; ///< b vector - unsigned int A[2][2]; ///< A matrix - int c[2]; ///< c vector + unsigned int pan_tilt[2]; ///< pan/tilt vector + unsigned int zrs[2][2]; ///< zoom/rotate/shear matrix + int perspective[2]; ///< perspective vector unsigned int zrs_exp; unsigned int perspective_exp; }; @@ -220,6 +206,7 @@ typedef struct DiracContext { struct decoding_parameters frame_decoding; + unsigned int codeblock_mode; unsigned int codeblocksh[7]; /* XXX: 7 levels. */ unsigned int codeblocksv[7]; /* XXX: 7 levels. */ Modified: dirac/libavcodec/diracdec.c ============================================================================== --- dirac/libavcodec/diracdec.c (original) +++ dirac/libavcodec/diracdec.c Mon Nov 10 04:11:19 2008 @@ -230,9 +230,6 @@ static int parse_sequence_header(DiracCo picture_coding_mode = svq3_get_ue_golomb(gb); - /* Fill in defaults for the decoding parameters. */ - s->decoding = dirac_decoding_parameters_defaults[video_format]; - return 0; } @@ -449,7 +446,7 @@ static int dirac_unpack_prediction_param /* Read block parameters. */ unsigned int idx = svq3_get_ue_golomb(gb); - if (idx > 3) + if (idx > 4) return -1; if (idx == 0) { @@ -487,24 +484,27 @@ static int dirac_unpack_prediction_param /* Pan/til parameters. */ if (get_bits1(gb)) { - s->globalmc.b[0] = dirac_get_se_golomb(gb); - s->globalmc.b[1] = dirac_get_se_golomb(gb); + s->globalmc.pan_tilt[0] = dirac_get_se_golomb(gb); + s->globalmc.pan_tilt[1] = dirac_get_se_golomb(gb); } /* Rotation/shear parameters. */ if (get_bits1(gb)) { s->globalmc.zrs_exp = svq3_get_ue_golomb(gb); - s->globalmc.A[0][0] = dirac_get_se_golomb(gb); - s->globalmc.A[0][1] = dirac_get_se_golomb(gb); - s->globalmc.A[1][0] = dirac_get_se_golomb(gb); - s->globalmc.A[1][1] = dirac_get_se_golomb(gb); + s->globalmc.zrs[0][0] = dirac_get_se_golomb(gb); + s->globalmc.zrs[0][1] = dirac_get_se_golomb(gb); + s->globalmc.zrs[1][0] = dirac_get_se_golomb(gb); + s->globalmc.zrs[1][1] = dirac_get_se_golomb(gb); + } else { + s->globalmc.zrs[0][0] = 1; + s->globalmc.zrs[1][1] = 1; } /* Perspective parameters. */ if (get_bits1(gb)) { s->globalmc.perspective_exp = svq3_get_ue_golomb(gb); - s->globalmc.c[0] = dirac_get_se_golomb(gb); - s->globalmc.c[1] = dirac_get_se_golomb(gb); + s->globalmc.perspective[0] = dirac_get_se_golomb(gb); + s->globalmc.perspective[1] = dirac_get_se_golomb(gb); } } } @@ -513,16 +513,10 @@ static int dirac_unpack_prediction_param just ignore it, it should and will be zero. */ svq3_get_ue_golomb(gb); - /* XXX: For now set the weights here, I can't find this in the - specification. */ - s->frame_decoding.picture_weight_ref1 = 1; - if (s->refs == 2) { - s->frame_decoding.picture_weight_precision = 1; - s->frame_decoding.picture_weight_ref2 = 1; - } else { - s->frame_decoding.picture_weight_precision = 0; - s->frame_decoding.picture_weight_ref2 = 0; - } + /* Default weights */ + s->frame_decoding.picture_weight_precision = 1; + s->frame_decoding.picture_weight_ref1 = 1; + s->frame_decoding.picture_weight_ref2 = 1; /* Override reference picture weights. */ if (get_bits1(gb)) { @@ -683,14 +677,14 @@ static int dirac_unpack_prediction_data( s->sbsplit = av_mallocz(s->sbwidth * s->sbheight * sizeof(int)); if (!s->sbsplit) { - av_log(s->avctx, AV_LOG_ERROR, "avcodec_check_dimensions() failed\n"); + av_log(s->avctx, AV_LOG_ERROR, "av_mallocz() failed\n"); return -1; } s->blmotion = av_mallocz(s->blwidth * s->blheight * sizeof(*s->blmotion)); if (!s->blmotion) { av_freep(&s->sbsplit); - av_log(s->avctx, AV_LOG_ERROR, "avcodec_check_dimensions() failed\n"); + av_log(s->avctx, AV_LOG_ERROR, "av_mallocz() failed\n"); return -1; } @@ -995,24 +989,22 @@ static int parse_frame(DiracContext *s) if (!s->zero_res) { s->wavelet_idx = svq3_get_ue_golomb(gb); - if (s->wavelet_idx > 7) + if (s->wavelet_idx > 6) return -1; s->frame_decoding.wavelet_depth = svq3_get_ue_golomb(gb); - /* Spatial partitioning. */ + /* Codeblock paramaters (core syntax only) */ if (get_bits1(gb)) { - unsigned int idx; - for (i = 0; i <= s->frame_decoding.wavelet_depth; i++) { s->codeblocksh[i] = svq3_get_ue_golomb(gb); s->codeblocksv[i] = svq3_get_ue_golomb(gb); } - idx = svq3_get_ue_golomb(gb); - dprintf(s->avctx, "Codeblock mode idx: %d\n", idx); - /* XXX: Here 0, so single quant. */ - } + s->codeblock_mode = svq3_get_ue_golomb(gb); + } else + for (i = 0; i <= s->frame_decoding.wavelet_depth; i++) + s->codeblocksh[i] = s->codeblocksv[i] = 1; } #define CALC_PADDING(size, depth) \
participants (1)
-
conrad