diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-10-30 14:40:22 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-10-30 14:40:22 +0100 |
commit | e79c3858b35fcc77c68c33b627958e736686957e (patch) | |
tree | 5f933517c2909def4e2930a409b0a460eb4f41fd /libavfilter | |
parent | cd37963684d8ee9819af15ccebe09d84839101dd (diff) | |
parent | 14f031d7ecfabba0ef02776d4516aa3dcb7c40d8 (diff) | |
download | ffmpeg-e79c3858b35fcc77c68c33b627958e736686957e.tar.gz |
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')
-rw-r--r-- | libavfilter/af_ashowinfo.c | 141 | ||||
-rw-r--r-- | libavfilter/version.h | 2 |
2 files changed, 88 insertions, 55 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, }; diff --git a/libavfilter/version.h b/libavfilter/version.h index ff381079c5..f09b6cb0e4 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -30,7 +30,7 @@ #define LIBAVFILTER_VERSION_MAJOR 3 #define LIBAVFILTER_VERSION_MINOR 20 -#define LIBAVFILTER_VERSION_MICRO 109 +#define LIBAVFILTER_VERSION_MICRO 110 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ LIBAVFILTER_VERSION_MINOR, \ |