1
0
mirror of https://github.com/mpv-player/mpv synced 2024-12-27 09:32:40 +00:00

vf_scale: try to support all pixel formats

Until now, vf_scale only tried formats listed in the outfmt_list array.
Extend this and try every pixel format supported by mpv if trying
outfmt_list doesn't lead to success.

Also add some checks whether swscale really supports a given input or
output format. This was implicitly done with outfmt_list before.
This commit is contained in:
wm4 2013-07-18 13:16:02 +02:00
parent 02528a2933
commit a012e484dc

View File

@ -158,6 +158,14 @@ static int preferred_conversions[][2] = {
{0, 0}
};
static int check_outfmt(vf_instance_t *vf, int outfmt)
{
enum AVPixelFormat pixfmt = imgfmt2pixfmt(outfmt);
if (pixfmt == PIX_FMT_NONE || sws_isSupportedOutput(pixfmt) < 1)
return 0;
return vf_next_query_format(vf, outfmt);
}
static unsigned int find_best_out(vf_instance_t *vf, int in_format)
{
unsigned int best = 0;
@ -184,7 +192,8 @@ static unsigned int find_best_out(vf_instance_t *vf, int in_format)
format = outfmt_list[i++];
if (!format)
break;
ret = vf_next_query_format(vf, format);
ret = check_outfmt(vf, format);
mp_msg(MSGT_VFILTER, MSGL_DBG2, "scale: query(%s) -> %d\n",
vo_format_name(
@ -196,6 +205,19 @@ static unsigned int find_best_out(vf_instance_t *vf, int in_format)
if (ret & VFCAP_CSP_SUPPORTED && !best)
best = format; // best with conversion
}
if (!best) {
// Try anything else. outfmt_list is just a list of preferred formats.
for (int format = IMGFMT_START; format < IMGFMT_END; format++) {
int ret = check_outfmt(vf, format);
if (ret & VFCAP_CSP_SUPPORTED_BY_HW) {
best = format; // no conversion -> bingo!
break;
}
if (ret & VFCAP_CSP_SUPPORTED && !best)
best = format; // best with conversion
}
}
return best;
}
@ -480,6 +502,8 @@ error_out:
static int query_format(struct vf_instance *vf, unsigned int fmt)
{
if (!IMGFMT_IS_HWACCEL(fmt) && imgfmt2pixfmt(fmt) != PIX_FMT_NONE) {
if (sws_isSupportedInput(imgfmt2pixfmt(fmt)) < 1)
return 0;
unsigned int best = find_best_out(vf, fmt);
int flags;
if (!best)