History

lavfi/fifo: add audio version of the fifo filter.

Anton Khirnov committed 14 years ago

Commit 4a97ff21 parent 27570e23 files · +53 −20Browse files

Unified · Split

3 files
  1. libavfilter/Makefile +1 −0
  2. libavfilter/allfilters.c +1 −0
  3. libavfilter/fifo.c +51 −20
libavfilter/Makefile+1−0
@@ -25,6 +25,7 @@ OBJS = allfilters.o \ · 24 unmodified lines
2525 vf_scale.o \
2626 video.o \
2727
28+OBJS-$(CONFIG_AFIFO_FILTER) += fifo.o
2829 OBJS-$(CONFIG_AFORMAT_FILTER) += af_aformat.o
2930 OBJS-$(CONFIG_AMIX_FILTER) += af_amix.o
3031 OBJS-$(CONFIG_ANULL_FILTER) += af_anull.o
libavfilter/allfilters.c+1−0
@@ -34,6 +34,7 @@ void avfilter_register_all(void) · 33 unmodified lines
3434 return;
3535 initialized = 1;
3636
37+ REGISTER_FILTER (AFIFO, afifo, af);
3738 REGISTER_FILTER (AFORMAT, aformat, af);
3839 REGISTER_FILTER (AMIX, amix, af);
3940 REGISTER_FILTER (ANULL, anull, af);
libavfilter/fifo.c+51−20
@@ -20,21 +20,22 @@ · 19 unmodified lines
2020
2121 /**
2222 * @file
23− * FIFO buffering video filter
23+ * FIFO buffering filter
2424 */
2525
26+#include "audio.h"
2627 #include "avfilter.h"
2728 #include "internal.h"
2829 #include "video.h"
2930
30−typedef struct BufPic {
31− AVFilterBufferRef *picref;
32− struct BufPic *next;
33−} BufPic;
31+typedef struct Buf {
32+ AVFilterBufferRef *buf;
33+ struct Buf *next;
34+} Buf;
3435
3536 typedef struct {
36− BufPic root;
37− BufPic *last; ///< last buffered picture
37+ Buf root;
38+ Buf *last; ///< last buffered frame
3839 } FifoContext;
3940
4041 static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
@@ -49,22 +50,22 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque) · 8 unmodified lines
4950 static av_cold void uninit(AVFilterContext *ctx)
5051 {
5152 FifoContext *fifo = ctx->priv;
52− BufPic *pic, *tmp;
53+ Buf *buf, *tmp;
5354
54− for (pic = fifo->root.next; pic; pic = tmp) {
55− tmp = pic->next;
56− avfilter_unref_buffer(pic->picref);
57− av_free(pic);
55+ for (buf = fifo->root.next; buf; buf = tmp) {
56+ tmp = buf->next;
57+ avfilter_unref_buffer(buf->buf);
58+ av_free(buf);
5859 }
5960 }
6061
61−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
62+static void add_to_queue(AVFilterLink *inlink, AVFilterBufferRef *buf)
6263 {
6364 FifoContext *fifo = inlink->dst->priv;
6465
65− fifo->last->next = av_mallocz(sizeof(BufPic));
66+ fifo->last->next = av_mallocz(sizeof(Buf));
6667 fifo->last = fifo->last->next;
67− fifo->last->picref = picref;
68+ fifo->last->buf = buf;
6869 }
6970
7071 static void end_frame(AVFilterLink *inlink) { }
@@ -74,7 +75,7 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) { } · 3 unmodified lines
7475 static int request_frame(AVFilterLink *outlink)
7576 {
7677 FifoContext *fifo = outlink->src->priv;
77− BufPic *tmp;
78+ Buf *tmp;
7879 int ret;
7980
8081 if (!fifo->root.next) {
@@ -84,9 +85,18 @@ static int request_frame(AVFilterLink *outlink) · 3 unmodified lines
8485
8586 /* by doing this, we give ownership of the reference to the next filter,
8687 * so we don't have to worry about dereferencing it ourselves. */
87− ff_start_frame(outlink, fifo->root.next->picref);
88− ff_draw_slice (outlink, 0, outlink->h, 1);
89− ff_end_frame (outlink);
88+ switch (outlink->type) {
89+ case AVMEDIA_TYPE_VIDEO:
90+ ff_start_frame(outlink, fifo->root.next->buf);
91+ ff_draw_slice (outlink, 0, outlink->h, 1);
92+ ff_end_frame (outlink);
93+ break;
94+ case AVMEDIA_TYPE_AUDIO:
95+ ff_filter_samples(outlink, fifo->root.next->buf);
96+ break;
97+ default:
98+ return AVERROR(EINVAL);
99+ }
90100
91101 if (fifo->last == fifo->root.next)
92102 fifo->last = &fifo->root;
@@ -109,7 +119,7 @@ AVFilter avfilter_vf_fifo = { · 16 unmodified lines
109119 .inputs = (AVFilterPad[]) {{ .name = "default",
110120 .type = AVMEDIA_TYPE_VIDEO,
111121 .get_video_buffer= ff_null_get_video_buffer,
112− .start_frame = start_frame,
122+ .start_frame = add_to_queue,
113123 .draw_slice = draw_slice,
114124 .end_frame = end_frame,
115125 .rej_perms = AV_PERM_REUSE2, },
@@ -119,3 +129,24 @@ AVFilter avfilter_vf_fifo = { · 3 unmodified lines
119129 .request_frame = request_frame, },
120130 { .name = NULL}},
121131 };
132+
133+AVFilter avfilter_af_afifo = {
134+ .name = "afifo",
135+ .description = NULL_IF_CONFIG_SMALL("Buffer input frames and send them when they are requested."),
136+
137+ .init = init,
138+ .uninit = uninit,
139+
140+ .priv_size = sizeof(FifoContext),
141+
142+ .inputs = (AVFilterPad[]) {{ .name = "default",
143+ .type = AVMEDIA_TYPE_AUDIO,
144+ .get_audio_buffer = ff_null_get_audio_buffer,
145+ .filter_samples = add_to_queue,
146+ .rej_perms = AV_PERM_REUSE2, },
147+ { .name = NULL}},
148+ .outputs = (AVFilterPad[]) {{ .name = "default",
149+ .type = AVMEDIA_TYPE_AUDIO,
150+ .request_frame = request_frame, },
151+ { .name = NULL}},
152+};

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t