Commit 720c6b78 authored by Anton Khirnov's avatar Anton Khirnov

buffersrc: add av_buffersrc_write_frame().

It's the same as av_vsrc_buffer_add_frame(), except it doesn't take pts
or pixel_aspect parameters. Those are read from AVFrame.

Deprecate av_vsrc_buffer_add_frame().
parent 8b05e13d
...@@ -2357,8 +2357,7 @@ static int transcode_video(InputStream *ist, AVPacket *pkt, int *got_output, int ...@@ -2357,8 +2357,7 @@ static int transcode_video(InputStream *ist, AVPacket *pkt, int *got_output, int
buf->refcount++; buf->refcount++;
av_buffersrc_buffer(ist->filters[i]->filter, fb); av_buffersrc_buffer(ist->filters[i]->filter, fb);
} else } else
av_vsrc_buffer_add_frame(ist->filters[i]->filter, decoded_frame, av_buffersrc_write_frame(ist->filters[i]->filter, decoded_frame);
decoded_frame->pts, decoded_frame->sample_aspect_ratio);
} }
av_free(buffer_to_free); av_free(buffer_to_free);
......
...@@ -44,8 +44,26 @@ typedef struct { ...@@ -44,8 +44,26 @@ typedef struct {
return AVERROR(EINVAL);\ return AVERROR(EINVAL);\
} }
#if FF_API_VSRC_BUFFER_ADD_FRAME
int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame,
int64_t pts, AVRational pixel_aspect) int64_t pts, AVRational pixel_aspect)
{
int64_t orig_pts = frame->pts;
AVRational orig_sar = frame->sample_aspect_ratio;
int ret;
frame->pts = pts;
frame->sample_aspect_ratio = pixel_aspect;
if ((ret = av_buffersrc_write_frame(buffer_filter, frame)) < 0)
return ret;
frame->pts = orig_pts;
frame->sample_aspect_ratio = orig_sar;
return 0;
}
#endif
int av_buffersrc_write_frame(AVFilterContext *buffer_filter, AVFrame *frame)
{ {
BufferSourceContext *c = buffer_filter->priv; BufferSourceContext *c = buffer_filter->priv;
AVFilterBufferRef *buf; AVFilterBufferRef *buf;
...@@ -70,8 +88,6 @@ int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, ...@@ -70,8 +88,6 @@ int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame,
c->pix_fmt, c->w, c->h); c->pix_fmt, c->w, c->h);
avfilter_copy_frame_props(buf, frame); avfilter_copy_frame_props(buf, frame);
buf->pts = pts;
buf->video->pixel_aspect = pixel_aspect;
if ((ret = av_fifo_generic_write(c->fifo, &buf, sizeof(buf), NULL)) < 0) { if ((ret = av_fifo_generic_write(c->fifo, &buf, sizeof(buf), NULL)) < 0) {
avfilter_unref_buffer(buf); avfilter_unref_buffer(buf);
......
...@@ -36,4 +36,15 @@ ...@@ -36,4 +36,15 @@
*/ */
int av_buffersrc_buffer(AVFilterContext *s, AVFilterBufferRef *buf); int av_buffersrc_buffer(AVFilterContext *s, AVFilterBufferRef *buf);
/**
* Add a frame to the buffer source.
*
* @param s an instance of the buffersrc filter.
* @param frame frame to be added.
*
* @warning frame data will be memcpy()ed, which may be a big performance
* hit. Use av_buffersrc_buffer() to avoid copying the data.
*/
int av_buffersrc_write_frame(AVFilterContext *s, AVFrame *frame);
#endif /* AVFILTER_BUFFERSRC_H */ #endif /* AVFILTER_BUFFERSRC_H */
...@@ -50,5 +50,8 @@ ...@@ -50,5 +50,8 @@
#ifndef FF_API_SAMPLERATE64 #ifndef FF_API_SAMPLERATE64
#define FF_API_SAMPLERATE64 (LIBAVFILTER_VERSION_MAJOR < 3) #define FF_API_SAMPLERATE64 (LIBAVFILTER_VERSION_MAJOR < 3)
#endif #endif
#ifndef FF_API_VSRC_BUFFER_ADD_FRAME
#define FF_API_VSRC_BUFFER_ADD_FRAME (LIBAVFILTER_VERSION_MAJOR < 3)
#endif
#endif // AVFILTER_VERSION_H #endif // AVFILTER_VERSION_H
...@@ -29,7 +29,9 @@ ...@@ -29,7 +29,9 @@
#include "libavcodec/avcodec.h" /* AVFrame */ #include "libavcodec/avcodec.h" /* AVFrame */
#include "avfilter.h" #include "avfilter.h"
#if FF_API_VSRC_BUFFER_ADD_FRAME
int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame,
int64_t pts, AVRational pixel_aspect); int64_t pts, AVRational pixel_aspect);
#endif
#endif /* AVFILTER_VSRC_BUFFER_H */ #endif /* AVFILTER_VSRC_BUFFER_H */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment