Hello crews, I attached two simple patches reenabling a decoder feature been initially disabled due to lack of real-world samples.
I've recently got a couple of appropriate samples from the PPSSPP emulator project so I coud test this feature extensively. The 2nd patch is a cosmetical one that renames the "phase_shift" variable to "inverse_phase". This seems to give a better description of what's actually going on (180° phase shift). Do we need to update FATE tests to include a test for this feature? Best regards Maxim
From 9f4931faba250755c7d546596636ad7bdf150566 Mon Sep 17 00:00:00 2001 From: Max Poliakovski <maximumspat...@googlemail.com> Date: Sat, 6 Jun 2015 23:28:47 +0200 Subject: [PATCH 1/2] atrac3plus: add support for GHA phase inversion. --- libavcodec/atrac3plus.c | 6 +----- libavcodec/atrac3plusdsp.c | 10 ++++++++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/libavcodec/atrac3plus.c b/libavcodec/atrac3plus.c index f998a7f..3d75749 100644 --- a/libavcodec/atrac3plus.c +++ b/libavcodec/atrac3plus.c @@ -1724,11 +1724,7 @@ static int decode_tones_info(GetBitContext *gb, Atrac3pChanUnitCtx *ctx, if (num_channels == 2) { get_subband_flags(gb, ctx->waves_info->tone_sharing, ctx->waves_info->num_tone_bands); get_subband_flags(gb, ctx->waves_info->tone_master, ctx->waves_info->num_tone_bands); - if (get_subband_flags(gb, ctx->waves_info->phase_shift, - ctx->waves_info->num_tone_bands)) { - avpriv_report_missing_feature(avctx, "GHA Phase shifting"); - return AVERROR_PATCHWELCOME; - } + get_subband_flags(gb, ctx->waves_info->phase_shift, ctx->waves_info->num_tone_bands); } ctx->waves_info->tones_index = 0; diff --git a/libavcodec/atrac3plusdsp.c b/libavcodec/atrac3plusdsp.c index 3c68f74..50ac134 100644 --- a/libavcodec/atrac3plusdsp.c +++ b/libavcodec/atrac3plusdsp.c @@ -116,6 +116,7 @@ av_cold void ff_atrac3p_init_wave_synth(void) * @param[in] synth_param ptr to common synthesis parameters * @param[in] waves_info parameters for each sine wave * @param[in] envelope envelope data for all waves in a group + * @param[in] fdsp ptr to floating-point DSP context * @param[in] phase_shift flag indicates 180° phase shift * @param[in] reg_offset region offset for trimming envelope data * @param[out] out receives sythesized data @@ -123,6 +124,7 @@ av_cold void ff_atrac3p_init_wave_synth(void) static void waves_synth(Atrac3pWaveSynthParams *synth_param, Atrac3pWavesData *waves_info, Atrac3pWaveEnvelope *envelope, + AVFloatDSPContext *fdsp, int phase_shift, int reg_offset, float *out) { int i, wn, inc, pos; @@ -146,6 +148,10 @@ static void waves_synth(Atrac3pWaveSynthParams *synth_param, } } + /* 180° phase shift if requested */ + if (phase_shift) + fdsp->vector_fmul_scalar(out, out, -1.0f, 128); + /* fade in with steep Hann window if requested */ if (envelope->has_start_point) { pos = (envelope->start_pos << 2) - reg_offset; @@ -216,11 +222,11 @@ void ff_atrac3p_generate_tones(Atrac3pChanUnitCtx *ch_unit, AVFloatDSPContext *f /* synthesize waves for both overlapping regions */ if (tones_now->num_wavs && reg1_env_nonzero) waves_synth(ch_unit->waves_info_prev, tones_now, &tones_now->curr_env, - ch_unit->waves_info_prev->phase_shift[sb] & ch_num, + fdsp, ch_unit->waves_info_prev->phase_shift[sb] & ch_num, 128, wavreg1); if (tones_next->num_wavs && reg2_env_nonzero) - waves_synth(ch_unit->waves_info, tones_next, &tones_next->curr_env, + waves_synth(ch_unit->waves_info, tones_next, &tones_next->curr_env, fdsp, ch_unit->waves_info->phase_shift[sb] & ch_num, 0, wavreg2); /* Hann windowing for non-faded wave signals */ -- 1.9.1
From 3e0a8c23c5752db78950b0c868fce9f955e789ae Mon Sep 17 00:00:00 2001 From: Max Poliakovski <maximumspat...@googlemail.com> Date: Sun, 7 Jun 2015 12:52:06 +0200 Subject: [PATCH 2/2] atrac3plus: give the phase_shift flag a better name. --- libavcodec/atrac3plus.c | 2 +- libavcodec/atrac3plus.h | 2 +- libavcodec/atrac3plusdsp.c | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libavcodec/atrac3plus.c b/libavcodec/atrac3plus.c index 3d75749..b16a139 100644 --- a/libavcodec/atrac3plus.c +++ b/libavcodec/atrac3plus.c @@ -1724,7 +1724,7 @@ static int decode_tones_info(GetBitContext *gb, Atrac3pChanUnitCtx *ctx, if (num_channels == 2) { get_subband_flags(gb, ctx->waves_info->tone_sharing, ctx->waves_info->num_tone_bands); get_subband_flags(gb, ctx->waves_info->tone_master, ctx->waves_info->num_tone_bands); - get_subband_flags(gb, ctx->waves_info->phase_shift, ctx->waves_info->num_tone_bands); + get_subband_flags(gb, ctx->waves_info->invert_phase, ctx->waves_info->num_tone_bands); } ctx->waves_info->tones_index = 0; diff --git a/libavcodec/atrac3plus.h b/libavcodec/atrac3plus.h index 1b001fa..a33c38a 100644 --- a/libavcodec/atrac3plus.h +++ b/libavcodec/atrac3plus.h @@ -122,7 +122,7 @@ typedef struct Atrac3pWaveSynthParams { int num_tone_bands; ///< number of PQF bands with tones uint8_t tone_sharing[ATRAC3P_SUBBANDS]; ///< 1 - subband-wise tone sharing flags uint8_t tone_master[ATRAC3P_SUBBANDS]; ///< 1 - subband-wise tone channel swapping - uint8_t phase_shift[ATRAC3P_SUBBANDS]; ///< 1 - subband-wise 180° phase shifting + uint8_t invert_phase[ATRAC3P_SUBBANDS]; ///< 1 - subband-wise phase inversion int tones_index; ///< total sum of tones in this unit Atrac3pWaveParam waves[48]; } Atrac3pWaveSynthParams; diff --git a/libavcodec/atrac3plusdsp.c b/libavcodec/atrac3plusdsp.c index 50ac134..17c6437 100644 --- a/libavcodec/atrac3plusdsp.c +++ b/libavcodec/atrac3plusdsp.c @@ -117,7 +117,7 @@ av_cold void ff_atrac3p_init_wave_synth(void) * @param[in] waves_info parameters for each sine wave * @param[in] envelope envelope data for all waves in a group * @param[in] fdsp ptr to floating-point DSP context - * @param[in] phase_shift flag indicates 180° phase shift + * @param[in] invert_phase flag indicating 180° phase shift * @param[in] reg_offset region offset for trimming envelope data * @param[out] out receives sythesized data */ @@ -125,7 +125,7 @@ static void waves_synth(Atrac3pWaveSynthParams *synth_param, Atrac3pWavesData *waves_info, Atrac3pWaveEnvelope *envelope, AVFloatDSPContext *fdsp, - int phase_shift, int reg_offset, float *out) + int invert_phase, int reg_offset, float *out) { int i, wn, inc, pos; double amp; @@ -148,8 +148,8 @@ static void waves_synth(Atrac3pWaveSynthParams *synth_param, } } - /* 180° phase shift if requested */ - if (phase_shift) + /* invert phase if requested */ + if (invert_phase) fdsp->vector_fmul_scalar(out, out, -1.0f, 128); /* fade in with steep Hann window if requested */ @@ -222,12 +222,12 @@ void ff_atrac3p_generate_tones(Atrac3pChanUnitCtx *ch_unit, AVFloatDSPContext *f /* synthesize waves for both overlapping regions */ if (tones_now->num_wavs && reg1_env_nonzero) waves_synth(ch_unit->waves_info_prev, tones_now, &tones_now->curr_env, - fdsp, ch_unit->waves_info_prev->phase_shift[sb] & ch_num, + fdsp, ch_unit->waves_info_prev->invert_phase[sb] & ch_num, 128, wavreg1); if (tones_next->num_wavs && reg2_env_nonzero) waves_synth(ch_unit->waves_info, tones_next, &tones_next->curr_env, fdsp, - ch_unit->waves_info->phase_shift[sb] & ch_num, 0, wavreg2); + ch_unit->waves_info->invert_phase[sb] & ch_num, 0, wavreg2); /* Hann windowing for non-faded wave signals */ if (tones_now->num_wavs && tones_next->num_wavs && -- 1.9.1
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel