Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-10-30 17:40:22 +0400
committerMichael Niedermayer <michaelni@gmx.at>2012-10-30 17:40:22 +0400
commite79c3858b35fcc77c68c33b627958e736686957e (patch)
tree5f933517c2909def4e2930a409b0a460eb4f41fd /libavfilter/af_ashowinfo.c
parentcd37963684d8ee9819af15ccebe09d84839101dd (diff)
parent14f031d7ecfabba0ef02776d4516aa3dcb7c40d8 (diff)
Merge commit '14f031d7ecfabba0ef02776d4516aa3dcb7c40d8'
* commit '14f031d7ecfabba0ef02776d4516aa3dcb7c40d8': dv: use AVStream.index instead of abusing AVStream.id lavfi: add ashowinfo filter avcodec: Add a RFC 3389 comfort noise codec lpc: Add a function for calculating reflection coefficients from samples lpc: Add a function for calculating reflection coefficients from autocorrelation coefficients lavr: document upper bound on number of output samples. lavr: add general API usage doxy indeo3: remove duplicate capabilities line. fate: ac3: Add dependencies Conflicts: Changelog doc/filters.texi libavcodec/Makefile libavcodec/allcodecs.c libavcodec/avcodec.h libavcodec/codec_desc.c libavcodec/version.h libavfilter/Makefile libavfilter/af_ashowinfo.c libavfilter/allfilters.c libavfilter/version.h libavutil/avutil.h Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavfilter/af_ashowinfo.c')
-rw-r--r--libavfilter/af_ashowinfo.c141
1 files changed, 87 insertions, 54 deletions
diff --git a/libavfilter/af_ashowinfo.c b/libavfilter/af_ashowinfo.c
index 25a5e2ca67..1a70deee28 100644
--- a/libavfilter/af_ashowinfo.c
+++ b/libavfilter/af_ashowinfo.c
@@ -23,84 +23,117 @@
* filter for showing textual audio frame information
*/
+#include <inttypes.h>
+#include <stddef.h>
+
#include "libavutil/adler32.h"
#include "libavutil/audioconvert.h"
+#include "libavutil/common.h"
+#include "libavutil/mem.h"
#include "libavutil/timestamp.h"
+#include "libavutil/samplefmt.h"
+
#include "audio.h"
#include "avfilter.h"
-typedef struct {
- unsigned int frame;
-} ShowInfoContext;
+typedef struct AShowInfoContext {
+ /**
+ * Scratch space for individual plane checksums for planar audio
+ */
+ uint32_t *plane_checksums;
+
+ /**
+ * Frame counter
+ */
+ uint64_t frame;
+} AShowInfoContext;
-static av_cold int init(AVFilterContext *ctx, const char *args)
+static int config_input(AVFilterLink *inlink)
{
- ShowInfoContext *showinfo = ctx->priv;
- showinfo->frame = 0;
+ AShowInfoContext *s = inlink->dst->priv;
+ int channels = av_get_channel_layout_nb_channels(inlink->channel_layout);
+ s->plane_checksums = av_malloc(channels * sizeof(*s->plane_checksums));
+ if (!s->plane_checksums)
+ return AVERROR(ENOMEM);
+
return 0;
}
-static int filter_samples(AVFilterLink *inlink, AVFilterBufferRef *samplesref)
+static void uninit(AVFilterContext *ctx)
+{
+ AShowInfoContext *s = ctx->priv;
+ av_freep(&s->plane_checksums);
+}
+
+static int filter_samples(AVFilterLink *inlink, AVFilterBufferRef *buf)
{
AVFilterContext *ctx = inlink->dst;
- ShowInfoContext *showinfo = ctx->priv;
- uint32_t plane_checksum[8] = {0}, checksum = 0;
+ AShowInfoContext *s = ctx->priv;
char chlayout_str[128];
- int plane;
- int linesize =
- samplesref->audio->nb_samples *
- av_get_bytes_per_sample(samplesref->format);
- if (!av_sample_fmt_is_planar(samplesref->format))
- linesize *= av_get_channel_layout_nb_channels(samplesref->audio->channel_layout);
-
- for (plane = 0; plane < 8 && samplesref->data[plane]; plane++) {
- uint8_t *data = samplesref->data[plane];
-
- plane_checksum[plane] = av_adler32_update(plane_checksum[plane],
- data, linesize);
- checksum = av_adler32_update(checksum, data, linesize);
+ uint32_t checksum = 0;
+ int channels = av_get_channel_layout_nb_channels(buf->audio->channel_layout);
+ int planar = av_sample_fmt_is_planar(buf->format);
+ int block_align = av_get_bytes_per_sample(buf->format) * (planar ? 1 : channels);
+ int data_size = buf->audio->nb_samples * block_align;
+ int planes = planar ? channels : 1;
+ int i;
+
+ for (i = 0; i < planes; i++) {
+ uint8_t *data = buf->extended_data[i];
+
+ s->plane_checksums[i] = av_adler32_update(0, data, data_size);
+ checksum = i ? av_adler32_update(checksum, data, data_size) :
+ s->plane_checksums[0];
}
av_get_channel_layout_string(chlayout_str, sizeof(chlayout_str), -1,
- samplesref->audio->channel_layout);
+ buf->audio->channel_layout);
av_log(ctx, AV_LOG_INFO,
- "n:%d pts:%s pts_time:%s pos:%"PRId64" "
- "fmt:%s chlayout:%s nb_samples:%d rate:%d "
- "checksum:%08X plane_checksum[%08X",
- showinfo->frame,
- av_ts2str(samplesref->pts), av_ts2timestr(samplesref->pts, &inlink->time_base),
- samplesref->pos,
- av_get_sample_fmt_name(samplesref->format),
- chlayout_str,
- samplesref->audio->nb_samples,
- samplesref->audio->sample_rate,
- checksum,
- plane_checksum[0]);
-
- for (plane = 1; plane < 8 && samplesref->data[plane]; plane++)
- av_log(ctx, AV_LOG_INFO, " %08X", plane_checksum[plane]);
+ "n:%"PRIu64" pts:%s pts_time:%s pos:%"PRId64" "
+ "fmt:%s chlayout:%s rate:%d nb_samples:%d "
+ "checksum:%08X ",
+ s->frame,
+ av_ts2str(buf->pts), av_ts2timestr(buf->pts, &inlink->time_base),
+ buf->pos,
+ av_get_sample_fmt_name(buf->format), chlayout_str,
+ buf->audio->sample_rate, buf->audio->nb_samples,
+ checksum);
+
+ av_log(ctx, AV_LOG_INFO, "plane_checksums: [ ");
+ for (i = 0; i < planes; i++)
+ av_log(ctx, AV_LOG_INFO, "%08X ", s->plane_checksums[i]);
av_log(ctx, AV_LOG_INFO, "]\n");
- showinfo->frame++;
- return ff_filter_samples(inlink->dst->outputs[0], samplesref);
+ s->frame++;
+ return ff_filter_samples(inlink->dst->outputs[0], buf);
}
+static const AVFilterPad inputs[] = {
+ {
+ .name = "default",
+ .type = AVMEDIA_TYPE_AUDIO,
+ .get_audio_buffer = ff_null_get_audio_buffer,
+ .config_props = config_input,
+ .filter_samples = filter_samples,
+ .min_perms = AV_PERM_READ,
+ },
+ { NULL },
+};
+
+static const AVFilterPad outputs[] = {
+ {
+ .name = "default",
+ .type = AVMEDIA_TYPE_AUDIO,
+ },
+ { NULL },
+};
+
AVFilter avfilter_af_ashowinfo = {
.name = "ashowinfo",
.description = NULL_IF_CONFIG_SMALL("Show textual information for each audio frame."),
-
- .priv_size = sizeof(ShowInfoContext),
- .init = init,
-
- .inputs = (const AVFilterPad[]) {{ .name = "default",
- .type = AVMEDIA_TYPE_AUDIO,
- .get_audio_buffer = ff_null_get_audio_buffer,
- .filter_samples = filter_samples,
- .min_perms = AV_PERM_READ, },
- { .name = NULL}},
-
- .outputs = (const AVFilterPad[]) {{ .name = "default",
- .type = AVMEDIA_TYPE_AUDIO },
- { .name = NULL}},
+ .priv_size = sizeof(AShowInfoContext),
+ .uninit = uninit,
+ .inputs = inputs,
+ .outputs = outputs,
};