<div dir="ltr"><div>Good afternoon,</div><div><br></div><div>I am trying to resize a JPEG image with libplacebo and zscale filter using ffmpeg C API but I keep getting the error in the subject of the email.</div><div><br></div><div>This is the code:</div><div><br></div><div><span style="font-family:monospace"><font size="2">#include <stdio.h><br>#include <stdlib.h><br>#include <string.h><br>#include <errno.h><br><br>#include <libavcodec/avcodec.h><br>#include <libavformat/avformat.h><br>#include <libavfilter/avfilter.h><br>#include <libavfilter/buffersrc.h><br>#include <libavfilter/buffersink.h><br>#include <libavutil/imgutils.h><br>#include <libavutil/pixfmt.h><br><br>int main(int argc, char **argv)<br>{<br>    if (argc != 4) {<br>        fprintf(stderr, "usage: %s <filename> <src_width> <src_height>\n", argv[0]);<br>        exit(EXIT_FAILURE);<br>    }<br><br>    const char *filename = argv[1];<br>    const size_t src_width = (size_t) atol(argv[2]);<br>    const size_t src_height = (size_t) atol(argv[3]);<br>    char libav_error[128] = { };<br>    int libav_ret = 0;<br><br>    AVFormatContext *fmt_ctx = avformat_alloc_context();<br>    if (fmt_ctx == NULL) {<br>        fprintf(stderr, "avformat_alloc_context(): failed\n");<br>        exit(EXIT_FAILURE); <br>    }<br><br>    if ((libav_ret = avformat_open_input(&fmt_ctx, filename, NULL, NULL)) != 0) {<br>        av_strerror(libav_ret, libav_error, sizeof(libav_error));<br>        fprintf(stderr, "avformat_open_input(): %s\n", libav_error);<br>        exit(EXIT_FAILURE);<br>    }<br><br>    AVCodecContext *dec_ctx;<br>    AVCodec *dec;<br>    <br>    libav_ret = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, &dec, 0);<br>    if (libav_ret == AVERROR_STREAM_NOT_FOUND || libav_ret == AVERROR_DECODER_NOT_FOUND) {<br>        av_strerror(libav_ret, libav_error, sizeof(libav_error));<br>        fprintf(stderr, "av_find_best_stream(): %s\n", libav_error);<br>        exit(EXIT_FAILURE);<br>    }<br><br>    dec_ctx = avcodec_alloc_context3(dec);<br>    if (dec_ctx == NULL) {<br>        fprintf(stderr, "avcodec_alloc_context3(): failed\n");<br>        exit(EXIT_FAILURE); <br>    }<br><br>    if ((libav_ret = avcodec_open2(dec_ctx, dec, NULL)) != 0) {<br>        av_strerror(libav_ret, libav_error, sizeof(libav_error));<br>        fprintf(stderr, "avcodec_open2(): %s\n", libav_error);<br>        exit(EXIT_FAILURE);<br>    }<br><br>    AVFrame *frame = av_frame_alloc();<br>    if (frame == NULL) {<br>        fprintf(stderr, "av_frame_alloc(): failed\n");<br>        exit(EXIT_FAILURE);<br>    }<br><br>    AVPacket *packet = av_packet_alloc();<br>    if (packet == NULL) {<br>        fprintf(stderr, "av_packet_alloc()");<br>        exit(EXIT_FAILURE);<br>    }<br>    <br>    if ((libav_ret = av_read_frame(fmt_ctx, packet)) != 0) {<br>        av_strerror(libav_ret, libav_error, sizeof(libav_error));<br>        fprintf(stderr, "av_read_frame(): %s\n", libav_error);<br>        exit(EXIT_FAILURE);<br>    }<br><br>    if ((libav_ret = avcodec_send_packet(dec_ctx, packet)) != 0) {<br>        av_strerror(libav_ret, libav_error, sizeof(libav_error));<br>        fprintf(stderr, "avcodec_send_packet(): %s\n", libav_error);<br>        exit(EXIT_FAILURE);<br>    }<br><br>    if ((libav_ret = avcodec_receive_frame(dec_ctx, frame)) != 0) {<br>        av_strerror(libav_ret, libav_error, sizeof(libav_error));<br>        fprintf(stderr, "avcodec_receive_frame(): %s\n", libav_error);<br>        exit(EXIT_FAILURE);<br>    }<br><br>    av_packet_unref(packet);<br><br>    AVFilterGraph *filter_graph = NULL;<br>    AVFilterContext *buffersrc_ctx = NULL;<br>    AVFilterContext *buffersink_ctx = NULL;<br><br>    filter_graph = avfilter_graph_alloc();<br>    if (filter_graph == NULL) {<br>        fprintf(stderr, "avfilter_graph_alloc(): failed\n");<br>        exit(EXIT_FAILURE);<br>    }<br><br>    const AVFilter *buffersrc_filter = avfilter_get_by_name("buffer");<br>    if (buffersrc_filter == NULL) {<br>        fprintf(stderr, "avfilter_get_by_name('buffer'): failed\n");<br>        exit(EXIT_FAILURE);<br>    }<br>    const AVFilter *buffersink_filter = avfilter_get_by_name("buffersink");<br>    if (buffersink_filter == NULL) {<br>        fprintf(stderr, "avfilter_get_by_name('buffersink'): failed\n");<br>        exit(EXIT_FAILURE);<br>    }<br><br>    char buffersrc_args[512];<br>    snprintf(buffersrc_args, sizeof(buffersrc_args), "video_size=%ldx%ld:pix_fmt=%d:time_base=1/25", src_width, src_height, AV_PIX_FMT_YUV422P);<br><br>    if ((libav_ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc_filter, "in", buffersrc_args, NULL, filter_graph)) < 0) {<br>        av_strerror(libav_ret, libav_error, sizeof(libav_error));<br>        fprintf(stderr, "avfilter_graph_create_filter(): %s\n", libav_error);<br>        exit(EXIT_FAILURE);<br>    }<br><br>    if ((libav_ret = avfilter_graph_create_filter(&buffersink_ctx, buffersink_filter, "out", NULL, NULL, filter_graph)) < 0) {<br>        av_strerror(libav_ret, libav_error, sizeof(libav_error));<br>        fprintf(stderr, "avfilter_graph_create_filter(): %s\n", libav_error);<br>        exit(EXIT_FAILURE);<br>    }<br><br>    char libplacebo_args[512];<br>    snprintf(libplacebo_args, sizeof(libplacebo_args), "format=yuv422p:colorspace=bt470bg:color_primaries=bt709:color_trc=iec61966-2-1:range=pc");<br>    AVFilterContext *libplacebo_ctx = NULL;<br>    const AVFilter *libplacebo_filter = avfilter_get_by_name("libplacebo");<br>    if (libplacebo_filter == NULL) {<br>        fprintf(stderr, "av_filter_get_by_name('libplacebo'): failed\n");<br>        exit(EXIT_FAILURE);<br>    }<br><br>    if ((libav_ret = avfilter_graph_create_filter(&libplacebo_ctx, libplacebo_filter, "libplacebo", libplacebo_args, NULL, filter_graph)) < 0) {<br>        av_strerror(libav_ret, libav_error, sizeof(libav_error));<br>        fprintf(stderr, "avfilter_graph_create_filter(): %s\n", libav_error);<br>        exit(EXIT_FAILURE);<br>    }<br><br>    char zscale_args[512];<br>    snprintf(zscale_args, sizeof(zscale_args), "w=%ld:h=%ld", (src_width / 2), (src_height / 2));<br>    AVFilterContext *zscale_ctx = NULL;<br>    const AVFilter *zscale_filter = avfilter_get_by_name("zscale");<br>    if (zscale_filter == NULL) {<br>        fprintf(stderr, "avfilter_get_by_name('zscale'): failed\n");<br>        exit(EXIT_FAILURE);<br>    }<br><br>    if ((libav_ret = avfilter_graph_create_filter(&zscale_ctx, zscale_filter, "zscale", zscale_args, NULL, filter_graph)) < 0) {<br>        av_strerror(libav_ret, libav_error, sizeof(libav_error));<br>        fprintf(stderr, "avfilter_graph_create_filter(): %s\n", libav_error);<br>        exit(EXIT_FAILURE);<br>    }<br><br>    if ((libav_ret = avfilter_link(buffersrc_ctx, 0, libplacebo_ctx, 0)) != 0) {<br>        av_strerror(libav_ret, libav_error, sizeof(libav_error));<br>        fprintf(stderr, "avfilter_link(buffersrc_ctx, 0, libplacebo_ctx, 0): %s\n", libav_error);<br>        exit(EXIT_FAILURE);<br>    }<br><br>    if ((libav_ret = avfilter_link(libplacebo_ctx, 0, zscale_ctx, 0)) != 0) {<br>        av_strerror(libav_ret, libav_error, sizeof(libav_error));<br>        fprintf(stderr, "avfilter_link(libplacebo_ctx, 0, zscale_ctx, 0): %s\n", libav_error);<br>        exit(EXIT_FAILURE);<br>    }<br><br>    if ((libav_ret = avfilter_link(zscale_ctx, 0, buffersink_ctx, 0)) != 0) {<br>        av_strerror(libav_ret, libav_error, sizeof(libav_error));<br>        fprintf(stderr, "avfilter_link(zscale_ctx, 0, buffersink_ctx, 0): %s\n", libav_error);<br>        exit(EXIT_FAILURE);<br>    }<br><br>    if ((libav_ret = avfilter_graph_config(filter_graph, NULL)) != 0) {<br>        av_strerror(libav_ret, libav_error, sizeof(libav_error));<br>        fprintf(stderr, "av_buffersrc_add_frame(): %s\n", libav_error);<br>        exit(EXIT_FAILURE);<br>    }<br><br>    if ((libav_ret = av_buffersrc_add_frame(buffersrc_ctx, frame)) != 0) {<br>        av_strerror(libav_ret, libav_error, sizeof(libav_error));<br>        fprintf(stderr, "av_buffersrc_add_frame(): %s\n", libav_error);<br>        exit(EXIT_FAILURE);<br>    }<br><br>    AVFrame *filtered_frame = av_frame_alloc();<br>    if ((libav_ret = av_buffersink_get_frame(buffersink_ctx, filtered_frame)) != 0) {<br>        av_strerror(libav_ret, libav_error, sizeof(libav_error));<br>        fprintf(stderr, "av_buffersink_get_frame(): %s\n", libav_error);<br>        exit(EXIT_FAILURE);<br>    } <br><br>    printf("w: %d, h: %d, fmt: %d\n", filtered_frame->width, filtered_frame->height, filtered_frame->format);<br><br>    int dst_size = av_image_get_buffer_size(filtered_frame->format, filtered_frame->width, filtered_frame->height, 1);<br>    uint8_t *dst_buf = av_malloc(dst_size * sizeof(uint8_t));<br>    av_image_copy_to_buffer(dst_buf, dst_size, filtered_frame->data, filtered_frame->linesize, filtered_frame->format, filtered_frame->width, filtered_frame->height, 1);<br><br>    FILE *dst_file = fopen("COPY.JPG", "wb");<br>    fwrite(dst_buf, sizeof(*dst_buf), 1, dst_file);<br>    fclose(dst_file);<br><br>    av_frame_free(&frame);<br>    av_frame_free(&filtered_frame);<br>    avfilter_graph_free(&filter_graph);<br>    avformat_close_input(&fmt_ctx);<br>    avformat_free_context(fmt_ctx);<br><br>    exit(EXIT_SUCCESS);<br>}</font></span></div><div><span style="font-family:monospace"><font size="2"><br></font></span></div><div><font size="2" style="font-family:arial,sans-serif">Thank you in advance</font></div><div><font size="2" style="font-family:arial,sans-serif"><br></font></div><div><font size="2" style="font-family:arial,sans-serif">Gianluca</font><font size="2" style="font-family:arial,sans-serif"><br></font></div><font size="2"></font></div>