[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