FFmpeg解码32k大分辨率出现如下错误:Picture size 32768x32768 is invalid

最近找到一张32k的jpeg图片,尝试用ffmpeg来进行解码,命令如下:

bash 复制代码
ffmpeg -i enflame_32768-32768-420.jpg  32.yuv

结果出现Picture size 32768x32768 is invalid的错误:

找到报错的代码文件imgutils.c,以及函数:

c 复制代码
int av_image_check_size2(unsigned int w, unsigned int h, int64_t max_pixels, enum AVPixelFormat pix_fmt, int log_offset, void *log_ctx)
{
    ImgUtils imgutils = {
        .class      = &imgutils_class,
        .log_offset = log_offset,
        .log_ctx    = log_ctx,
    };
    int64_t stride = av_image_get_linesize(pix_fmt, w, 0);
    if (stride <= 0)
        stride = 8LL*w;
    stride += 128*8;

    if ((int)w<=0 || (int)h<=0 || stride >= INT_MAX || stride*(uint64_t)(h+128) >= INT_MAX) {
        av_log(&imgutils, AV_LOG_ERROR, "Picture size %ux%u is invalid\n", w, h);
        return AVERROR(EINVAL);
    }

    if (max_pixels < INT64_MAX) {
        if (w*(int64_t)h > max_pixels) {
            av_log(&imgutils, AV_LOG_ERROR,
                    "Picture size %ux%u exceeds specified max pixel count %"PRId64", see the documentation if you wish to increase it\n",
                    w, h, max_pixels);
            return AVERROR(EINVAL);
        }
    }


    return 0;
}

下面是gdb中的调用栈:

可以看到这一次是在avformat_find_stream_info中调用了ffmpeg默认的解码器mjpeg,但是这个解码器内部不支持导致的。

下面打印了一下栈中的参数:

可以看到,w,h都为32768,但是pixfmt为AV_PIX_FMT_NONE,如果是这样的话,stride就会要成为一个默认最大值,stride = 8LL*w;,然后会进入到下面的判断语句中,导致size invalid,那么第一个想到的是pix_fmt提前加上会不会就好了呢。

cpp 复制代码
    if ((int)w<=0 || (int)h<=0 || stride >= INT_MAX || stride*(uint64_t)(h+128) >= INT_MAX) {
        av_log(&imgutils, AV_LOG_ERROR, "Picture size %ux%u is invalid\n", w, h);
        return AVERROR(EINVAL);
    }

继续看调用代码发现这个参数是写死的,就是AV_PIX_FMT_NONE,根本无法改变。

c 复制代码
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
{
    return av_image_check_size2(w, h, INT64_MAX, AV_PIX_FMT_NONE, log_offset, log_ctx);
}

通过计算发现32k(32768)失败的原因是超过了int_max了:

最后,我们可以通过下面命令看编译器对于int的定义:

bash 复制代码
gcc -dM -E - < /dev/null|grep INT_MAX

得到下面的:

很明显,__INT_MAX__就是0x7fffffff

相关推荐
天天进步201517 小时前
Pixelle-Video 源码解析 #4:快速启动流程:uv、Streamlit、ffmpeg 分别负责什么?
ffmpeg·uv
Facechat18 小时前
Seedance 2.0 + FFmpeg:我的「一句话出片」工具是怎么做出来的
ffmpeg·seedance
HY小宝F18 小时前
从 APP 层打穿到传感器:树莓派 FFmpeg 底层学习笔记(一)V4L2/ALSA 踩坑与认知重构
笔记·学习·ffmpeg
proware3 天前
ffmpeg 初始化配置及基本概念与套路
ffmpeg·mpp·rockchip·rga
程序员老陆3 天前
FFmpeg的AVFrame全部数据操作函数详解
ffmpeg·音视频·avframe
glumes3 天前
从《牛来》到 DCP:一部电影是怎么走进电影院的?
ffmpeg·音视频开发
程序员老陆4 天前
FFmpeg RTSP 解复用器(rtsp demuxer)完全解析:从「能播」到「稳播」的参数圣经
ffmpeg·音视频·拉流·rtsp
诸葛大钢铁5 天前
视频转音频怎么转换?在线工具、VLC、FFmpeg 三种方法详解
ffmpeg·音视频·mp4转mp3·视频转音频·视频转mp3·视频提取音频
qingmiaozhuan5 天前
电脑录屏软件追剧高光截取:FFmpeg帧裁剪与可视化方案对比
ffmpeg·电脑·音视频开发·录屏技术·电脑录屏
程序员老陆6 天前
FFmpeg6操作 RTMP参数详解
ffmpeg·音视频·rtmp