X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fmpegvideo_xvmc.c;h=b7de79c5832475b1328b50c336d986688d07d768;hb=49623f531972be5dc2dd8c1b4b8748cad7c424ff;hp=df81e5da6836a41e6970e3357f8096ace606f2a0;hpb=04a5c106f902ee04a02109e1e7f6b1fa7794eb4e;p=ffmpeg diff --git a/libavcodec/mpegvideo_xvmc.c b/libavcodec/mpegvideo_xvmc.c index df81e5da683..b7de79c5832 100644 --- a/libavcodec/mpegvideo_xvmc.c +++ b/libavcodec/mpegvideo_xvmc.c @@ -2,20 +2,20 @@ * XVideo Motion Compensation * Copyright (c) 2003 Ivan Kalvachev * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav 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, + * Libav 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 + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -23,7 +23,7 @@ #include #include "avcodec.h" -#include "dsputil.h" +#include "mpegutils.h" #include "mpegvideo.h" #undef NDEBUG @@ -31,9 +31,12 @@ #include "xvmc.h" #include "xvmc_internal.h" +#include "version.h" + +#if FF_API_XVMC /** - * Initializes the block field of the MpegEncContext pointer passed as + * Initialize the block field of the MpegEncContext pointer passed as * parameter after making sure that the data is not corrupted. * In order to implement something like direct rendering instead of decoding * coefficients in s->blocks and then copying them, copy them directly @@ -41,14 +44,14 @@ */ void ff_xvmc_init_block(MpegEncContext *s) { - struct xvmc_pix_fmt *render = (struct xvmc_pix_fmt*)s->current_picture.data[2]; + struct xvmc_pix_fmt *render = (struct xvmc_pix_fmt*)s->current_picture.f->data[2]; assert(render && render->xvmc_id == AV_XVMC_ID); - s->block = (DCTELEM (*)[64])(render->data_blocks + render->next_free_data_block_num * 64); + s->block = (int16_t (*)[64])(render->data_blocks + render->next_free_data_block_num * 64); } /** - * Fills individual block pointers, so there are no gaps in the data_block array + * Fill individual block pointers, so there are no gaps in the data_block array * in case not all blocks in the macroblock are coded. */ void ff_xvmc_pack_pblocks(MpegEncContext *s, int cbp) @@ -67,13 +70,13 @@ void ff_xvmc_pack_pblocks(MpegEncContext *s, int cbp) } /** - * Finds and stores the surfaces that are used as reference frames. + * Find and store the surfaces that are used as reference frames. * This function should be called for every new field and/or frame. * It should be safe to call the function a few times for the same field. */ int ff_xvmc_field_start(MpegEncContext *s, AVCodecContext *avctx) { - struct xvmc_pix_fmt *last, *next, *render = (struct xvmc_pix_fmt*)s->current_picture.data[2]; + struct xvmc_pix_fmt *last, *next, *render = (struct xvmc_pix_fmt*)s->current_picture.f->data[2]; const int mb_block_count = 4 + (1 << s->chroma_format); assert(avctx); @@ -110,18 +113,18 @@ int ff_xvmc_field_start(MpegEncContext *s, AVCodecContext *avctx) render->p_past_surface = NULL; switch(s->pict_type) { - case FF_I_TYPE: + case AV_PICTURE_TYPE_I: return 0; // no prediction from other frames - case FF_B_TYPE: - next = (struct xvmc_pix_fmt*)s->next_picture.data[2]; + case AV_PICTURE_TYPE_B: + next = (struct xvmc_pix_fmt*)s->next_picture.f->data[2]; if (!next) return -1; if (next->xvmc_id != AV_XVMC_ID) return -1; render->p_future_surface = next->p_surface; // no return here, going to set forward prediction - case FF_P_TYPE: - last = (struct xvmc_pix_fmt*)s->last_picture.data[2]; + case AV_PICTURE_TYPE_P: + last = (struct xvmc_pix_fmt*)s->last_picture.f->data[2]; if (!last) last = render; // predict second field from the first if (last->xvmc_id != AV_XVMC_ID) @@ -134,23 +137,23 @@ return -1; } /** - * Completes frame/field rendering by passing any remaining blocks. + * Complete frame/field rendering by passing any remaining blocks. * Normally ff_draw_horiz_band() is called for each slice, however, * some leftover blocks, for example from error_resilience(), may remain. * It should be safe to call the function a few times for the same field. */ void ff_xvmc_field_end(MpegEncContext *s) { - struct xvmc_pix_fmt *render = (struct xvmc_pix_fmt*)s->current_picture.data[2]; + struct xvmc_pix_fmt *render = (struct xvmc_pix_fmt*)s->current_picture.f->data[2]; assert(render); if (render->filled_mv_blocks_num > 0) - ff_draw_horiz_band(s, 0, 0); + ff_mpeg_draw_horiz_band(s, 0, 0); } /** - * Synthesizes the data needed by XvMC to render one macroblock of data. - * Fills all relevant fields, if necessary do IDCT. + * Synthesize the data needed by XvMC to render one macroblock of data. + * Fill all relevant fields, if necessary do IDCT. */ void ff_xvmc_decode_mb(MpegEncContext *s) { @@ -166,7 +169,7 @@ void ff_xvmc_decode_mb(MpegEncContext *s) return; } - // from MPV_decode_mb(), update DC predictors for P macroblocks + // from ff_mpv_decode_mb(), update DC predictors for P macroblocks if (!s->mb_intra) { s->last_dc[0] = s->last_dc[1] = @@ -182,7 +185,7 @@ void ff_xvmc_decode_mb(MpegEncContext *s) s->current_picture.qscale_table[mb_xy] = s->qscale; // start of XVMC-specific code - render = (struct xvmc_pix_fmt*)s->current_picture.data[2]; + render = (struct xvmc_pix_fmt*)s->current_picture.f->data[2]; assert(render); assert(render->xvmc_id == AV_XVMC_ID); assert(render->mv_blocks); @@ -282,7 +285,7 @@ void ff_xvmc_decode_mb(MpegEncContext *s) cbp++; } - if (s->flags & CODEC_FLAG_GRAY) { + if (s->avctx->flags & AV_CODEC_FLAG_GRAY) { if (s->mb_intra) { // intra frames are always full chroma blocks for (i = 4; i < blocks_per_mb; i++) { memset(s->pblocks[i], 0, sizeof(*s->pblocks[i])); // so we need to clear them @@ -301,10 +304,10 @@ void ff_xvmc_decode_mb(MpegEncContext *s) for (i = 0; i < blocks_per_mb; i++) { if (s->block_last_index[i] >= 0) { // I do not have unsigned_intra MOCO to test, hope it is OK. - if (s->mb_intra && (render->idct || (!render->idct && !render->unsigned_intra))) + if (s->mb_intra && (render->idct || !render->unsigned_intra)) *s->pblocks[i][0] -= 1 << 10; if (!render->idct) { - s->dsp.idct(*s->pblocks[i]); + s->idsp.idct(*s->pblocks[i]); /* It is unclear if MC hardware requires pixel diff values to be * in the range [-255;255]. TODO: Clipping if such hardware is * ever found. As of now it would only be an unnecessary @@ -328,5 +331,7 @@ void ff_xvmc_decode_mb(MpegEncContext *s) if (render->filled_mv_blocks_num == render->allocated_mv_blocks) - ff_draw_horiz_band(s, 0, 0); + ff_mpeg_draw_horiz_band(s, 0, 0); } + +#endif /* FF_API_XVMC */