mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-02-09 14:14:39 +02:00
avfilter/showwaves: add split_channels option
This commit is contained in:
parent
ba29746feb
commit
e35fb5add4
@ -10830,6 +10830,9 @@ is not explicitly specified.
|
|||||||
Set the (approximate) output frame rate. This is done by setting the
|
Set the (approximate) output frame rate. This is done by setting the
|
||||||
option @var{n}. Default value is "25".
|
option @var{n}. Default value is "25".
|
||||||
|
|
||||||
|
@item split_channels
|
||||||
|
Set if channels should be drawn separately or overlap. Default value is 0.
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@subsection Examples
|
@subsection Examples
|
||||||
|
@ -51,6 +51,7 @@ typedef struct {
|
|||||||
int n;
|
int n;
|
||||||
int sample_count_mod;
|
int sample_count_mod;
|
||||||
enum ShowWavesMode mode;
|
enum ShowWavesMode mode;
|
||||||
|
int split_channels;
|
||||||
void (*draw_sample)(uint8_t *buf, int height, int linesize,
|
void (*draw_sample)(uint8_t *buf, int height, int linesize,
|
||||||
int16_t sample, int16_t *prev_y, int intensity);
|
int16_t sample, int16_t *prev_y, int intensity);
|
||||||
} ShowWavesContext;
|
} ShowWavesContext;
|
||||||
@ -69,6 +70,7 @@ static const AVOption showwaves_options[] = {
|
|||||||
{ "n", "set how many samples to show in the same point", OFFSET(n), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, FLAGS },
|
{ "n", "set how many samples to show in the same point", OFFSET(n), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, FLAGS },
|
||||||
{ "rate", "set video rate", OFFSET(rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, 0, FLAGS },
|
{ "rate", "set video rate", OFFSET(rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, 0, FLAGS },
|
||||||
{ "r", "set video rate", OFFSET(rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, 0, FLAGS },
|
{ "r", "set video rate", OFFSET(rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, 0, FLAGS },
|
||||||
|
{ "split_channels", "draw channels separately", OFFSET(split_channels), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, FLAGS },
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -241,7 +243,8 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples)
|
|||||||
int nb_channels = inlink->channels;
|
int nb_channels = inlink->channels;
|
||||||
int i, j, ret = 0;
|
int i, j, ret = 0;
|
||||||
const int n = showwaves->n;
|
const int n = showwaves->n;
|
||||||
const int x = 255 / (nb_channels * n); /* multiplication factor, pre-computed to avoid in-loop divisions */
|
const int x = 255 / ((showwaves->split_channels ? 1 : nb_channels) * n); /* multiplication factor, pre-computed to avoid in-loop divisions */
|
||||||
|
const int ch_height = showwaves->split_channels ? outlink->h / nb_channels : outlink->h;
|
||||||
|
|
||||||
/* draw data in the buffer */
|
/* draw data in the buffer */
|
||||||
for (i = 0; i < nb_samples; i++) {
|
for (i = 0; i < nb_samples; i++) {
|
||||||
@ -260,10 +263,13 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples)
|
|||||||
for (j = 0; j < outlink->h; j++)
|
for (j = 0; j < outlink->h; j++)
|
||||||
memset(outpicref->data[0] + j * linesize, 0, outlink->w);
|
memset(outpicref->data[0] + j * linesize, 0, outlink->w);
|
||||||
}
|
}
|
||||||
for (j = 0; j < nb_channels; j++)
|
for (j = 0; j < nb_channels; j++) {
|
||||||
showwaves->draw_sample(outpicref->data[0] + showwaves->buf_idx,
|
uint8_t *buf = outpicref->data[0] + showwaves->buf_idx;
|
||||||
outlink->h, linesize, *p++,
|
if (showwaves->split_channels)
|
||||||
|
buf += j*ch_height*linesize;
|
||||||
|
showwaves->draw_sample(buf, ch_height, linesize, *p++,
|
||||||
&showwaves->buf_idy[j], x);
|
&showwaves->buf_idy[j], x);
|
||||||
|
}
|
||||||
|
|
||||||
showwaves->sample_count_mod++;
|
showwaves->sample_count_mod++;
|
||||||
if (showwaves->sample_count_mod == n) {
|
if (showwaves->sample_count_mod == n) {
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
#define LIBAVFILTER_VERSION_MAJOR 5
|
#define LIBAVFILTER_VERSION_MAJOR 5
|
||||||
#define LIBAVFILTER_VERSION_MINOR 0
|
#define LIBAVFILTER_VERSION_MINOR 0
|
||||||
#define LIBAVFILTER_VERSION_MICRO 100
|
#define LIBAVFILTER_VERSION_MICRO 101
|
||||||
|
|
||||||
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
|
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
|
||||||
LIBAVFILTER_VERSION_MINOR, \
|
LIBAVFILTER_VERSION_MINOR, \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user