#include "libavutil/x86/asm.h"
#include "libavutil/x86/cpu.h"
-// We have to implement deprecated functions until they are removed, this is the
-// simplest way to prevent warnings
-#undef attribute_deprecated
-#define attribute_deprecated
-
#include "rgb2rgb.h"
#include "swscale.h"
#include "swscale_internal.h"
-#if !FF_API_SWS_VECTOR
static SwsVector *sws_getIdentityVec(void);
static void sws_addVec(SwsVector *a, SwsVector *b);
static void sws_shiftVec(SwsVector *a, int shift);
static void sws_printVec2(SwsVector *a, AVClass *log_ctx, int log_level);
-#endif
static void handle_formats(SwsContext *c);
av_assert0(filterSize > 0);
filter = av_malloc_array(dstW, filterSize * sizeof(*filter));
if (!filter)
- goto fail;
+ goto nomem;
if (filterSize >= MAX_FILTER_SIZE * 16 /
((flags & SWS_ACCURATE_RND) ? APCK_SIZE : 16)) {
ret = RETCODE_USE_CASCADE;
}
}
+static int range_override_needed(enum AVPixelFormat format)
+{
+ return !isYUV(format) && !isGray(format);
+}
+
int sws_setColorspaceDetails(struct SwsContext *c, const int inv_table[4],
int srcRange, const int table[4], int dstRange,
int brightness, int contrast, int saturation)
desc_dst = av_pix_fmt_desc_get(c->dstFormat);
desc_src = av_pix_fmt_desc_get(c->srcFormat);
- if(!isYUV(c->dstFormat) && !isGray(c->dstFormat))
+ if(range_override_needed(c->dstFormat))
dstRange = 0;
- if(!isYUV(c->srcFormat) && !isGray(c->srcFormat))
+ if(range_override_needed(c->srcFormat))
srcRange = 0;
if (c->srcRange != srcRange ||
*inv_table = c->srcColorspaceTable;
*table = c->dstColorspaceTable;
- *srcRange = c->srcRange;
- *dstRange = c->dstRange;
+ *srcRange = range_override_needed(c->srcFormat) ? 1 : c->srcRange;
+ *dstRange = range_override_needed(c->dstFormat) ? 1 : c->dstRange;
*brightness = c->brightness;
*contrast = c->contrast;
*saturation = c->saturation;
srcW, srcH, tmpFmt,
flags, NULL, NULL, c->param);
if (!c->cascaded_context[0]) {
- return -1;
+ return AVERROR(ENOMEM);
}
c->cascaded_context[1] = sws_getContext(srcW, srcH, tmpFmt,
flags, srcFilter, dstFilter, c->param);
if (!c->cascaded_context[1])
- return -1;
+ return AVERROR(ENOMEM);
c2 = c->cascaded_context[1];
c2->is_internal_gamma = 1;
// to properly create the gamma convert FilterDescriptor
// we have to re-initialize it
ff_free_filters(c2);
- if (ff_init_filters(c2) < 0) {
+ if ((ret = ff_init_filters(c2)) < 0) {
sws_freeContext(c2);
c->cascaded_context[1] = NULL;
- return -1;
+ return ret;
}
c->cascaded_context[2] = NULL;
dstW, dstH, dstFormat,
flags, NULL, NULL, c->param);
if (!c->cascaded_context[2])
- return -1;
+ return AVERROR(ENOMEM);
}
return 0;
}
if (isBayer(srcFormat)) {
if (!unscaled ||
- (dstFormat != AV_PIX_FMT_RGB24 && dstFormat != AV_PIX_FMT_YUV420P)) {
- enum AVPixelFormat tmpFormat = AV_PIX_FMT_RGB24;
+ (dstFormat != AV_PIX_FMT_RGB24 && dstFormat != AV_PIX_FMT_YUV420P &&
+ dstFormat != AV_PIX_FMT_RGB48)) {
+ enum AVPixelFormat tmpFormat = isBayer16BPS(srcFormat) ? AV_PIX_FMT_RGB48 : AV_PIX_FMT_RGB24;
ret = av_image_alloc(c->cascaded_tmp, c->cascaded_tmpStride,
srcW, srcH, tmpFormat, 64);
srcW, srcH, tmpFormat,
flags, srcFilter, NULL, c->param);
if (!c->cascaded_context[0])
- return -1;
+ return AVERROR(ENOMEM);
c->cascaded_context[1] = sws_getContext(srcW, srcH, tmpFormat,
dstW, dstH, dstFormat,
flags, NULL, dstFilter, c->param);
if (!c->cascaded_context[1])
- return -1;
+ return AVERROR(ENOMEM);
return 0;
}
}
if (CONFIG_SWSCALE_ALPHA && isALPHA(srcFormat) && !isALPHA(dstFormat)) {
enum AVPixelFormat tmpFormat = alphaless_fmt(srcFormat);
- if (tmpFormat != AV_PIX_FMT_NONE && c->alphablend != SWS_ALPHA_BLEND_NONE)
- if (!unscaled ||
- dstFormat != tmpFormat ||
- usesHFilter || usesVFilter ||
- c->srcRange != c->dstRange
- ) {
- c->cascaded_mainindex = 1;
- ret = av_image_alloc(c->cascaded_tmp, c->cascaded_tmpStride,
- srcW, srcH, tmpFormat, 64);
- if (ret < 0)
- return ret;
-
- c->cascaded_context[0] = sws_alloc_set_opts(srcW, srcH, srcFormat,
- srcW, srcH, tmpFormat,
- flags, c->param);
- if (!c->cascaded_context[0])
- return -1;
- c->cascaded_context[0]->alphablend = c->alphablend;
- ret = sws_init_context(c->cascaded_context[0], NULL , NULL);
- if (ret < 0)
- return ret;
-
- c->cascaded_context[1] = sws_alloc_set_opts(srcW, srcH, tmpFormat,
- dstW, dstH, dstFormat,
- flags, c->param);
- if (!c->cascaded_context[1])
- return -1;
-
- c->cascaded_context[1]->srcRange = c->srcRange;
- c->cascaded_context[1]->dstRange = c->dstRange;
- ret = sws_init_context(c->cascaded_context[1], srcFilter , dstFilter);
- if (ret < 0)
- return ret;
-
- return 0;
+ if (tmpFormat != AV_PIX_FMT_NONE && c->alphablend != SWS_ALPHA_BLEND_NONE) {
+ if (!unscaled ||
+ dstFormat != tmpFormat ||
+ usesHFilter || usesVFilter ||
+ c->srcRange != c->dstRange
+ ) {
+ c->cascaded_mainindex = 1;
+ ret = av_image_alloc(c->cascaded_tmp, c->cascaded_tmpStride,
+ srcW, srcH, tmpFormat, 64);
+ if (ret < 0)
+ return ret;
+
+ c->cascaded_context[0] = sws_alloc_set_opts(srcW, srcH, srcFormat,
+ srcW, srcH, tmpFormat,
+ flags, c->param);
+ if (!c->cascaded_context[0])
+ return AVERROR(EINVAL);
+ c->cascaded_context[0]->alphablend = c->alphablend;
+ ret = sws_init_context(c->cascaded_context[0], NULL , NULL);
+ if (ret < 0)
+ return ret;
+
+ c->cascaded_context[1] = sws_alloc_set_opts(srcW, srcH, tmpFormat,
+ dstW, dstH, dstFormat,
+ flags, c->param);
+ if (!c->cascaded_context[1])
+ return AVERROR(EINVAL);
+
+ c->cascaded_context[1]->srcRange = c->srcRange;
+ c->cascaded_context[1]->dstRange = c->dstRange;
+ ret = sws_init_context(c->cascaded_context[1], srcFilter , dstFilter);
+ if (ret < 0)
+ return ret;
+
+ return 0;
+ }
}
}
if ( mprotect(c->lumMmxextFilterCode, c->lumMmxextFilterCodeSize, PROT_EXEC | PROT_READ) == -1
|| mprotect(c->chrMmxextFilterCode, c->chrMmxextFilterCodeSize, PROT_EXEC | PROT_READ) == -1) {
av_log(c, AV_LOG_ERROR, "mprotect failed, cannot use fast bilinear scaler\n");
+ ret = AVERROR(EINVAL);
goto fail;
}
#endif
tmpW, tmpH, tmpFormat,
flags, srcFilter, NULL, c->param);
if (!c->cascaded_context[0])
- return -1;
+ return AVERROR(ENOMEM);
c->cascaded_context[1] = sws_getContext(tmpW, tmpH, tmpFormat,
dstW, dstH, dstFormat,
flags, NULL, dstFilter, c->param);
if (!c->cascaded_context[1])
- return -1;
+ return AVERROR(ENOMEM);
return 0;
}
- return -1;
+ return ret;
}
SwsContext *sws_alloc_set_opts(int srcW, int srcH, enum AVPixelFormat srcFormat,
* Allocate and return a vector with length coefficients, all
* with the same value c.
*/
-#if !FF_API_SWS_VECTOR
static
-#endif
SwsVector *sws_getConstVec(double c, int length)
{
int i;
* Allocate and return a vector with just one coefficient, with
* value 1.0.
*/
-#if !FF_API_SWS_VECTOR
static
-#endif
SwsVector *sws_getIdentityVec(void)
{
return sws_getConstVec(1.0, 1);
sws_scaleVec(a, height / sws_dcVec(a));
}
-#if FF_API_SWS_VECTOR
-static SwsVector *sws_getConvVec(SwsVector *a, SwsVector *b)
-{
- int length = a->length + b->length - 1;
- int i, j;
- SwsVector *vec = sws_getConstVec(0.0, length);
-
- if (!vec)
- return NULL;
-
- for (i = 0; i < a->length; i++) {
- for (j = 0; j < b->length; j++) {
- vec->coeff[i + j] += a->coeff[i] * b->coeff[j];
- }
- }
-
- return vec;
-}
-#endif
-
static SwsVector *sws_sumVec(SwsVector *a, SwsVector *b)
{
int length = FFMAX(a->length, b->length);
return vec;
}
-#if FF_API_SWS_VECTOR
-static SwsVector *sws_diffVec(SwsVector *a, SwsVector *b)
-{
- int length = FFMAX(a->length, b->length);
- int i;
- SwsVector *vec = sws_getConstVec(0.0, length);
-
- if (!vec)
- return NULL;
-
- for (i = 0; i < a->length; i++)
- vec->coeff[i + (length - 1) / 2 - (a->length - 1) / 2] += a->coeff[i];
- for (i = 0; i < b->length; i++)
- vec->coeff[i + (length - 1) / 2 - (b->length - 1) / 2] -= b->coeff[i];
-
- return vec;
-}
-#endif
-
/* shift left / or right if "shift" is negative */
static SwsVector *sws_getShiftedVec(SwsVector *a, int shift)
{
return vec;
}
-#if !FF_API_SWS_VECTOR
static
-#endif
void sws_shiftVec(SwsVector *a, int shift)
{
SwsVector *shifted = sws_getShiftedVec(a, shift);
av_free(shifted);
}
-#if !FF_API_SWS_VECTOR
static
-#endif
void sws_addVec(SwsVector *a, SwsVector *b)
{
SwsVector *sum = sws_sumVec(a, b);
av_free(sum);
}
-#if FF_API_SWS_VECTOR
-void sws_subVec(SwsVector *a, SwsVector *b)
-{
- SwsVector *diff = sws_diffVec(a, b);
- if (!diff) {
- makenan_vec(a);
- return;
- }
- av_free(a->coeff);
- a->coeff = diff->coeff;
- a->length = diff->length;
- av_free(diff);
-}
-
-void sws_convVec(SwsVector *a, SwsVector *b)
-{
- SwsVector *conv = sws_getConvVec(a, b);
- if (!conv) {
- makenan_vec(a);
- return;
- }
- av_free(a->coeff);
- a->coeff = conv->coeff;
- a->length = conv->length;
- av_free(conv);
-}
-
-SwsVector *sws_cloneVec(SwsVector *a)
-{
- SwsVector *vec = sws_allocVec(a->length);
-
- if (!vec)
- return NULL;
-
- memcpy(vec->coeff, a->coeff, a->length * sizeof(*a->coeff));
-
- return vec;
-}
-#endif
-
/**
* Print with av_log() a textual representation of the vector a
* if log_level <= av_log_level.
*/
-#if !FF_API_SWS_VECTOR
static
-#endif
void sws_printVec2(SwsVector *a, AVClass *log_ctx, int log_level)
{
int i;