[Libav-user] imgutils.h decode dst buffer going from avpicture_fill to av_image_fill_arrays

ssshukla26 ssshukla26 at gmail.com
Mon Aug 22 10:55:11 EEST 2016


For software scaling the example is as follows, might help you.


int main(int argc, char **argv)
{
    const char *src_filename = NULL;
    const char *src_resolution = NULL;
    const char *src_pix_fmt_name = NULL;
    enum AVPixelFormat src_pix_fmt = AV_PIX_FMT_NONE;
    uint8_t *src_data[4];
    int src_linesize[4];
    int src_w=0, src_h=0;
    FILE *src_file;
    int src_bufsize;

    const char *dst_filename = NULL;
    const char *dst_resolution = NULL;
    const char *dst_pix_fmt_name = NULL;
    enum AVPixelFormat dst_pix_fmt = AV_PIX_FMT_NONE;
    uint8_t *dst_data[4];
    int dst_linesize[4];
    int dst_w=0, dst_h=0;
    FILE *dst_file;
    int dst_bufsize;

    struct SwsContext *sws_ctx;
    int ret;
    int frame_count = 0;
    if (argc != 7) {
        fprintf(stderr, "*Usage: %s src_file src_resolution src_pix_fmt
dst_file dst_resolution dst_pix_fmt*\n"
                "API example program to show how to scale an video/image
with libswscale.\n"
                "This program generates a series of pictures, rescales them
to the given "
                "resolution and saves them to an output file\n."
                "\n", argv[0]);
        exit(1);
    }

    src_filename = argv[1];
    src_resolution   = argv[2];
    src_pix_fmt_name = argv[3];
    dst_filename = argv[4];
    dst_resolution = argv[5];
    dst_pix_fmt_name = argv[6];

    if(AV_PIX_FMT_NONE == (src_pix_fmt = av_get_pix_fmt(src_pix_fmt_name)))
    {
        fprintf(stderr,
                "Invalid source pixel format '%s'\n",
                src_pix_fmt_name);
        exit(1);
    }

    if(AV_PIX_FMT_NONE == (dst_pix_fmt = av_get_pix_fmt(dst_pix_fmt_name)))
    {
        fprintf(stderr,
                "Invalid destination pixel format '%s'\n",
                dst_pix_fmt_name);
        exit(1);
    }

    if (av_parse_video_size(&src_w, &src_h, src_resolution) < 0) {
        fprintf(stderr,
                "Invalid source resolution '%s', must be in the form WxH or
a valid size abbreviation\n",
                src_resolution);
        exit(1);
    }

    if (av_parse_video_size(&dst_w, &dst_h, dst_resolution) < 0) {
        fprintf(stderr,
                "Invalid destination resolution '%s', must be in the form
WxH or a valid size abbreviation\n",
                dst_resolution);
        exit(1);
    }

    src_file = fopen(src_filename, "rb");    
    if (!src_file) {
        fprintf(stderr, "Could not open source file %s\n", src_filename);
        exit(1);
    }

    dst_file = fopen(dst_filename, "wb");
    if (!dst_file) {
        fprintf(stderr, "Could not open destination file %s\n",
dst_filename);
        exit(1);
    }

    /* create scaling context */
    sws_ctx = *sws_getContext*(src_w, src_h, src_pix_fmt,
                             dst_w, dst_h, dst_pix_fmt,
                             SWS_BILINEAR, NULL, NULL, NULL);
    if (!sws_ctx) {
        fprintf(stderr,
                "Impossible to create scale context for the conversion "
                "fmt:%s s:%dx%d -> fmt:%s s:%dx%d\n",
                av_get_pix_fmt_name(src_pix_fmt), src_w, src_h,
                av_get_pix_fmt_name(dst_pix_fmt), dst_w, dst_h);
        ret = AVERROR(EINVAL);
        goto end;
    }

    /* allocate source and destination image buffers */
    if ((ret = *av_image_alloc*(src_data, src_linesize,
                              src_w, src_h, src_pix_fmt, 16)) < 0) {
        fprintf(stderr, "Could not allocate source image\n");
        goto end;
    }
    src_bufsize = ret;

    /* buffer is going to be written to rawvideo file, no alignment */
    if ((ret = *av_image_alloc*(dst_data, dst_linesize,
                              dst_w, dst_h, dst_pix_fmt, 1)) < 0) {
        fprintf(stderr, "Could not allocate destination image\n");
        goto end;
    }
    dst_bufsize = ret;

    /* read image from source file */
    while(src_bufsize == fread(src_data[0], 1, src_bufsize, src_file))
    {
        /* convert to destination format */
       *sws_scale*(sws_ctx, (const uint8_t * const*)src_data,src_linesize,
0, src_h, dst_data, dst_linesize);

        /* write scaled image to file */
        fwrite(dst_data[0], 1, dst_bufsize, dst_file);

        printf("No of frames converted = %d\r",++frame_count);
        fflush(stdout);
    }

    printf("\n");

fprintf(stderr, "Scaling succeeded. Play the output file with the
command:\n"
            "ffplay -f rawvideo -pix_fmt %s -video_size %dx%d %s\n",
            av_get_pix_fmt_name(dst_pix_fmt), dst_w, dst_h, dst_filename);

end:
    fclose(src_file);
    fclose(dst_file);
    av_freep(&src_data[0]);
    av_freep(&dst_data[0]);
    sws_freeContext(sws_ctx);
    return ret;
}




--
View this message in context: http://libav-users.943685.n4.nabble.com/Libav-user-imgutils-h-decode-dst-buffer-going-from-avpicture-fill-to-av-image-fill-arrays-tp4662419p4662429.html
Sent from the libav-users mailing list archive at Nabble.com.


More information about the Libav-user mailing list