summaryrefslogtreecommitdiffstats
path: root/libavfilter/af_hdcd.c
diff options
context:
space:
mode:
authorBurt P <pburt0@gmail.com>2016-07-29 12:36:22 -0500
committerMichael Niedermayer <michael@niedermayer.cc>2016-08-01 23:57:55 +0200
commitbea17a3d57053e77a9b3f46291f9d620dd76f7a2 (patch)
treefc53dcecf202c04a1486504c78ee0458b3cbc2b1 /libavfilter/af_hdcd.c
parentd574e22659bd51cdf16723a204fef65a9e783f1d (diff)
downloadffmpeg-streaming-bea17a3d57053e77a9b3f46291f9d620dd76f7a2.zip
ffmpeg-streaming-bea17a3d57053e77a9b3f46291f9d620dd76f7a2.tar.gz
af_hdcd: Warn if there is any resampling or format conversion in the link chain
HDCD is only encoded in s16@44100Hz. Scan the chain of AVFilterLinks for any resampling or format conversion/truncation that might cause problems for the filter and issue warnings. Signed-off-by: Burt P <pburt0@gmail.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavfilter/af_hdcd.c')
-rw-r--r--libavfilter/af_hdcd.c62
1 files changed, 58 insertions, 4 deletions
diff --git a/libavfilter/af_hdcd.c b/libavfilter/af_hdcd.c
index 683c588..2ca2950 100644
--- a/libavfilter/af_hdcd.c
+++ b/libavfilter/af_hdcd.c
@@ -885,6 +885,11 @@ typedef struct HDCDContext {
* default is off */
int force_pe;
+ /* 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 */
@@ -1519,25 +1524,29 @@ static av_cold void uninit(AVFilterContext *ctx)
/* log the HDCD decode information */
if (s->hdcd_detected)
av_log(ctx, AV_LOG_INFO,
- "HDCD detected: yes, peak_extend: %s, max_gain_adj: %0.1f dB, transient_filter: %s, detectable errors: %d%s\n",
+ "HDCD detected: yes, peak_extend: %s, max_gain_adj: %0.1f dB, transient_filter: %s, detectable errors: %d%s%s\n",
pe_str[s->peak_extend],
s->max_gain_adjustment,
(s->uses_transient_filter) ? "detected" : "not detected",
- s->det_errors, (s->det_errors) ? " (try -v verbose)" : ""
+ s->det_errors, (s->det_errors) ? " (try -v verbose)" : "",
+ (s->bad_config) ? " (bad_config)" : ""
);
else
- av_log(ctx, AV_LOG_INFO, "HDCD detected: no\n");
+ av_log(ctx, AV_LOG_INFO, "HDCD detected: no%s\n",
+ (s->bad_config) ? " (bad_config)" : ""
+ );
}
+
static av_cold int init(AVFilterContext *ctx)
{
-
HDCDContext *s = ctx->priv;
int c;
s->max_gain_adjustment = 0.0;
s->sample_count = 0;
s->fctx = ctx;
+ s->bad_config = 0;
for (c = 0; c < HDCD_MAX_CHANNELS; c++) {
hdcd_reset(&s->state[c], 44100);
@@ -1551,19 +1560,64 @@ static av_cold int init(AVFilterContext *ctx)
return 0;
}
+static int config_input(AVFilterLink *inlink) {
+ AVFilterContext *ctx = inlink->dst;
+ HDCDContext *s = ctx->priv;
+ AVFilterLink *lk = inlink;
+ while(lk != NULL) {
+ AVFilterContext *nextf = lk->src;
+ if (lk->format != AV_SAMPLE_FMT_S16 || lk->sample_rate != 44100) {
+ av_log(ctx, AV_LOG_WARNING, "An input format is %s@%dHz at %s. It will truncated/resampled to s16@44100Hz.\n",
+ av_get_sample_fmt_name(lk->format), lk->sample_rate,
+ (nextf->name) ? nextf->name : "<unknown>"
+ );
+ s->bad_config = 1;
+ break;
+ }
+ lk = (nextf->inputs) ? nextf->inputs[0] : NULL;
+ }
+ /* more warning will appear after config_output() */
+ return 0;
+}
+
static const AVFilterPad avfilter_af_hdcd_inputs[] = {
{
.name = "default",
.type = AVMEDIA_TYPE_AUDIO,
.filter_frame = filter_frame,
+ .config_props = config_input,
},
{ NULL }
};
+static int config_output(AVFilterLink *outlink) {
+ static const char hdcd_baduse[] =
+ "The HDCD filter is unlikely to produce a desirable result in this context.";
+ AVFilterContext *ctx = outlink->src;
+ HDCDContext *s = ctx->priv;
+ AVFilterLink *lk = outlink;
+ while(lk != NULL) {
+ AVFilterContext *nextf = lk->dst;
+ if (lk->format == AV_SAMPLE_FMT_S16 || lk->format == AV_SAMPLE_FMT_U8) {
+ av_log(ctx, AV_LOG_WARNING, "s24 output is being truncated to %s at %s. (Try -f s24le after the filter)\n",
+ av_get_sample_fmt_name(lk->format),
+ (nextf->name) ? nextf->name : "<unknown>"
+ );
+ s->bad_config = 1;
+ break;
+ }
+ lk = (nextf->outputs) ? nextf->outputs[0] : NULL;
+ }
+ if (s->bad_config)
+ av_log(ctx, AV_LOG_WARNING, "%s\n", hdcd_baduse);
+ return 0;
+}
+
static const AVFilterPad avfilter_af_hdcd_outputs[] = {
{
.name = "default",
.type = AVMEDIA_TYPE_AUDIO,
+ .config_props = config_output,
},
{ NULL }
};
OpenPOWER on IntegriCloud