⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fftsg.cpp

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻 CPP
📖 第 1 页 / 共 5 页
字号:

        static void rdft(int n, int isgn, REAL *a, int *ip, REAL *w)
        {
                int nw, nc;
                REAL xi;

                nw = ip[0];
                if (n > (nw << 2)) {
                        nw = n >> 2;
                        makewt(nw, ip, w);
                }
                nc = ip[1];
                if (n > (nc << 2)) {
                        nc = n >> 2;
                        makect(nc, ip, w + nw);
                }
                if (isgn >= 0) {
                        if (n > 4) {
                                cftfsub(n, a, ip + 2, nw, w);
                                rftfsub(n, a, nc, w + nw);
                        } else if (n == 4) {
                                cftfsub(n, a, ip + 2, nw, w);
                        }
                        xi = a[0] - a[1];
                        a[0] += a[1];
                        a[1] = xi;
                } else {
                        a[1] = 0.5f * (a[0] - a[1]);
                        a[0] -= a[1];
                        if (n > 4) {
                                rftbsub(n, a, nc, w + nw);
                                cftbsub(n, a, ip + 2, nw, w);
                        } else if (n == 4) {
                                cftbsub(n, a, ip + 2, nw, w);
                        }
                }
        }


        static void ddct(int n, int isgn, REAL *a, int *ip, REAL *w)
        {
                int j, nw, nc;
                REAL xr;

                nw = ip[0];
                if (n > (nw << 2)) {
                        nw = n >> 2;
                        makewt(nw, ip, w);
                }
                nc = ip[1];
                if (n > nc) {
                        nc = n;
                        makect(nc, ip, w + nw);
                }
                if (isgn < 0) {
                        xr = a[n - 1];
                        for (j = n - 2; j >= 2; j -= 2) {
                                a[j + 1] = a[j] - a[j - 1];
                                a[j] += a[j - 1];
                        }
                        a[1] = a[0] - xr;
                        a[0] += xr;
                        if (n > 4) {
                                rftbsub(n, a, nc, w + nw);
                                cftbsub(n, a, ip + 2, nw, w);
                        } else if (n == 4) {
                                cftbsub(n, a, ip + 2, nw, w);
                        }
                }
                dctsub(n, a, nc, w + nw);
                if (isgn >= 0) {
                        if (n > 4) {
                                cftfsub(n, a, ip + 2, nw, w);
                                rftfsub(n, a, nc, w + nw);
                        } else if (n == 4) {
                                cftfsub(n, a, ip + 2, nw, w);
                        }
                        xr = a[0] - a[1];
                        a[0] += a[1];
                        for (j = 2; j < n; j += 2) {
                                a[j - 1] = a[j] - a[j + 1];
                                a[j] += a[j + 1];
                        }
                        a[n - 1] = xr;
                }
        }


        static void ddst(int n, int isgn, REAL *a, int *ip, REAL *w)
        {
                int j, nw, nc;
                REAL xr;

                nw = ip[0];
                if (n > (nw << 2)) {
                        nw = n >> 2;
                        makewt(nw, ip, w);
                }
                nc = ip[1];
                if (n > nc) {
                        nc = n;
                        makect(nc, ip, w + nw);
                }
                if (isgn < 0) {
                        xr = a[n - 1];
                        for (j = n - 2; j >= 2; j -= 2) {
                                a[j + 1] = -a[j] - a[j - 1];
                                a[j] -= a[j - 1];
                        }
                        a[1] = a[0] + xr;
                        a[0] -= xr;
                        if (n > 4) {
                                rftbsub(n, a, nc, w + nw);
                                cftbsub(n, a, ip + 2, nw, w);
                        } else if (n == 4) {
                                cftbsub(n, a, ip + 2, nw, w);
                        }
                }
                dstsub(n, a, nc, w + nw);
                if (isgn >= 0) {
                        if (n > 4) {
                                cftfsub(n, a, ip + 2, nw, w);
                                rftfsub(n, a, nc, w + nw);
                        } else if (n == 4) {
                                cftfsub(n, a, ip + 2, nw, w);
                        }
                        xr = a[0] - a[1];
                        a[0] += a[1];
                        for (j = 2; j < n; j += 2) {
                                a[j - 1] = -a[j] - a[j + 1];
                                a[j] -= a[j + 1];
                        }
                        a[n - 1] = -xr;
                }
        }


        static void dfct(int n, REAL *a, REAL *t, int *ip, REAL *w)
        {
                int j, k, l, m, mh, nw, nc;
                REAL xr, xi, yr, yi;

                nw = ip[0];
                if (n > (nw << 3)) {
                        nw = n >> 3;
                        makewt(nw, ip, w);
                }
                nc = ip[1];
                if (n > (nc << 1)) {
                        nc = n >> 1;
                        makect(nc, ip, w + nw);
                }
                m = n >> 1;
                yi = a[m];
                xi = a[0] + a[n];
                a[0] -= a[n];
                t[0] = xi - yi;
                t[m] = xi + yi;
                if (n > 2) {
                        mh = m >> 1;
                        for (j = 1; j < mh; j++) {
                                k = m - j;
                                xr = a[j] - a[n - j];
                                xi = a[j] + a[n - j];
                                yr = a[k] - a[n - k];
                                yi = a[k] + a[n - k];
                                a[j] = xr;
                                a[k] = yr;
                                t[j] = xi - yi;
                                t[k] = xi + yi;
                        }
                        t[mh] = a[mh] + a[n - mh];
                        a[mh] -= a[n - mh];
                        dctsub(m, a, nc, w + nw);
                        if (m > 4) {
                                cftfsub(m, a, ip + 2, nw, w);
                                rftfsub(m, a, nc, w + nw);
                        } else if (m == 4) {
                                cftfsub(m, a, ip + 2, nw, w);
                        }
                        a[n - 1] = a[0] - a[1];
                        a[1] = a[0] + a[1];
                        for (j = m - 2; j >= 2; j -= 2) {
                                a[2 * j + 1] = a[j] + a[j + 1];
                                a[2 * j - 1] = a[j] - a[j + 1];
                        }
                        l = 2;
                        m = mh;
                        while (m >= 2) {
                                dctsub(m, t, nc, w + nw);
                                if (m > 4) {
                                        cftfsub(m, t, ip + 2, nw, w);
                                        rftfsub(m, t, nc, w + nw);
                                } else if (m == 4) {
                                        cftfsub(m, t, ip + 2, nw, w);
                                }
                                a[n - l] = t[0] - t[1];
                                a[l] = t[0] + t[1];
                                k = 0;
                                for (j = 2; j < m; j += 2) {
                                        k += l << 2;
                                        a[k - l] = t[j] - t[j + 1];
                                        a[k + l] = t[j] + t[j + 1];
                                }
                                l <<= 1;
                                mh = m >> 1;
                                for (j = 0; j < mh; j++) {
                                        k = m - j;
                                        t[j] = t[m + k] - t[m + j];
                                        t[k] = t[m + k] + t[m + j];
                                }
                                t[mh] = t[m + mh];
                                m = mh;
                        }
                        a[l] = t[0];
                        a[n] = t[2] - t[1];
                        a[0] = t[2] + t[1];
                } else {
                        a[1] = a[0];
                        a[2] = t[0];
                        a[0] = t[1];
                }
        }


        static void dfst(int n, REAL *a, REAL *t, int *ip, REAL *w)
        {
                int j, k, l, m, mh, nw, nc;
                REAL xr, xi, yr, yi;

                nw = ip[0];
                if (n > (nw << 3)) {
                        nw = n >> 3;
                        makewt(nw, ip, w);
                }
                nc = ip[1];
                if (n > (nc << 1)) {
                        nc = n >> 1;
                        makect(nc, ip, w + nw);
                }
                if (n > 2) {
                        m = n >> 1;
                        mh = m >> 1;
                        for (j = 1; j < mh; j++) {
                                k = m - j;
                                xr = a[j] + a[n - j];
                                xi = a[j] - a[n - j];
                                yr = a[k] + a[n - k];
                                yi = a[k] - a[n - k];
                                a[j] = xr;
                                a[k] = yr;
                                t[j] = xi + yi;
                                t[k] = xi - yi;
                        }
                        t[0] = a[mh] - a[n - mh];
                        a[mh] += a[n - mh];
                        a[0] = a[m];
                        dstsub(m, a, nc, w + nw);
                        if (m > 4) {
                                cftfsub(m, a, ip + 2, nw, w);
                                rftfsub(m, a, nc, w + nw);
                        } else if (m == 4) {
                                cftfsub(m, a, ip + 2, nw, w);
                        }
                        a[n - 1] = a[1] - a[0];
                        a[1] = a[0] + a[1];
                        for (j = m - 2; j >= 2; j -= 2) {
                                a[2 * j + 1] = a[j] - a[j + 1];
                                a[2 * j - 1] = -a[j] - a[j + 1];
                        }
                        l = 2;
                        m = mh;
                        while (m >= 2) {
                                dstsub(m, t, nc, w + nw);
                                if (m > 4) {
                                        cftfsub(m, t, ip + 2, nw, w);
                                        rftfsub(m, t, nc, w + nw);
                                } else if (m == 4) {
                                        cftfsub(m, t, ip + 2, nw, w);
                                }
                                a[n - l] = t[1] - t[0];
                                a[l] = t[0] + t[1];
                                k = 0;
                                for (j = 2; j < m; j += 2) {
                                        k += l << 2;
                                        a[k - l] = -t[j] - t[j + 1];
                                        a[k + l] = t[j] - t[j + 1];
                                }
                                l <<= 1;
                                mh = m >> 1;
                                for (j = 1; j < mh; j++) {
                                        k = m - j;
                                        t[j] = t[m + k] + t[m + j];
                                        t[k] = t[m + k] - t[m + j];
                                }
                                t[0] = t[m + mh];
                                m = mh;
                        }
                        a[l] = t[0];
                }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -