On 4/19/19, Ulf Zibis <ulf.zi...@cosoco.de> wrote: > 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?
Use either av_freep(&s->filler) or av_free(s->filler). You do not need to use loop filter on single png. Use something like this: ffmpeg -f lavfi -i smptebars=size=hd720 -vf fillborders=... -f null - _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".