view h264dspenc.c @ 12208:5d73c4b4cd37 libavcodec

Make ff_inverse stay with libavutil, and optional copy it to libavcodec. The ff_inverse table is used by FASTDIV macro, defined in libavutil, but up to now the table was defined only in libavcodec. After this change, the main copy of ff_inverse is part of libavutil (just like FASTDIV), but if CONFIG_SMALL is unset, then a different copy is made available to libavcodec, to avoid the performance penalty of using an external look up table. Dynamic linking works, because the libraries are linked with -Bsymbolic, so the local copy of the symbol has priority over the external; static linking works because the table is on a standalone object file in both libraries, so the linker is able to discard one of the two. Tested on Linux/x86-64 and Mac OS X/x86-64.
author flameeyes
date Wed, 21 Jul 2010 12:37:37 +0000
parents 7dd2a45249a9
children
line wrap: on
line source

/*
 * H.264/MPEG-4 Part 10 (Base profile) encoder.
 *
 * DSP functions
 *
 * Copyright (c) 2006 Expertisecentrum Digitale Media, UHasselt
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/**
 * @file
 * H.264 encoder related DSP utils
 *
 */

#include "dsputil.h"

#define  H264_DCT_PART1(X) \
         a = block[0][X]+block[3][X]; \
         c = block[0][X]-block[3][X]; \
         b = block[1][X]+block[2][X]; \
         d = block[1][X]-block[2][X]; \
         pieces[0][X] = a+b; \
         pieces[2][X] = a-b; \
         pieces[1][X] = (c<<1)+d; \
         pieces[3][X] = c-(d<<1);

#define  H264_DCT_PART2(X) \
         a = pieces[X][0]+pieces[X][3]; \
         c = pieces[X][0]-pieces[X][3]; \
         b = pieces[X][1]+pieces[X][2]; \
         d = pieces[X][1]-pieces[X][2]; \
         block[0][X] = a+b; \
         block[2][X] = a-b; \
         block[1][X] = (c<<1)+d; \
         block[3][X] = c-(d<<1);

/**
 * Transform the provided matrix using the H.264 modified DCT.
 * @note
 * we'll always work with transposed input blocks, to avoid having to make a
 * distinction between C and mmx implementations.
 *
 * @param block transposed input block
 */
static void h264_dct_c(DCTELEM block[4][4])
{
    DCTELEM pieces[4][4];
    DCTELEM a, b, c, d;

    H264_DCT_PART1(0);
    H264_DCT_PART1(1);
    H264_DCT_PART1(2);
    H264_DCT_PART1(3);
    H264_DCT_PART2(0);
    H264_DCT_PART2(1);
    H264_DCT_PART2(2);
    H264_DCT_PART2(3);
}

av_cold void ff_h264dspenc_init(DSPContext* c, AVCodecContext *avctx)
{
    c->h264_dct = h264_dct_c;
}