0
0
mirror of https://github.com/mpv-player/mpv.git synced 2024-09-20 12:02:23 +02:00
mpv/video/fmt-conversion.c
wm4 5f999d94df video: silence warnings for missing libavutils pixel formats
Using vf_screenshot on Libav printed useless/misleading error messages
when playing 10 bit h264 with a VO that supports 8 bit yuv420p only:

    Unsupported format 444p14le
    Unsupported format 444p14be
    ...

The cause of this is that vf_scale is inserted to handle the format
conversion, and tries to find a pixel format with best quality. This
includes the 14 bit and 12 bit formats, which don't exist on Libav.
vf_screenshot tries to query whether Libav's libswscale supports it,
resulting in these error messages. (In theory, vf_scale is missing this
check, but it doesn't matter in practice.)

Since this warning is rather useless anyway, because all input video
comes from libavcodec, and only the conversion into the other could
possibly fail. Silence the warning by raising it to verbose message
level.

Closes #7.
2012-12-14 21:34:56 +01:00

160 lines
5.6 KiB
C

/*
* This file is part of MPlayer.
*
* MPlayer is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* MPlayer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with MPlayer; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "core/mp_msg.h"
#include "libavutil/avutil.h"
#include <libavutil/pixdesc.h>
#include "video/img_format.h"
#include "fmt-conversion.h"
static const struct {
int fmt;
enum PixelFormat pix_fmt;
} conversion_map[] = {
{IMGFMT_ARGB, PIX_FMT_ARGB},
{IMGFMT_BGRA, PIX_FMT_BGRA},
{IMGFMT_BGR24, PIX_FMT_BGR24},
{IMGFMT_BGR16BE, PIX_FMT_RGB565BE},
{IMGFMT_BGR16LE, PIX_FMT_RGB565LE},
{IMGFMT_BGR15BE, PIX_FMT_RGB555BE},
{IMGFMT_BGR15LE, PIX_FMT_RGB555LE},
{IMGFMT_BGR12BE, PIX_FMT_RGB444BE},
{IMGFMT_BGR12LE, PIX_FMT_RGB444LE},
{IMGFMT_BGR8, PIX_FMT_RGB8},
{IMGFMT_BGR4, PIX_FMT_RGB4},
{IMGFMT_BGR1, PIX_FMT_MONOBLACK},
{IMGFMT_RGB1, PIX_FMT_MONOBLACK},
{IMGFMT_RG4B, PIX_FMT_BGR4_BYTE},
{IMGFMT_BG4B, PIX_FMT_RGB4_BYTE},
{IMGFMT_RGB48LE, PIX_FMT_RGB48LE},
{IMGFMT_RGB48BE, PIX_FMT_RGB48BE},
{IMGFMT_ABGR, PIX_FMT_ABGR},
{IMGFMT_RGBA, PIX_FMT_RGBA},
{IMGFMT_RGB24, PIX_FMT_RGB24},
{IMGFMT_RGB16BE, PIX_FMT_BGR565BE},
{IMGFMT_RGB16LE, PIX_FMT_BGR565LE},
{IMGFMT_RGB15BE, PIX_FMT_BGR555BE},
{IMGFMT_RGB15LE, PIX_FMT_BGR555LE},
{IMGFMT_RGB12BE, PIX_FMT_BGR444BE},
{IMGFMT_RGB12LE, PIX_FMT_BGR444LE},
{IMGFMT_RGB8, PIX_FMT_BGR8},
{IMGFMT_RGB4, PIX_FMT_BGR4},
{IMGFMT_BGR8, PIX_FMT_PAL8},
{IMGFMT_GBRP, PIX_FMT_GBRP},
{IMGFMT_YUY2, PIX_FMT_YUYV422},
{IMGFMT_UYVY, PIX_FMT_UYVY422},
{IMGFMT_NV12, PIX_FMT_NV12},
{IMGFMT_NV21, PIX_FMT_NV21},
{IMGFMT_Y800, PIX_FMT_GRAY8},
{IMGFMT_Y8, PIX_FMT_GRAY8},
{IMGFMT_Y16LE, PIX_FMT_GRAY16LE},
{IMGFMT_Y16BE, PIX_FMT_GRAY16BE},
{IMGFMT_YVU9, PIX_FMT_YUV410P},
{IMGFMT_IF09, PIX_FMT_YUV410P},
{IMGFMT_YV12, PIX_FMT_YUV420P},
{IMGFMT_I420, PIX_FMT_YUV420P},
{IMGFMT_IYUV, PIX_FMT_YUV420P},
{IMGFMT_411P, PIX_FMT_YUV411P},
{IMGFMT_422P, PIX_FMT_YUV422P},
{IMGFMT_444P, PIX_FMT_YUV444P},
{IMGFMT_440P, PIX_FMT_YUV440P},
{IMGFMT_420A, PIX_FMT_YUVA420P},
{IMGFMT_420P16_LE, PIX_FMT_YUV420P16LE},
{IMGFMT_420P16_BE, PIX_FMT_YUV420P16BE},
{IMGFMT_420P9_LE, PIX_FMT_YUV420P9LE},
{IMGFMT_420P9_BE, PIX_FMT_YUV420P9BE},
{IMGFMT_420P10_LE, PIX_FMT_YUV420P10LE},
{IMGFMT_420P10_BE, PIX_FMT_YUV420P10BE},
{IMGFMT_422P10_LE, PIX_FMT_YUV422P10LE},
{IMGFMT_422P10_BE, PIX_FMT_YUV422P10BE},
{IMGFMT_444P9_BE , PIX_FMT_YUV444P9BE},
{IMGFMT_444P9_LE , PIX_FMT_YUV444P9LE},
{IMGFMT_444P10_BE, PIX_FMT_YUV444P10BE},
{IMGFMT_444P10_LE, PIX_FMT_YUV444P10LE},
{IMGFMT_422P16_LE, PIX_FMT_YUV422P16LE},
{IMGFMT_422P16_BE, PIX_FMT_YUV422P16BE},
{IMGFMT_422P9_LE, PIX_FMT_YUV422P9LE},
{IMGFMT_422P9_BE, PIX_FMT_YUV422P9BE},
{IMGFMT_444P16_LE, PIX_FMT_YUV444P16LE},
{IMGFMT_444P16_BE, PIX_FMT_YUV444P16BE},
// YUVJ are YUV formats that use the full Y range and not just
// 16 - 235 (see colorspaces.txt).
// Currently they are all treated the same way.
{IMGFMT_YV12, PIX_FMT_YUVJ420P},
{IMGFMT_422P, PIX_FMT_YUVJ422P},
{IMGFMT_444P, PIX_FMT_YUVJ444P},
{IMGFMT_440P, PIX_FMT_YUVJ440P},
// ffmpeg only
#if LIBAVUTIL_VERSION_MICRO >= 100
{IMGFMT_420P12_LE, PIX_FMT_YUV420P12LE},
{IMGFMT_420P12_BE, PIX_FMT_YUV420P12BE},
{IMGFMT_420P14_LE, PIX_FMT_YUV420P14LE},
{IMGFMT_420P14_BE, PIX_FMT_YUV420P14BE},
{IMGFMT_422P12_LE, PIX_FMT_YUV422P12LE},
{IMGFMT_422P12_BE, PIX_FMT_YUV422P12BE},
{IMGFMT_422P14_LE, PIX_FMT_YUV422P14LE},
{IMGFMT_422P14_BE, PIX_FMT_YUV422P14BE},
{IMGFMT_444P12_BE, PIX_FMT_YUV444P12BE},
{IMGFMT_444P12_LE, PIX_FMT_YUV444P12LE},
{IMGFMT_444P14_BE, PIX_FMT_YUV444P14BE},
{IMGFMT_444P14_LE, PIX_FMT_YUV444P14LE},
{IMGFMT_BGR0, PIX_FMT_BGR0},
#endif
{IMGFMT_VDPAU_MPEG1, PIX_FMT_VDPAU_MPEG1},
{IMGFMT_VDPAU_MPEG2, PIX_FMT_VDPAU_MPEG2},
{IMGFMT_VDPAU_H264, PIX_FMT_VDPAU_H264},
{IMGFMT_VDPAU_WMV3, PIX_FMT_VDPAU_WMV3},
{IMGFMT_VDPAU_VC1, PIX_FMT_VDPAU_VC1},
{IMGFMT_VDPAU_MPEG4, PIX_FMT_VDPAU_MPEG4},
{0, PIX_FMT_NONE}
};
enum PixelFormat imgfmt2pixfmt(int fmt)
{
int i;
enum PixelFormat pix_fmt;
for (i = 0; conversion_map[i].fmt; i++)
if (conversion_map[i].fmt == fmt)
break;
pix_fmt = conversion_map[i].pix_fmt;
if (pix_fmt == PIX_FMT_NONE)
mp_msg(MSGT_GLOBAL, MSGL_V, "Unsupported format %s\n", vo_format_name(fmt));
return pix_fmt;
}
int pixfmt2imgfmt(enum PixelFormat pix_fmt)
{
int i;
for (i = 0; conversion_map[i].pix_fmt != PIX_FMT_NONE; i++)
if (conversion_map[i].pix_fmt == pix_fmt)
break;
int fmt = conversion_map[i].fmt;
if (!fmt) {
const char *fmtname = av_get_pix_fmt_name(pix_fmt);
mp_msg(MSGT_GLOBAL, MSGL_ERR, "Unsupported PixelFormat %s (%d)\n",
fmtname ? fmtname : "INVALID", pix_fmt);
}
return fmt;
}