Skip to content
Snippets Groups Projects
utils.c 84.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • SwsVector *sws_getGaussianVec(double variance, double quality)
    {
    
        const int length = (int)(variance * quality + 0.5) | 1;
    
        double middle  = (length - 1) * 0.5;
    
        SwsVector *vec;
    
        if(variance < 0 || quality < 0)
            return NULL;
    
        vec = sws_allocVec(length);
    
        for (i = 0; i < length; i++) {
            double dist = i - middle;
            vec->coeff[i] = exp(-dist * dist / (2 * variance * variance)) /
                            sqrt(2 * variance * M_PI);
    
    /**
     * 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;
    
        SwsVector *vec = sws_allocVec(length);
    
        for (i = 0; i < length; i++)
            vec->coeff[i] = c;
    
    /**
     * 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);
    }
    
    
    static double sws_dcVec(SwsVector *a)
    
        for (i = 0; i < a->length; i++)
            sum += a->coeff[i];
    
    
        return sum;
    }
    
    void sws_scaleVec(SwsVector *a, double scalar)
    {
        int i;
    
    
        for (i = 0; i < a->length; i++)
            a->coeff[i] *= scalar;
    
    }
    
    void sws_normalizeVec(SwsVector *a, double height)
    {
    
        sws_scaleVec(a, height / sws_dcVec(a));
    
    static SwsVector *sws_getConvVec(SwsVector *a, SwsVector *b)
    {
    
        int length = a->length + b->length - 1;
    
        SwsVector *vec = sws_getConstVec(0.0, length);
    
        for (i = 0; i < a->length; i++) {
            for (j = 0; j < b->length; j++) {
                vec->coeff[i + j] += a->coeff[i] * b->coeff[j];
    
    
    static SwsVector *sws_sumVec(SwsVector *a, SwsVector *b)
    {
    
        int length = FFMAX(a->length, b->length);
    
        SwsVector *vec = sws_getConstVec(0.0, length);
    
        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];
    
    static SwsVector *sws_diffVec(SwsVector *a, SwsVector *b)
    {
    
        int length = FFMAX(a->length, b->length);
    
        SwsVector *vec = sws_getConstVec(0.0, length);
    
        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];
    
    
    /* shift left / or right if "shift" is negative */
    static SwsVector *sws_getShiftedVec(SwsVector *a, int shift)
    {
    
        int length = a->length + FFABS(shift) * 2;
    
        SwsVector *vec = sws_getConstVec(0.0, length);
    
        for (i = 0; i < a->length; i++) {
            vec->coeff[i + (length    - 1) / 2 -
                           (a->length - 1) / 2 - shift] = a->coeff[i];
    
    void sws_shiftVec(SwsVector *a, int shift)
    {
    
        SwsVector *shifted = sws_getShiftedVec(a, shift);
    
        a->coeff  = shifted->coeff;
        a->length = shifted->length;
    
    void sws_addVec(SwsVector *a, SwsVector *b)
    {
    
        SwsVector *sum = sws_sumVec(a, b);
    
        a->coeff  = sum->coeff;
        a->length = sum->length;
    
    void sws_subVec(SwsVector *a, SwsVector *b)
    {
    
        SwsVector *diff = sws_diffVec(a, b);
    
        a->coeff  = diff->coeff;
        a->length = diff->length;
    
        av_free(diff);
    }
    
    void sws_convVec(SwsVector *a, SwsVector *b)
    {
    
        SwsVector *conv = sws_getConvVec(a, b);
    
        a->coeff  = conv->coeff;
        a->length = conv->length;
    
        av_free(conv);
    }
    
    SwsVector *sws_cloneVec(SwsVector *a)
    {
    
        SwsVector *vec = sws_allocVec(a->length);
    
        memcpy(vec->coeff, a->coeff, a->length * sizeof(*a->coeff));
    
    /**
     * 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;
    
        double max = 0;
        double min = 0;
    
        for (i = 0; i < a->length; i++)
            if (a->coeff[i] > max)
                max = a->coeff[i];
    
        for (i = 0; i < a->length; i++)
            if (a->coeff[i] < min)
                min = a->coeff[i];
    
        range = max - min;
    
        for (i = 0; i < a->length; i++) {
            int x = (int)((a->coeff[i] - min) * 60.0 / range + 0.5);
    
            av_log(log_ctx, log_level, "%1.3f ", a->coeff[i]);
    
            for (; x > 0; x--)
                av_log(log_ctx, log_level, " ");
    
            av_log(log_ctx, log_level, "|\n");
        }
    }
    
    void sws_freeVec(SwsVector *a)
    {
    
        av_free(a);
    }
    
    void sws_freeFilter(SwsFilter *filter)
    {
    
        sws_freeVec(filter->lumH);
        sws_freeVec(filter->lumV);
        sws_freeVec(filter->chrH);
        sws_freeVec(filter->chrV);
    
        av_free(filter);
    }
    
    void sws_freeContext(SwsContext *c)
    {
        int i;
    
        for (i = 0; i < 4; i++)
            av_freep(&c->dither_error[i]);
    
    
        av_freep(&c->vLumFilter);
        av_freep(&c->vChrFilter);
        av_freep(&c->hLumFilter);
        av_freep(&c->hChrFilter);
    
        av_freep(&c->vYCoeffsBank);
        av_freep(&c->vCCoeffsBank);
    #endif
    
        av_freep(&c->vLumFilterPos);
        av_freep(&c->vChrFilterPos);
        av_freep(&c->hLumFilterPos);
        av_freep(&c->hChrFilterPos);
    
    
    #if HAVE_MMX_INLINE
    
        if (c->lumMmxextFilterCode)
            munmap(c->lumMmxextFilterCode, c->lumMmxextFilterCodeSize);
        if (c->chrMmxextFilterCode)
            munmap(c->chrMmxextFilterCode, c->chrMmxextFilterCodeSize);
    
        if (c->lumMmxextFilterCode)
            VirtualFree(c->lumMmxextFilterCode, 0, MEM_RELEASE);
        if (c->chrMmxextFilterCode)
            VirtualFree(c->chrMmxextFilterCode, 0, MEM_RELEASE);
    
        av_free(c->lumMmxextFilterCode);
        av_free(c->chrMmxextFilterCode);
    
        c->lumMmxextFilterCode = NULL;
        c->chrMmxextFilterCode = NULL;
    
    #endif /* HAVE_MMX_INLINE */
    
        av_freep(&c->formatConvBuffer);
    
        sws_freeContext(c->cascaded_context[0]);
        sws_freeContext(c->cascaded_context[1]);
    
        sws_freeContext(c->cascaded_context[2]);
    
        memset(c->cascaded_context, 0, sizeof(c->cascaded_context));
        av_freep(&c->cascaded_tmp[0]);
    
        av_freep(&c->cascaded1_tmp[0]);
    
        av_freep(&c->gamma);
        av_freep(&c->inv_gamma);
    
    
        ff_free_filters(c);
    
    struct SwsContext *sws_getCachedContext(struct SwsContext *context, int srcW,
    
                                            int srcH, enum AVPixelFormat srcFormat,
    
                                            int dstW, int dstH,
    
                                            enum AVPixelFormat dstFormat, int flags,
    
                                            SwsFilter *srcFilter,
                                            SwsFilter *dstFilter,
                                            const double *param)
    
        static const double default_param[2] = { SWS_PARAM_DEFAULT,
                                                 SWS_PARAM_DEFAULT };
    
        int64_t src_h_chr_pos = -513, dst_h_chr_pos = -513,
                src_v_chr_pos = -513, dst_v_chr_pos = -513;
    
            (context->srcW      != srcW      ||
             context->srcH      != srcH      ||
             context->srcFormat != srcFormat ||
             context->dstW      != dstW      ||
             context->dstH      != dstH      ||
             context->dstFormat != dstFormat ||
             context->flags     != flags     ||
             context->param[0]  != param[0]  ||
    
             context->param[1]  != param[1])) {
    
    
            av_opt_get_int(context, "src_h_chr_pos", 0, &src_h_chr_pos);
            av_opt_get_int(context, "src_v_chr_pos", 0, &src_v_chr_pos);
            av_opt_get_int(context, "dst_h_chr_pos", 0, &dst_h_chr_pos);
            av_opt_get_int(context, "dst_v_chr_pos", 0, &dst_v_chr_pos);
    
            sws_freeContext(context);
            context = NULL;
        }
    
            if (!(context = sws_alloc_context()))
                return NULL;
            context->srcW      = srcW;
            context->srcH      = srcH;
            context->srcFormat = srcFormat;
    
            context->dstW      = dstW;
            context->dstH      = dstH;
    
            context->dstFormat = dstFormat;
            context->flags     = flags;
            context->param[0]  = param[0];
            context->param[1]  = param[1];
    
    
            av_opt_set_int(context, "src_h_chr_pos", src_h_chr_pos, 0);
            av_opt_set_int(context, "src_v_chr_pos", src_v_chr_pos, 0);
            av_opt_set_int(context, "dst_h_chr_pos", dst_h_chr_pos, 0);
            av_opt_set_int(context, "dst_v_chr_pos", dst_v_chr_pos, 0);
    
    
            if (sws_init_context(context, srcFilter, dstFilter) < 0) {
                sws_freeContext(context);
                return NULL;
            }