On Thu, Jan 11, 2018 at 10:11:47PM +0100, Dmytro Humeniuk wrote: [...] > +static const AVOption dumpwave_options[] = { > + { "s", "set width and height", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, {.str > = "1800x140"}, 0, 0, FLAGS }, > + { "size", "set width and height", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, > {.str = "1800x140"}, 0, 0, FLAGS }, > + { "n", "set number of samples per value per channel", > OFFSET(nb_samples), AV_OPT_TYPE_INT64, {.i64 = 128}, 1, INT64_MAX, FLAGS }, > + { "nb_samples", "set number of samples per value per channel", > OFFSET(nb_samples), AV_OPT_TYPE_INT64, {.i64 = 128}, 1, INT64_MAX, FLAGS }, > + { "f", "set json dump file", OFFSET(json_filename), AV_OPT_TYPE_STRING, > { .str = NULL }, 0, 0, FLAGS }, > + { "json", "set json dump file", OFFSET(json_filename), > AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, FLAGS }, > + { NULL } > +}; > + > +AVFILTER_DEFINE_CLASS(dumpwave); > +
> +static av_cold int init(AVFilterContext *ctx) > +{ > + DumpWaveContext *dumpwave = ctx->priv; > + > + dumpwave->sum = dumpwave->i = dumpwave->n = 0; > + > + if (!dumpwave->json_filename) { > + dumpwave->dump_fp = stdout; stdout is not safe as a output for filters and a bad default 2 filters writing to stdout would interfere it would interfere with a user application using stdout > + } else { > + dumpwave->dump_fp = fopen(dumpwave->json_filename, "w"); > + if (!dumpwave->dump_fp) { > + int err = AVERROR(errno); > + char buf[128]; > + av_strerror(err, buf, sizeof(buf)); > + av_log(ctx, AV_LOG_ERROR, "Could not open json file %s: %s\n", > + dumpwave->json_filename, buf); > + return err; > + } > + } > + return 0; > +} > + > +static av_cold void uninit(AVFilterContext *ctx) > +{ > + DumpWaveContext *dumpwave = ctx->priv; > + fclose(dumpwave->dump_fp); > + av_freep(&dumpwave->str); > + av_freep(&dumpwave->values); > +} > + > +static int query_formats(AVFilterContext *ctx) > +{ > + static const enum AVSampleFormat sample_fmts[] = { > + AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_U8P, > + AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P, > + AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32P, > + AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S64P, > + AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP, > + AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBLP, > + AV_SAMPLE_FMT_NONE > + }; > + AVFilterFormats *formats; > + AVFilterChannelLayouts *layouts; > + int ret; > + > + if (!(formats = ff_make_format_list(sample_fmts))) > + return AVERROR(ENOMEM); > + > + layouts = ff_all_channel_counts(); > + if (!layouts) > + return AVERROR(ENOMEM); > + ret = ff_set_common_channel_layouts(ctx, layouts); > + if (ret < 0) > + return ret; > + > + return ff_set_common_formats(ctx, formats); > +} > + > +static int config_output(AVFilterLink *outlink) > +{ > + AVFilterContext *ctx = outlink->src; > + DumpWaveContext *dumpwave = ctx->priv; > + const int width = dumpwave->w; > + dumpwave->values = av_realloc(NULL, width * sizeof(double)); > + dumpwave->str = av_realloc(NULL, width * sizeof(int)); > + dumpwave->max_samples = dumpwave->nb_samples * outlink->channels; > + > + return 0; > +} > + > +static int dumpwave_request_frame(AVFilterLink *outlink) > +{ > + AVFilterContext *ctx = outlink->src; > + DumpWaveContext *dumpwave = ctx->priv; > + const int width = dumpwave->w; > + const int height = dumpwave->h; > + char *p, *result = dumpwave->str; > + > + AVFilterLink *inlink = ctx->inputs[0]; > + int ret; > + > + ret = ff_request_frame(inlink); > + > + if (ret == AVERROR_EOF) { > + p = result; > + > + for(int i = 0; i < width; i++) > + p += sprintf(p, "%d,", av_clip(dumpwave->h * > dumpwave->values[i], 0, dumpwave->h)); sprintf is generally not safe as it does not check if there is enough space [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB No great genius has ever existed without some touch of madness. -- Aristotle
signature.asc
Description: PGP signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel