imgconvert.c

来自「从FFMPEG转换而来的H264解码程序,VC下编译..」· C语言 代码 · 共 1,011 行 · 第 1/3 页

C
1,011
字号
    },

    [PIX_FMT_BGR32_1] = {
        .name = "bgr32_1",
        .nb_channels = 4, .is_alpha = 1,
        .color_type = FF_COLOR_RGB,
        .pixel_type = FF_PIXEL_PACKED,
        .depth = 8,
        .x_chroma_shift = 0, .y_chroma_shift = 0,
    },
    [PIX_FMT_RGB32_1] = {
        .name = "rgb32_1",
        .nb_channels = 4, .is_alpha = 1,
        .color_type = FF_COLOR_RGB,
        .pixel_type = FF_PIXEL_PACKED,
        .depth = 8,
        .x_chroma_shift = 0, .y_chroma_shift = 0,
    },
};

#else
static PixFmtInfo pix_fmt_info[PIX_FMT_NB];

void avpicture_init_pixfmtinfo(void)
{
 pix_fmt_info[PIX_FMT_YUV420P].name = "yuv420p";
 pix_fmt_info[PIX_FMT_YUV420P].nb_channels = 3;
 pix_fmt_info[PIX_FMT_YUV420P].color_type = FF_COLOR_YUV;
 pix_fmt_info[PIX_FMT_YUV420P].pixel_type = FF_PIXEL_PLANAR;
 pix_fmt_info[PIX_FMT_YUV420P].depth = 8;
 pix_fmt_info[PIX_FMT_YUV420P].x_chroma_shift = 1;
 pix_fmt_info[PIX_FMT_YUV420P].y_chroma_shift = 1;

 pix_fmt_info[PIX_FMT_YUV422P].name = "yuv422p";
 pix_fmt_info[PIX_FMT_YUV422P].nb_channels = 3;
 pix_fmt_info[PIX_FMT_YUV422P].color_type = FF_COLOR_YUV;
 pix_fmt_info[PIX_FMT_YUV422P].pixel_type = FF_PIXEL_PLANAR;
 pix_fmt_info[PIX_FMT_YUV422P].depth = 8,
 pix_fmt_info[PIX_FMT_YUV422P].x_chroma_shift = 1;
 pix_fmt_info[PIX_FMT_YUV422P].y_chroma_shift = 0;

 pix_fmt_info[PIX_FMT_YUV444P].name = "yuv444p";
 pix_fmt_info[PIX_FMT_YUV444P].nb_channels = 3;
 pix_fmt_info[PIX_FMT_YUV444P].color_type = FF_COLOR_YUV;
 pix_fmt_info[PIX_FMT_YUV444P].pixel_type = FF_PIXEL_PLANAR;
 pix_fmt_info[PIX_FMT_YUV444P].depth = 8;
 pix_fmt_info[PIX_FMT_YUV444P].x_chroma_shift = 0;
 pix_fmt_info[PIX_FMT_YUV444P].y_chroma_shift = 0;

 pix_fmt_info[PIX_FMT_YUYV422].name = "yuyv422";
 pix_fmt_info[PIX_FMT_YUYV422].nb_channels = 1;
 pix_fmt_info[PIX_FMT_YUYV422].color_type = FF_COLOR_YUV;
 pix_fmt_info[PIX_FMT_YUYV422].pixel_type = FF_PIXEL_PACKED;
 pix_fmt_info[PIX_FMT_YUYV422].depth = 8;
 pix_fmt_info[PIX_FMT_YUYV422].x_chroma_shift = 1;
 pix_fmt_info[PIX_FMT_YUYV422].y_chroma_shift = 0;

 pix_fmt_info[PIX_FMT_UYVY422].name = "uyvy422";
 pix_fmt_info[PIX_FMT_UYVY422].nb_channels = 1;
 pix_fmt_info[PIX_FMT_UYVY422].color_type = FF_COLOR_YUV;
 pix_fmt_info[PIX_FMT_UYVY422].pixel_type = FF_PIXEL_PACKED;
 pix_fmt_info[PIX_FMT_UYVY422].depth = 8;
 pix_fmt_info[PIX_FMT_UYVY422].x_chroma_shift = 1;
 pix_fmt_info[PIX_FMT_UYVY422].y_chroma_shift = 0;

 pix_fmt_info[PIX_FMT_YUV410P].name = "yuv410p";
 pix_fmt_info[PIX_FMT_YUV410P].nb_channels = 3;
 pix_fmt_info[PIX_FMT_YUV410P].color_type = FF_COLOR_YUV;
 pix_fmt_info[PIX_FMT_YUV410P].pixel_type = FF_PIXEL_PLANAR;
 pix_fmt_info[PIX_FMT_YUV410P].depth = 8;
 pix_fmt_info[PIX_FMT_YUV410P].x_chroma_shift = 2;
 pix_fmt_info[PIX_FMT_YUV410P].y_chroma_shift = 2;

 pix_fmt_info[PIX_FMT_YUV411P].name = "yuv411p";
 pix_fmt_info[PIX_FMT_YUV411P].nb_channels = 3;
 pix_fmt_info[PIX_FMT_YUV411P].color_type = FF_COLOR_YUV;
 pix_fmt_info[PIX_FMT_YUV411P].pixel_type = FF_PIXEL_PLANAR;
 pix_fmt_info[PIX_FMT_YUV411P].depth = 8;
 pix_fmt_info[PIX_FMT_YUV411P].x_chroma_shift = 2;
 pix_fmt_info[PIX_FMT_YUV411P].y_chroma_shift = 0;

 /* JPEG YUV */
 pix_fmt_info[PIX_FMT_YUVJ420P].name = "yuvj420p";
 pix_fmt_info[PIX_FMT_YUVJ420P].nb_channels = 3;
 pix_fmt_info[PIX_FMT_YUVJ420P].color_type = FF_COLOR_YUV_JPEG;
 pix_fmt_info[PIX_FMT_YUVJ420P].pixel_type = FF_PIXEL_PLANAR;
 pix_fmt_info[PIX_FMT_YUVJ420P].depth = 8;
 pix_fmt_info[PIX_FMT_YUVJ420P].x_chroma_shift = 1;
 pix_fmt_info[PIX_FMT_YUVJ420P].y_chroma_shift = 1;

 pix_fmt_info[PIX_FMT_YUVJ422P].name = "yuvj422p";
 pix_fmt_info[PIX_FMT_YUVJ422P].nb_channels = 3;
 pix_fmt_info[PIX_FMT_YUVJ422P].color_type = FF_COLOR_YUV_JPEG;
 pix_fmt_info[PIX_FMT_YUVJ422P].pixel_type = FF_PIXEL_PLANAR;
 pix_fmt_info[PIX_FMT_YUVJ422P].depth = 8;
 pix_fmt_info[PIX_FMT_YUVJ422P].x_chroma_shift = 1;
 pix_fmt_info[PIX_FMT_YUVJ422P].y_chroma_shift = 0;

 pix_fmt_info[PIX_FMT_YUVJ444P].name = "yuvj444p";
 pix_fmt_info[PIX_FMT_YUVJ444P].nb_channels = 3;
 pix_fmt_info[PIX_FMT_YUVJ444P].color_type = FF_COLOR_YUV_JPEG;
 pix_fmt_info[PIX_FMT_YUVJ444P].pixel_type = FF_PIXEL_PLANAR;
 pix_fmt_info[PIX_FMT_YUVJ444P].depth = 8;
 pix_fmt_info[PIX_FMT_YUVJ444P].x_chroma_shift = 0;
 pix_fmt_info[PIX_FMT_YUVJ444P].y_chroma_shift = 0;

 /* RGB formats */
 pix_fmt_info[PIX_FMT_RGB24].name = "rgb24";
 pix_fmt_info[PIX_FMT_RGB24].nb_channels = 3;
 pix_fmt_info[PIX_FMT_RGB24].color_type = FF_COLOR_RGB;
 pix_fmt_info[PIX_FMT_RGB24].pixel_type = FF_PIXEL_PACKED;
 pix_fmt_info[PIX_FMT_RGB24].depth = 8;
 pix_fmt_info[PIX_FMT_RGB24].x_chroma_shift = 0;
 pix_fmt_info[PIX_FMT_RGB24].y_chroma_shift = 0;

 pix_fmt_info[PIX_FMT_BGR24].name = "bgr24";
 pix_fmt_info[PIX_FMT_BGR24].nb_channels = 3;
 pix_fmt_info[PIX_FMT_BGR24].color_type = FF_COLOR_RGB;
 pix_fmt_info[PIX_FMT_BGR24].pixel_type = FF_PIXEL_PACKED;
 pix_fmt_info[PIX_FMT_BGR24].depth = 8;
 pix_fmt_info[PIX_FMT_BGR24].x_chroma_shift = 0;
 pix_fmt_info[PIX_FMT_BGR24].y_chroma_shift = 0;

 pix_fmt_info[PIX_FMT_RGB32].name = "rgb32";
 pix_fmt_info[PIX_FMT_RGB32].nb_channels = 4;
 pix_fmt_info[PIX_FMT_RGB32].is_alpha = 1;
 pix_fmt_info[PIX_FMT_RGB32].color_type = FF_COLOR_RGB;
 pix_fmt_info[PIX_FMT_RGB32].pixel_type = FF_PIXEL_PACKED;
 pix_fmt_info[PIX_FMT_RGB32].depth = 8;
 pix_fmt_info[PIX_FMT_RGB32].x_chroma_shift = 0;
 pix_fmt_info[PIX_FMT_RGB32].y_chroma_shift = 0;

 pix_fmt_info[PIX_FMT_RGB565].name = "rgb565";
 pix_fmt_info[PIX_FMT_RGB565].nb_channels = 3;
 pix_fmt_info[PIX_FMT_RGB565].color_type = FF_COLOR_RGB;
 pix_fmt_info[PIX_FMT_RGB565].pixel_type = FF_PIXEL_PACKED;
 pix_fmt_info[PIX_FMT_RGB565].depth = 5;
 pix_fmt_info[PIX_FMT_RGB565].x_chroma_shift = 0;
 pix_fmt_info[PIX_FMT_RGB565].y_chroma_shift = 0;

 pix_fmt_info[PIX_FMT_RGB555].name = "rgb555";
 pix_fmt_info[PIX_FMT_RGB555].nb_channels = 3;
 pix_fmt_info[PIX_FMT_RGB555].color_type = FF_COLOR_RGB;
 pix_fmt_info[PIX_FMT_RGB555].pixel_type = FF_PIXEL_PACKED;
 pix_fmt_info[PIX_FMT_RGB555].depth = 5;
 pix_fmt_info[PIX_FMT_RGB555].x_chroma_shift = 0;
 pix_fmt_info[PIX_FMT_RGB555].y_chroma_shift = 0;

 /* gray / mono formats */
 pix_fmt_info[PIX_FMT_GRAY16BE].name = "gray16be";
 pix_fmt_info[PIX_FMT_GRAY16BE].nb_channels = 1;
 pix_fmt_info[PIX_FMT_GRAY16BE].color_type = FF_COLOR_GRAY;
 pix_fmt_info[PIX_FMT_GRAY16BE].pixel_type = FF_PIXEL_PLANAR;
 pix_fmt_info[PIX_FMT_GRAY16BE].depth = 16;

 pix_fmt_info[PIX_FMT_GRAY16LE].name = "gray16le";
 pix_fmt_info[PIX_FMT_GRAY16LE].nb_channels = 1;
 pix_fmt_info[PIX_FMT_GRAY16LE].color_type = FF_COLOR_GRAY;
 pix_fmt_info[PIX_FMT_GRAY16LE].pixel_type = FF_PIXEL_PLANAR;
 pix_fmt_info[PIX_FMT_GRAY16LE].depth = 16;

 pix_fmt_info[PIX_FMT_GRAY8].name = "gray";
 pix_fmt_info[PIX_FMT_GRAY8].nb_channels = 1;
 pix_fmt_info[PIX_FMT_GRAY8].color_type = FF_COLOR_GRAY;
 pix_fmt_info[PIX_FMT_GRAY8].pixel_type = FF_PIXEL_PLANAR;
 pix_fmt_info[PIX_FMT_GRAY8].depth = 8;

 pix_fmt_info[PIX_FMT_MONOWHITE].name = "monow";
 pix_fmt_info[PIX_FMT_MONOWHITE].nb_channels = 1;
 pix_fmt_info[PIX_FMT_MONOWHITE].color_type = FF_COLOR_GRAY;
 pix_fmt_info[PIX_FMT_MONOWHITE].pixel_type = FF_PIXEL_PLANAR;
 pix_fmt_info[PIX_FMT_MONOWHITE].depth = 1;

 pix_fmt_info[PIX_FMT_MONOBLACK].name = "monob";
 pix_fmt_info[PIX_FMT_MONOBLACK].nb_channels = 1;
 pix_fmt_info[PIX_FMT_MONOBLACK].color_type = FF_COLOR_GRAY;
 pix_fmt_info[PIX_FMT_MONOBLACK].pixel_type = FF_PIXEL_PLANAR;
 pix_fmt_info[PIX_FMT_MONOBLACK].depth = 1;

 /* paletted formats */
 pix_fmt_info[PIX_FMT_PAL8].name = "pal8";
 pix_fmt_info[PIX_FMT_PAL8].nb_channels = 4;
 pix_fmt_info[PIX_FMT_PAL8].is_alpha = 1;
 pix_fmt_info[PIX_FMT_PAL8].color_type = FF_COLOR_RGB;
 pix_fmt_info[PIX_FMT_PAL8].pixel_type = FF_PIXEL_PALETTE;
 pix_fmt_info[PIX_FMT_PAL8].depth = 8;

 pix_fmt_info[PIX_FMT_XVMC_MPEG2_MC].name = "xvmcmc";

 pix_fmt_info[PIX_FMT_XVMC_MPEG2_IDCT].name = "xvmcidct";

 pix_fmt_info[PIX_FMT_UYYVYY411].name = "uyyvyy411";
 pix_fmt_info[PIX_FMT_UYYVYY411].nb_channels = 1;
 pix_fmt_info[PIX_FMT_UYYVYY411].color_type = FF_COLOR_YUV;
 pix_fmt_info[PIX_FMT_UYYVYY411].pixel_type = FF_PIXEL_PACKED;
 pix_fmt_info[PIX_FMT_UYYVYY411].depth = 8;
 pix_fmt_info[PIX_FMT_UYYVYY411].x_chroma_shift = 2;
 pix_fmt_info[PIX_FMT_UYYVYY411].y_chroma_shift = 0;

 pix_fmt_info[PIX_FMT_BGR32].name = "bgr32";
 pix_fmt_info[PIX_FMT_BGR32].nb_channels = 4;
 pix_fmt_info[PIX_FMT_BGR32].is_alpha = 1;
 pix_fmt_info[PIX_FMT_BGR32].color_type = FF_COLOR_RGB;
 pix_fmt_info[PIX_FMT_BGR32].pixel_type = FF_PIXEL_PACKED;
 pix_fmt_info[PIX_FMT_BGR32].depth = 8;
 pix_fmt_info[PIX_FMT_BGR32].x_chroma_shift = 0;
 pix_fmt_info[PIX_FMT_BGR32].y_chroma_shift = 0;

 pix_fmt_info[PIX_FMT_BGR565].name = "bgr565";
 pix_fmt_info[PIX_FMT_BGR565].nb_channels = 3;
 pix_fmt_info[PIX_FMT_BGR565].color_type = FF_COLOR_RGB;
 pix_fmt_info[PIX_FMT_BGR565].pixel_type = FF_PIXEL_PACKED;
 pix_fmt_info[PIX_FMT_BGR565].depth = 5;
 pix_fmt_info[PIX_FMT_BGR565].x_chroma_shift = 0;
 pix_fmt_info[PIX_FMT_BGR565].y_chroma_shift = 0;

 pix_fmt_info[PIX_FMT_BGR555].name = "bgr555";
 pix_fmt_info[PIX_FMT_BGR555].nb_channels = 3;
 pix_fmt_info[PIX_FMT_BGR555].color_type = FF_COLOR_RGB;
 pix_fmt_info[PIX_FMT_BGR555].pixel_type = FF_PIXEL_PACKED;
 pix_fmt_info[PIX_FMT_BGR555].depth = 5;
 pix_fmt_info[PIX_FMT_BGR555].x_chroma_shift = 0;
 pix_fmt_info[PIX_FMT_BGR555].y_chroma_shift = 0;

 pix_fmt_info[PIX_FMT_RGB8].name = "rgb8";
 pix_fmt_info[PIX_FMT_RGB8].nb_channels = 1;
 pix_fmt_info[PIX_FMT_RGB8].color_type = FF_COLOR_RGB;
 pix_fmt_info[PIX_FMT_RGB8].pixel_type = FF_PIXEL_PACKED;
 pix_fmt_info[PIX_FMT_RGB8].depth = 8;
 pix_fmt_info[PIX_FMT_RGB8].x_chroma_shift = 0;
 pix_fmt_info[PIX_FMT_RGB8].y_chroma_shift = 0;

 pix_fmt_info[PIX_FMT_RGB4].name = "rgb4";
 pix_fmt_info[PIX_FMT_RGB4].nb_channels = 1;
 pix_fmt_info[PIX_FMT_RGB4].color_type = FF_COLOR_RGB;
 pix_fmt_info[PIX_FMT_RGB4].pixel_type = FF_PIXEL_PACKED;
 pix_fmt_info[PIX_FMT_RGB4].depth = 4;
 pix_fmt_info[PIX_FMT_RGB4].x_chroma_shift = 0;
 pix_fmt_info[PIX_FMT_RGB4].y_chroma_shift = 0;

 pix_fmt_info[PIX_FMT_RGB4_BYTE].name = "rgb4_byte";
 pix_fmt_info[PIX_FMT_RGB4_BYTE].nb_channels = 1;
 pix_fmt_info[PIX_FMT_RGB4_BYTE].color_type = FF_COLOR_RGB;
 pix_fmt_info[PIX_FMT_RGB4_BYTE].pixel_type = FF_PIXEL_PACKED;
 pix_fmt_info[PIX_FMT_RGB4_BYTE].depth = 8;
 pix_fmt_info[PIX_FMT_RGB4_BYTE].x_chroma_shift = 0;
 pix_fmt_info[PIX_FMT_RGB4_BYTE].y_chroma_shift = 0;

 pix_fmt_info[PIX_FMT_BGR8].name = "bgr8";
 pix_fmt_info[PIX_FMT_BGR8].nb_channels = 1;
 pix_fmt_info[PIX_FMT_BGR8].color_type = FF_COLOR_RGB;
 pix_fmt_info[PIX_FMT_BGR8].pixel_type = FF_PIXEL_PACKED;
 pix_fmt_info[PIX_FMT_BGR8].depth = 8;
 pix_fmt_info[PIX_FMT_BGR8].x_chroma_shift = 0;
 pix_fmt_info[PIX_FMT_BGR8].y_chroma_shift = 0;

 pix_fmt_info[PIX_FMT_BGR4].name = "bgr4";
 pix_fmt_info[PIX_FMT_BGR4].nb_channels = 1;
 pix_fmt_info[PIX_FMT_BGR4].color_type = FF_COLOR_RGB;
 pix_fmt_info[PIX_FMT_BGR4].pixel_type = FF_PIXEL_PACKED;
 pix_fmt_info[PIX_FMT_BGR4].depth = 4;
 pix_fmt_info[PIX_FMT_BGR4].x_chroma_shift = 0;
 pix_fmt_info[PIX_FMT_BGR4].y_chroma_shift = 0;

 pix_fmt_info[PIX_FMT_BGR4_BYTE].name = "bgr4_byte";
 pix_fmt_info[PIX_FMT_BGR4_BYTE].nb_channels = 1;
 pix_fmt_info[PIX_FMT_BGR4_BYTE].color_type = FF_COLOR_RGB;
 pix_fmt_info[PIX_FMT_BGR4_BYTE].pixel_type = FF_PIXEL_PACKED;
 pix_fmt_info[PIX_FMT_BGR4_BYTE].depth = 8;
 pix_fmt_info[PIX_FMT_BGR4_BYTE].x_chroma_shift = 0;
 pix_fmt_info[PIX_FMT_BGR4_BYTE].y_chroma_shift = 0;

 pix_fmt_info[PIX_FMT_NV12].name = "nv12";
 pix_fmt_info[PIX_FMT_NV12].nb_channels = 2;
 pix_fmt_info[PIX_FMT_NV12].color_type = FF_COLOR_YUV;
 pix_fmt_info[PIX_FMT_NV12].pixel_type = FF_PIXEL_PLANAR;
 pix_fmt_info[PIX_FMT_NV12].depth = 8;
 pix_fmt_info[PIX_FMT_NV12].x_chroma_shift = 1;
 pix_fmt_info[PIX_FMT_NV12].y_chroma_shift = 1;

 pix_fmt_info[PIX_FMT_NV21].name = "nv12";
 pix_fmt_info[PIX_FMT_NV21].nb_channels = 2;
 pix_fmt_info[PIX_FMT_NV21].color_type = FF_COLOR_YUV;
 pix_fmt_info[PIX_FMT_NV21].pixel_type = FF_PIXEL_PLANAR;
 pix_fmt_info[PIX_FMT_NV21].depth = 8;
 pix_fmt_info[PIX_FMT_NV21].x_chroma_shift = 1;
 pix_fmt_info[PIX_FMT_NV21].y_chroma_shift = 1;

 pix_fmt_info[PIX_FMT_BGR32_1].name = "bgr32_1";
 pix_fmt_info[PIX_FMT_BGR32_1].nb_channels = 4;
 pix_fmt_info[PIX_FMT_BGR32_1].is_alpha = 1;
 pix_fmt_info[PIX_FMT_BGR32_1].color_type = FF_COLOR_RGB;
 pix_fmt_info[PIX_FMT_BGR32_1].pixel_type = FF_PIXEL_PACKED;
 pix_fmt_info[PIX_FMT_BGR32_1].depth = 8;
 pix_fmt_info[PIX_FMT_BGR32_1].x_chroma_shift = 0;
 pix_fmt_info[PIX_FMT_BGR32_1].y_chroma_shift = 0;

 pix_fmt_info[PIX_FMT_RGB32_1].name = "rgb32_1";
 pix_fmt_info[PIX_FMT_RGB32_1].nb_channels = 4;
 pix_fmt_info[PIX_FMT_RGB32_1].is_alpha = 1;
 pix_fmt_info[PIX_FMT_RGB32_1].color_type = FF_COLOR_RGB;
 pix_fmt_info[PIX_FMT_RGB32_1].pixel_type = FF_PIXEL_PACKED;
 pix_fmt_info[PIX_FMT_RGB32_1].depth = 8;
 pix_fmt_info[PIX_FMT_RGB32_1].x_chroma_shift = 0;
 pix_fmt_info[PIX_FMT_RGB32_1].y_chroma_shift = 0;
}
#endif

void avcodec_get_chroma_sub_sample(int pix_fmt, int *h_shift, int *v_shift)
{
    *h_shift = pix_fmt_info[pix_fmt].x_chroma_shift;
    *v_shift = pix_fmt_info[pix_fmt].y_chroma_shift;
}

int avpicture_fill(AVPicture *picture, uint8_t *ptr,
                   int pix_fmt, int width, int height)
{
    int size, w2, h2, size2;
    const PixFmtInfo *pinfo;

    if(avcodec_check_dimensions(NULL, width, height))
        goto fail;

    pinfo = &pix_fmt_info[pix_fmt];
    size = width * height;
    switch(pix_fmt) {
    case PIX_FMT_YUV420P:
    case PIX_FMT_YUV422P:
    case PIX_FMT_YUV444P:
    case PIX_FMT_YUV410P:
    case PIX_FMT_YUV411P:
    case PIX_FMT_YUVJ420P:
    case PIX_FMT_YUVJ422P:
    case PIX_FMT_YUVJ444P:
        w2 = (width + (1 << pinfo->x_chroma_shift) - 1) >> pinfo->x_chroma_shift;
        h2 = (height + (1 << pinfo->y_chroma_shift) - 1) >> pinfo->y_chroma_shift;
        size2 = w2 * h2;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?