X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libswscale%2Futils.c;h=28de7b6e81f81dc6e3e895087e4d64ab610eb807;hb=b2cfd1fde7a2643be9978ec8da58c184a5d9a140;hp=b3e117f70eb1e68ee0eaac1d526a96e11f35323b;hpb=fb7d64df7e3b4894460c23ef3005030a5f86b5d1;p=ffmpeg diff --git a/libswscale/utils.c b/libswscale/utils.c index b3e117f70eb..28de7b6e81f 100644 --- a/libswscale/utils.c +++ b/libswscale/utils.c @@ -983,6 +983,7 @@ int sws_setColorspaceDetails(struct SwsContext *c, const int inv_table[4], { const AVPixFmtDescriptor *desc_dst; const AVPixFmtDescriptor *desc_src; + int need_reinit = 0; memmove(c->srcColorspaceTable, inv_table, sizeof(int) * 4); memmove(c->dstColorspaceTable, table, sizeof(int) * 4); @@ -998,9 +999,14 @@ int sws_setColorspaceDetails(struct SwsContext *c, const int inv_table[4], c->brightness = brightness; c->contrast = contrast; c->saturation = saturation; + if (c->srcRange != srcRange || c->dstRange != dstRange) + need_reinit = 1; c->srcRange = srcRange; c->dstRange = dstRange; + if (need_reinit && c->srcBpc == 8) + ff_sws_init_range_convert(c); + if ((isYUV(c->dstFormat) || isGray(c->dstFormat)) && (isYUV(c->srcFormat) || isGray(c->srcFormat))) return -1; @@ -1334,20 +1340,6 @@ av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter, FF_ALLOC_OR_GOTO(c, c->formatConvBuffer, FFALIGN(srcW*2+78, 16) * 2, fail); - /* unscaled special cases */ - if (unscaled && !usesHFilter && !usesVFilter && - (c->srcRange == c->dstRange || isAnyRGB(dstFormat))) { - ff_get_unscaled_swscale(c); - - if (c->swscale) { - if (flags & SWS_PRINT_INFO) - av_log(c, AV_LOG_INFO, - "using unscaled %s -> %s special converter\n", - av_get_pix_fmt_name(srcFormat), av_get_pix_fmt_name(dstFormat)); - return 0; - } - } - c->srcBpc = 1 + desc_src->comp[0].depth_minus1; if (c->srcBpc < 8) c->srcBpc = 8; @@ -1643,6 +1635,20 @@ av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter, c->chrXInc, c->chrYInc); } + /* unscaled special cases */ + if (unscaled && !usesHFilter && !usesVFilter && + (c->srcRange == c->dstRange || isAnyRGB(dstFormat))) { + ff_get_unscaled_swscale(c); + + if (c->swscale) { + if (flags & SWS_PRINT_INFO) + av_log(c, AV_LOG_INFO, + "using unscaled %s -> %s special converter\n", + av_get_pix_fmt_name(srcFormat), av_get_pix_fmt_name(dstFormat)); + return 0; + } + } + c->swscale = ff_getSwsFunc(c); return 0; fail: // FIXME replace things by appropriate error codes