[FFmpeg-devel] How to correctly use init and uninit
Ulf Zibis
Ulf.Zibis at CoSoCo.de
Fri Apr 19 14:20:08 EEST 2019
Hi,
to libavfilter/vf_fillborders.c I've added the following:
===================================================
typedef struct FillBordersContext {
[.....]
uint16_t *filler;
void (*fillborders)(struct FillBordersContext *s, AVFrame *frame);
} FillBordersContext;
// following must be moved up to compile correctly with STOP_TIMER(testcase)
#define OFFSET(x) offsetof(FillBordersContext, x)
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
static const AVOption fillborders_options[] = {
[.....]
};
AVFILTER_DEFINE_CLASS(fillborders);
[.....]
static char testcase[128];
static av_cold int init(AVFilterContext *ctx)
{
FillBordersContext *s = ctx->priv;
return 0;
}
static int config_init(AVFilterLink *inlink)
{
[.....]
int fill_sz = FFMAX3(s->left, s->right, s->top != 0 || inlink->h -
s->bottom != 0 ? inlink->w : 0);
printf("fill_sz: %d\n", fill_sz);
s->filler = av_malloc(fill_sz * sizeof(uint16_t));
/*
for (int i = 0; i < fill_sz; i++)
s->filler[i] = s->fill[p] << (s->depth - 8);
*/
sprintf(testcase, "fillborders=%d:%d:%d:%d:%s %dp-%dbit-%dx%d",
s->left, s->right, s->top, s->bottom, fillborders_options[5
+ s->mode].name,
s->nb_planes, s->depth, desc->log2_chroma_w,
desc->log2_chroma_h);
return 0;
}
static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
{
FillBordersContext *s = inlink->dst->priv;
START_TIMER
s->fillborders(s, frame);
STOP_TIMER(testcase)
return ff_filter_frame(inlink->dst->outputs[0], frame);
}
static av_cold void uninit(AVFilterContext *ctx)
{
FillBordersContext *s = ctx->priv;
av_freep(s->filler);
}
[.....]
AVFilter ff_vf_fillborders = {
[.....]
.init = init,
.uninit = uninit,
[.....]
};
===================================================
When running the filter with (1-plane 16-bit GRAY) I get "free():
invalid pointer" :
$ ./ffmpeg -y -i debug/16.jpg -vf
loop=1:1:0:start=0,fillborders=25:25:0:0:fixed:green -update 1
debug/16_fixed_25-25-0-0.jpg
ffmpeg version N-93468-g6e6f598ae2 Copyright (c) 2000-2019 the FFmpeg
developers
built with gcc 7 (Ubuntu 7.3.0-27ubuntu1~18.04)
configuration:
libavutil 56. 26.100 / 56. 26.100
libavcodec 58. 47.105 / 58. 47.105
libavformat 58. 26.101 / 58. 26.101
libavdevice 58. 7.100 / 58. 7.100
libavfilter 7. 48.100 / 7. 48.100
libswscale 5. 4.100 / 5. 4.100
libswresample 3. 4.100 / 3. 4.100
Input #0, image2, from 'debug/16.jpg':
Duration: 00:00:00.04, start: 0.000000, bitrate: 103852 kb/s
Stream #0:0: Video: mjpeg (Lossless),
gray16le(bt470bg/unknown/unknown), 640x480 [SAR 96:96 DAR 4:3],
lossless, 25 tbr, 25 tbn, 25 tbc
Stream mapping:
Stream #0:0 -> #0:0 (mjpeg (native) -> mjpeg (native))
Press [q] to stop, [?] for help
fill_sz: 640
[swscaler @ 0x55e255ec6980] deprecated pixel format used, make sure you
did set range correctly
481140 decicycles in fillborders=25:25:0:0:fixed 1p-16bit-0x0, 1
runs, 0 skips
Output #0, image2, to 'debug/16_fixed_25-25-0-0.jpg':
Metadata:
encoder : Lavf58.26.101
Stream #0:0: Video: mjpeg, yuvj444p(pc), 640x480 [SAR 1:1 DAR 4:3],
q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc
Metadata:
encoder : Lavc58.47.105 mjpeg
Side data:
cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
480645 decicycles in fillborders=25:25:0:0:fixed 1p-16bit-0x0, 2
runs, 0 skips
frame= 2 fps=0.0 q=3.9 Lsize=N/A time=00:00:00.08 bitrate=N/A
speed=1.56x
video:75kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB
muxing overhead: unknown
free(): invalid pointer
Abgebrochen (Speicherabzug geschrieben)
===================================================
When running the filter with "-v error" AND (1-plane 8-bit GRAY) I don't
get the error, but again with 16-bit, weird :
$ ./ffmpeg -y -v error -i debug/8.jpg -vf
loop=1:1:0:start=0,fillborders=25:25:0:0:fixed:green -update 1
debug/8_fixed_25-25-0-0.jpg
fill_sz: 640
227340 decicycles in fillborders=25:25:0:0:fixed 1p-8bit-0x0, 1
runs, 0 skips
226575 decicycles in fillborders=25:25:0:0:fixed 1p-8bit-0x0, 2
runs, 0 skips
$ ./ffmpeg -y -v error -i debug/16.jpg -vf
loop=1:1:0:start=0,fillborders=25:25:0:0:fixed:green -update 1
debug/16_fixed_25-25-0-0.jpg
fill_sz: 640
447750 decicycles in fillborders=25:25:0:0:fixed 1p-16bit-0x0, 1
runs, 0 skips
449775 decicycles in fillborders=25:25:0:0:fixed 1p-16bit-0x0, 2
runs, 0 skips
free(): invalid pointer
Abgebrochen (Speicherabzug geschrieben)
===================================================
The complete file is in the attachment.
Does one have any hints for me?
-Ulf
-------------- next part --------------
A non-text attachment was scrubbed...
Name: vf_fillborders.c
Type: text/x-csrc
Size: 15615 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20190419/968fc429/attachment.c>
More information about the ffmpeg-devel
mailing list