From 400e2acd112d35fa411c91cf02c638450b0e7c8c Mon Sep 17 00:00:00 2001 From: Burt P Date: Sun, 21 Aug 2016 13:00:22 -0500 Subject: af_hdcd: Code comments update Signed-off-by: Burt P --- libavfilter/af_hdcd.c | 181 ++++++++++++++++++++++++++------------------------ 1 file changed, 95 insertions(+), 86 deletions(-) (limited to 'libavfilter') diff --git a/libavfilter/af_hdcd.c b/libavfilter/af_hdcd.c index 9377eb6b5c..37b427af9a 100644 --- a/libavfilter/af_hdcd.c +++ b/libavfilter/af_hdcd.c @@ -1,40 +1,46 @@ /* - Copyright (C) 2010, Chris Moeller, - All rights reserved. - Optimizations by Gumboot - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. The names of its contributors may not be used to endorse or promote - products derived from this software without specific prior written - permission. - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Copyright (C) 2010, Chris Moeller, + * All rights reserved. + * Optimizations by Gumboot + * Additional work by Burt P. + * Original code reverse engineered from HDCD decoder library by Christopher Key, + * which was likely reverse engineered from Windows Media Player. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* - Original code reverse engineered from HDCD decoder library by Christopher Key, - which was likely reverse engineered from Windows Media Player. + * HDCD is High Definition Compatible Digital + * http://wiki.hydrogenaud.io/index.php?title=High_Definition_Compatible_Digital + * + * More information about HDCD-encoded audio CDs: + * http://www.audiomisc.co.uk/HFN/HDCD/Enigma.html + * http://www.audiomisc.co.uk/HFN/HDCD/Examined.html */ -/* - HDCD is High Definition Compatible Digital - More information about HDCD-encoded audio CDs: - http://www.audiomisc.co.uk/HFN/HDCD/Enigma.html - http://www.audiomisc.co.uk/HFN/HDCD/Examined.html +/** + * @file + * HDCD decoding filter */ #include "libavutil/opt.h" @@ -820,34 +826,34 @@ typedef struct { uint64_t window; unsigned char readahead; - /* arg is set when a packet prefix is found. - * control is the active control code, where - * bit 0-3: target_gain, 4-bit (3.1) fixed-point value - * bit 4 : peak_extend - * bit 5 : transient_filter - * bit 6,7: always zero */ - unsigned char arg, control; - unsigned sustain, sustain_reset; /* code detect timer */ + /** arg is set when a packet prefix is found. + * control is the active control code, where + * bit 0-3: target_gain, 4-bit (3.1) fixed-point value + * bit 4 : peak_extend + * bit 5 : transient_filter + * bit 6,7: always zero */ + uint8_t arg, control; + unsigned int sustain, sustain_reset; /**< code detect timer */ - int running_gain; /* 11-bit (3.8) fixed point, extended from target_gain */ + int running_gain; /**< 11-bit (3.8) fixed point, extended from target_gain */ /* counters */ - int code_counterA; /* 8-bit format packet */ - int code_counterA_almost; /* looks like an A code, but a bit expected to be 0 is 1 */ - int code_counterB; /* 16-bit format packet, 8-bit code, 8-bit XOR of code */ - int code_counterB_checkfails; /* looks like a B code, but doesn't pass the XOR check */ - int code_counterC; /* packet prefix was found, expect a code */ - int code_counterC_unmatched; /* told to look for a code, but didn't find one */ - int count_peak_extend; /* valid packets where peak_extend was enabled */ - int count_transient_filter; /* valid packets where filter was detected */ - /* target_gain is a 4-bit (3.1) fixed-point value, always - * negative, but stored positive. - * The 16 possible values range from -7.5 to 0.0 dB in - * steps of 0.5, but no value below -6.0 dB should appear. */ - int gain_counts[16]; /* for cursiosity, mostly */ + int code_counterA; /**< 8-bit format packet */ + int code_counterA_almost; /**< looks like an A code, but a bit expected to be 0 is 1 */ + int code_counterB; /**< 16-bit format packet, 8-bit code, 8-bit XOR of code */ + int code_counterB_checkfails; /**< looks like a B code, but doesn't pass the XOR check */ + int code_counterC; /**< packet prefix was found, expect a code */ + int code_counterC_unmatched; /**< told to look for a code, but didn't find one */ + int count_peak_extend; /**< valid packets where peak_extend was enabled */ + int count_transient_filter; /**< valid packets where filter was detected */ + /** target_gain is a 4-bit (3.1) fixed-point value, always + * negative, but stored positive. + * The 16 possible values range from -7.5 to 0.0 dB in + * steps of 0.5, but no value below -6.0 dB should appear. */ + int gain_counts[16]; int max_gain; - /* occurences of code detect timer expiring without detecting - * a code. -1 for timer never set. */ + /** occurences of code detect timer expiring without detecting + * a code. -1 for timer never set. */ int count_sustain_expired; } hdcd_state_t; @@ -866,8 +872,8 @@ static const char * const pe_str[] = { #define HDCD_PROCESS_STEREO_DEFAULT 1 #define HDCD_MAX_CHANNELS 2 -/* convert to float from 4-bit (3.1) fixed-point - * the always-negative value is stored positive, so make it negative */ +/** convert to float from 4-bit (3.1) fixed-point + * the always-negative value is stored positive, so make it negative */ #define GAINTOFLOAT(g) (g) ? -(float)(g>>1) - ((g & 1) ? 0.5 : 0.0) : 0.0 #define HDCD_ANA_OFF 0 @@ -894,38 +900,40 @@ typedef struct HDCDContext { const AVClass *class; hdcd_state_t state[HDCD_MAX_CHANNELS]; - /* use hdcd_*_stereo() functions to process both channels together. - * -af hdcd=process_stereo=0 for off - * -af hdcd=process_stereo=1 for on - * default is HDCD_PROCESS_STEREO_DEFAULT */ + /* AVOption members */ + /** use hdcd_*_stereo() functions to process both channels together. + * -af hdcd=process_stereo=0 for off + * -af hdcd=process_stereo=1 for on + * default is HDCD_PROCESS_STEREO_DEFAULT */ int process_stereo; - /* always extend peaks above -3dBFS even if PE isn't signaled - * -af hdcd=force_pe=0 for off - * -af hdcd=force_pe=1 for on - * default is off */ + /** always extend peaks above -3dBFS even if PE isn't signaled + * -af hdcd=force_pe=0 for off + * -af hdcd=force_pe=1 for on + * default is off */ int force_pe; - /* analyze mode replaces the audio with a solid tone and adjusts - * the amplitude to signal some specific aspect of the decoding - * process. See docs or HDCD_ANA_* defines. */ + /** analyze mode replaces the audio with a solid tone and adjusts + * the amplitude to signal some specific aspect of the decoding + * process. See docs or HDCD_ANA_* defines. */ int analyze_mode; - int ana_snb; /* used in tone generation */ + int ana_snb; /**< used in tone generation */ + /* end AVOption members */ - /* config_input() and config_output() scan links for any resampling - * or format changes. If found, warnings are issued and bad_config - * is set. */ + /** config_input() and config_output() scan links for any resampling + * or format changes. If found, warnings are issued and bad_config + * is set. */ int bad_config; - AVFilterContext *fctx; /* filter context for logging errors */ - int sample_count; /* used in error logging */ - int val_target_gain; /* last matching target_gain in both channels */ + AVFilterContext *fctx; /**< filter context for logging errors */ + int sample_count; /**< used in error logging */ + int val_target_gain; /**< last matching target_gain in both channels */ /* User information/stats */ - int hdcd_detected; - int det_errors; /* detectable errors */ - hdcd_pe_t peak_extend; - int uses_transient_filter; /* detected, but not implemented */ - float max_gain_adjustment; /* in dB, expected in the range -6.0 to 0.0 */ + int hdcd_detected; /**< Valid HDCD coding was detected */ + int det_errors; /**< detectable errors */ + hdcd_pe_t peak_extend; /**< peak exted used */ + int uses_transient_filter; /**< transient filter flag detected */ + float max_gain_adjustment; /**< in dB, expected in the range -7.5 to 0.0 */ } HDCDContext; #define OFFSET(x) offsetof(HDCDContext, x) @@ -976,7 +984,7 @@ static void hdcd_reset(hdcd_state_t *state, unsigned rate) state->count_sustain_expired = -1; } -/* update the user info/counters */ +/** update the user info/counters */ static void hdcd_update_info(hdcd_state_t *state) { if (state->control & 16) state->count_peak_extend++; @@ -1242,7 +1250,7 @@ static int hdcd_scan_stereo(HDCDContext *ctx, const int32_t *samples, int max) return result; } -/* encode a value in the given sample by adjusting the amplitude */ +/** encode a value in the given sample by adjusting the amplitude */ static int32_t hdcd_analyze_gen(int32_t sample, unsigned int v, unsigned int maxv) { float sflt = sample, vv = v; @@ -1252,8 +1260,8 @@ static int32_t hdcd_analyze_gen(int32_t sample, unsigned int v, unsigned int max return (int32_t)sflt; } -/* behaves like hdcd_envelope(), but encodes processing information in - * a way that is audible (and visible in an audio editor) to aid analysis. */ +/** behaves like hdcd_envelope(), but encodes processing information in + * a way that is audible (and visible in an audio editor) to aid analysis. */ static int hdcd_analyze(int32_t *samples, int count, int stride, int gain, int target_gain, int extend, int mode, int cdt_active, int tg_mismatch) { static const int maxg = 0xf << 7; @@ -1313,6 +1321,7 @@ static int hdcd_analyze(int32_t *samples, int count, int stride, int gain, int t return gain; } +/** apply HDCD decoding parameters to a series of samples */ static int hdcd_envelope(int32_t *samples, int count, int stride, int gain, int target_gain, int extend) { int i; @@ -1372,7 +1381,7 @@ static int hdcd_envelope(int32_t *samples, int count, int stride, int gain, int return gain; } -/* extract fields from control code */ +/** extract fields from control code */ static void hdcd_control(HDCDContext *ctx, hdcd_state_t *state, int *peak_extend, int *target_gain) { *peak_extend = (ctx->force_pe || state->control & 16); @@ -1500,7 +1509,7 @@ static void hdcd_process_stereo(HDCDContext *ctx, int32_t *samples, int count) ctx->state[1].running_gain = gain[1]; } -/* tone generator: sample_number, frequency, sample_rate, amplitude */ +/** tone generator: sample_number, frequency, sample_rate, amplitude */ #define TONEGEN16(sn, f, sr, a) (int16_t)(sin((6.28318530718 * (sn) * (f)) /(sr)) * (a) * 0x7fff) static int filter_frame(AVFilterLink *inlink, AVFrame *in) -- cgit v1.2.3