Also add internal function ff_null_start_frame_keep_ref().
Fix crash when a following filter (e.g. settb) will unref the reference
passed by start_frame(), and then the reference is accessed in
end_frame() through inlink->cur_buf.
*/
int ff_parse_packing_format(int *ret, const char *arg, void *log_ctx);
*/
int ff_parse_packing_format(int *ret, const char *arg, void *log_ctx);
+/**
+ * Pass video frame along and keep an internal reference for later use.
+ */
+static inline void ff_null_start_frame_keep_ref(AVFilterLink *inlink,
+ AVFilterBufferRef *picref)
+{
+ avfilter_start_frame(inlink->dst->outputs[0], avfilter_ref_buffer(picref, ~0));
+}
+
#endif /* AVFILTER_INTERNAL_H */
#endif /* AVFILTER_INTERNAL_H */
#include "libavutil/timestamp.h"
#include "avfilter.h"
#include "bbox.h"
#include "libavutil/timestamp.h"
#include "avfilter.h"
#include "bbox.h"
typedef struct {
unsigned int frame;
typedef struct {
unsigned int frame;
av_log(ctx, AV_LOG_INFO, "\n");
bbox->frame++;
av_log(ctx, AV_LOG_INFO, "\n");
bbox->frame++;
+ avfilter_unref_buffer(picref);
avfilter_end_frame(inlink->dst->outputs[0]);
}
avfilter_end_frame(inlink->dst->outputs[0]);
}
{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
.get_video_buffer = avfilter_null_get_video_buffer,
{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
.get_video_buffer = avfilter_null_get_video_buffer,
- .start_frame = avfilter_null_start_frame,
+ .start_frame = ff_null_start_frame_keep_ref,
.end_frame = end_frame,
.min_perms = AV_PERM_READ, },
{ .name = NULL }
.end_frame = end_frame,
.min_perms = AV_PERM_READ, },
{ .name = NULL }
blackdetect->frame_count++;
blackdetect->nb_black_pixels = 0;
blackdetect->frame_count++;
blackdetect->nb_black_pixels = 0;
+ avfilter_unref_buffer(picref);
avfilter_end_frame(inlink->dst->outputs[0]);
}
avfilter_end_frame(inlink->dst->outputs[0]);
}
.config_props = config_input,
.draw_slice = draw_slice,
.get_video_buffer = avfilter_null_get_video_buffer,
.config_props = config_input,
.draw_slice = draw_slice,
.get_video_buffer = avfilter_null_get_video_buffer,
- .start_frame = avfilter_null_start_frame,
+ .start_frame = ff_null_start_frame_keep_ref,
.end_frame = end_frame, },
{ .name = NULL }
},
.end_frame = end_frame, },
{ .name = NULL }
},
typedef struct {
unsigned int bamount; ///< black amount
typedef struct {
unsigned int bamount; ///< black amount
blackframe->frame++;
blackframe->nblack = 0;
blackframe->frame++;
blackframe->nblack = 0;
+ avfilter_unref_buffer(picref);
avfilter_end_frame(inlink->dst->outputs[0]);
}
avfilter_end_frame(inlink->dst->outputs[0]);
}
.type = AVMEDIA_TYPE_VIDEO,
.draw_slice = draw_slice,
.get_video_buffer = avfilter_null_get_video_buffer,
.type = AVMEDIA_TYPE_VIDEO,
.draw_slice = draw_slice,
.get_video_buffer = avfilter_null_get_video_buffer,
- .start_frame = avfilter_null_start_frame,
+ .start_frame = ff_null_start_frame_keep_ref,
.end_frame = end_frame, },
{ .name = NULL}},
.end_frame = end_frame, },
{ .name = NULL}},
#include "libavutil/pixdesc.h"
#include "libavutil/timestamp.h"
#include "avfilter.h"
#include "libavutil/pixdesc.h"
#include "libavutil/timestamp.h"
#include "avfilter.h"
typedef struct {
unsigned int frame;
typedef struct {
unsigned int frame;
av_log(ctx, AV_LOG_INFO, "]\n");
showinfo->frame++;
av_log(ctx, AV_LOG_INFO, "]\n");
showinfo->frame++;
+ avfilter_unref_buffer(picref);
avfilter_end_frame(inlink->dst->outputs[0]);
}
avfilter_end_frame(inlink->dst->outputs[0]);
}
.inputs = (const AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
.get_video_buffer = avfilter_null_get_video_buffer,
.inputs = (const AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
.get_video_buffer = avfilter_null_get_video_buffer,
- .start_frame = avfilter_null_start_frame,
+ .start_frame = ff_null_start_frame_keep_ref,
.end_frame = end_frame,
.min_perms = AV_PERM_READ, },
{ .name = NULL}},
.end_frame = end_frame,
.min_perms = AV_PERM_READ, },
{ .name = NULL}},