* [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC hwaccel code
@ 2022-02-01 10:02 Anton Khirnov
2022-02-01 10:02 ` [FFmpeg-devel] [PATCH 2/4] lavc/xvmc.h: mark the header as deprecated Anton Khirnov
` (4 more replies)
0 siblings, 5 replies; 15+ messages in thread
From: Anton Khirnov @ 2022-02-01 10:02 UTC (permalink / raw)
To: ffmpeg-devel
XvMC was last relevant over 10 years ago, if ever. There is no reason to
use it today.
---
MAINTAINERS | 1 -
configure | 9 -
libavcodec/Makefile | 2 -
libavcodec/avcodec.h | 12 --
libavcodec/error_resilience.c | 9 -
libavcodec/hwaccels.h | 2 -
libavcodec/hwconfig.h | 2 -
libavcodec/mpeg12dec.c | 43 ----
libavcodec/mpegvideo.c | 6 -
libavcodec/mpegvideo.h | 2 -
libavcodec/mpegvideo_xvmc.c | 376 ---------------------------------
libavcodec/x86/blockdsp_init.c | 4 -
libavcodec/xvmc_internal.h | 31 ---
13 files changed, 499 deletions(-)
delete mode 100644 libavcodec/mpegvideo_xvmc.c
delete mode 100644 libavcodec/xvmc_internal.h
diff --git a/MAINTAINERS b/MAINTAINERS
index c065e94498..f33ccbd1d9 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -266,7 +266,6 @@ Codecs:
xan.c Mike Melanson
xbm* Paul B Mahol
xface Stefano Sabatini
- xvmc.c Ivan Kalvachev
xwd* Paul B Mahol
Hardware acceleration:
diff --git a/configure b/configure
index 5b19a35f59..6dbe108284 100755
--- a/configure
+++ b/configure
@@ -1900,7 +1900,6 @@ HWACCEL_AUTODETECT_LIBRARY_LIST="
videotoolbox
vulkan
v4l2_m2m
- xvmc
"
# catchall list of things that require external libs to link
@@ -3006,7 +3005,6 @@ vaapi_x11_deps="xlib_x11"
videotoolbox_hwaccel_deps="videotoolbox pthreads"
videotoolbox_hwaccel_extralibs="-framework QuartzCore"
vulkan_deps_any="libdl LoadLibrary"
-xvmc_deps="X11_extensions_XvMClib_h"
av1_d3d11va_hwaccel_deps="d3d11va DXVA_PicParams_AV1"
av1_d3d11va_hwaccel_select="av1_decoder"
@@ -3054,16 +3052,12 @@ mjpeg_nvdec_hwaccel_deps="nvdec"
mjpeg_nvdec_hwaccel_select="mjpeg_decoder"
mjpeg_vaapi_hwaccel_deps="vaapi"
mjpeg_vaapi_hwaccel_select="mjpeg_decoder"
-mpeg_xvmc_hwaccel_deps="xvmc"
-mpeg_xvmc_hwaccel_select="mpeg2video_decoder"
mpeg1_nvdec_hwaccel_deps="nvdec"
mpeg1_nvdec_hwaccel_select="mpeg1video_decoder"
mpeg1_vdpau_hwaccel_deps="vdpau"
mpeg1_vdpau_hwaccel_select="mpeg1video_decoder"
mpeg1_videotoolbox_hwaccel_deps="videotoolbox"
mpeg1_videotoolbox_hwaccel_select="mpeg1video_decoder"
-mpeg1_xvmc_hwaccel_deps="xvmc"
-mpeg1_xvmc_hwaccel_select="mpeg1video_decoder"
mpeg2_d3d11va_hwaccel_deps="d3d11va"
mpeg2_d3d11va_hwaccel_select="mpeg2video_decoder"
mpeg2_d3d11va2_hwaccel_deps="d3d11va"
@@ -3078,8 +3072,6 @@ mpeg2_vdpau_hwaccel_deps="vdpau"
mpeg2_vdpau_hwaccel_select="mpeg2video_decoder"
mpeg2_videotoolbox_hwaccel_deps="videotoolbox"
mpeg2_videotoolbox_hwaccel_select="mpeg2video_decoder"
-mpeg2_xvmc_hwaccel_deps="xvmc"
-mpeg2_xvmc_hwaccel_select="mpeg2video_decoder"
mpeg4_nvdec_hwaccel_deps="nvdec"
mpeg4_nvdec_hwaccel_select="mpeg4_decoder"
mpeg4_vaapi_hwaccel_deps="vaapi"
@@ -6320,7 +6312,6 @@ check_headers unistd.h
check_headers valgrind/valgrind.h
check_func_headers VideoToolbox/VTCompressionSession.h VTCompressionSessionPrepareToEncodeFrames -framework VideoToolbox
check_headers windows.h
-check_headers X11/extensions/XvMClib.h
check_headers asm/types.h
# it seems there are versions of clang in some distros that try to use the
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index cfc70a3eaf..6076b4ad80 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -963,7 +963,6 @@ OBJS-$(CONFIG_MJPEG_VAAPI_HWACCEL) += vaapi_mjpeg.o
OBJS-$(CONFIG_MPEG1_NVDEC_HWACCEL) += nvdec_mpeg12.o
OBJS-$(CONFIG_MPEG1_VDPAU_HWACCEL) += vdpau_mpeg12.o
OBJS-$(CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o
-OBJS-$(CONFIG_MPEG1_XVMC_HWACCEL) += mpegvideo_xvmc.o
OBJS-$(CONFIG_MPEG2_D3D11VA_HWACCEL) += dxva2_mpeg2.o
OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL) += dxva2_mpeg2.o
OBJS-$(CONFIG_MPEG2_NVDEC_HWACCEL) += nvdec_mpeg12.o
@@ -971,7 +970,6 @@ OBJS-$(CONFIG_MPEG2_QSV_HWACCEL) += qsvdec.o
OBJS-$(CONFIG_MPEG2_VAAPI_HWACCEL) += vaapi_mpeg2.o
OBJS-$(CONFIG_MPEG2_VDPAU_HWACCEL) += vdpau_mpeg12.o
OBJS-$(CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o
-OBJS-$(CONFIG_MPEG2_XVMC_HWACCEL) += mpegvideo_xvmc.o
OBJS-$(CONFIG_MPEG4_NVDEC_HWACCEL) += nvdec_mpeg4.o
OBJS-$(CONFIG_MPEG4_VAAPI_HWACCEL) += vaapi_mpeg4.o
OBJS-$(CONFIG_MPEG4_VDPAU_HWACCEL) += vdpau_mpeg4.o
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index ec1a0566a4..acb7ae0e14 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -2119,7 +2119,6 @@ typedef struct AVHWAccel {
*
* Meaningful slice information (codec specific) is guaranteed to
* be parsed at this point. This function is mandatory.
- * The only exception is XvMC, that works on MB level.
*
* @param avctx the codec context
* @param buf the slice data buffer base
@@ -2148,17 +2147,6 @@ typedef struct AVHWAccel {
*/
int frame_priv_data_size;
- /**
- * Called for every Macroblock in a slice.
- *
- * XvMC uses it to replace the ff_mpv_reconstruct_mb().
- * Instead of decoding to raw picture, MB parameters are
- * stored in an array provided by the video driver.
- *
- * @param s the mpeg context
- */
- void (*decode_mb)(struct MpegEncContext *s);
-
/**
* Initialize the hwaccel private data.
*
diff --git a/libavcodec/error_resilience.c b/libavcodec/error_resilience.c
index 91cd8a4444..ce16cff1e9 100644
--- a/libavcodec/error_resilience.c
+++ b/libavcodec/error_resilience.c
@@ -736,12 +736,6 @@ static int is_intra_more_likely(ERContext *s)
if (undamaged_count < 5)
return 0; // almost all MBs damaged -> use temporal prediction
- // prevent dsp.sad() check, that requires access to the image
- if (CONFIG_XVMC &&
- s->avctx->hwaccel && s->avctx->hwaccel->decode_mb &&
- s->cur_pic.f->pict_type == AV_PICTURE_TYPE_I)
- return 1;
-
skip_amount = FFMAX(undamaged_count / 50, 1); // check only up to 50 MBs
is_intra_likely = 0;
@@ -1229,9 +1223,6 @@ void ff_er_frame_end(ERContext *s)
} else
guess_mv(s);
- /* the filters below manipulate raw image, skip them */
- if (CONFIG_XVMC && s->avctx->hwaccel && s->avctx->hwaccel->decode_mb)
- goto ec_clean;
/* fill DC for inter blocks */
for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
diff --git a/libavcodec/hwaccels.h b/libavcodec/hwaccels.h
index 1e7b464950..ff4daca0e2 100644
--- a/libavcodec/hwaccels.h
+++ b/libavcodec/hwaccels.h
@@ -47,7 +47,6 @@ extern const AVHWAccel ff_mjpeg_vaapi_hwaccel;
extern const AVHWAccel ff_mpeg1_nvdec_hwaccel;
extern const AVHWAccel ff_mpeg1_vdpau_hwaccel;
extern const AVHWAccel ff_mpeg1_videotoolbox_hwaccel;
-extern const AVHWAccel ff_mpeg1_xvmc_hwaccel;
extern const AVHWAccel ff_mpeg2_d3d11va_hwaccel;
extern const AVHWAccel ff_mpeg2_d3d11va2_hwaccel;
extern const AVHWAccel ff_mpeg2_nvdec_hwaccel;
@@ -55,7 +54,6 @@ extern const AVHWAccel ff_mpeg2_dxva2_hwaccel;
extern const AVHWAccel ff_mpeg2_vaapi_hwaccel;
extern const AVHWAccel ff_mpeg2_vdpau_hwaccel;
extern const AVHWAccel ff_mpeg2_videotoolbox_hwaccel;
-extern const AVHWAccel ff_mpeg2_xvmc_hwaccel;
extern const AVHWAccel ff_mpeg4_nvdec_hwaccel;
extern const AVHWAccel ff_mpeg4_vaapi_hwaccel;
extern const AVHWAccel ff_mpeg4_vdpau_hwaccel;
diff --git a/libavcodec/hwconfig.h b/libavcodec/hwconfig.h
index f421dc909f..721424912c 100644
--- a/libavcodec/hwconfig.h
+++ b/libavcodec/hwconfig.h
@@ -78,8 +78,6 @@ typedef struct AVCodecHWConfigInternal {
HW_CONFIG_HWACCEL(1, 1, 1, VIDEOTOOLBOX, VIDEOTOOLBOX, ff_ ## codec ## _videotoolbox_hwaccel)
#define HWACCEL_D3D11VA(codec) \
HW_CONFIG_HWACCEL(0, 0, 1, D3D11VA_VLD, NONE, ff_ ## codec ## _d3d11va_hwaccel)
-#define HWACCEL_XVMC(codec) \
- HW_CONFIG_HWACCEL(0, 0, 1, XVMC, NONE, ff_ ## codec ## _xvmc_hwaccel)
#define HW_CONFIG_ENCODER(device, frames, ad_hoc, format, device_type_) \
&(const AVCodecHWConfigInternal) { \
diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c
index 4a7bd6d466..e0f8a2704f 100644
--- a/libavcodec/mpeg12dec.c
+++ b/libavcodec/mpeg12dec.c
@@ -50,7 +50,6 @@
#include "mpegvideodata.h"
#include "profiles.h"
#include "thread.h"
-#include "xvmc_internal.h"
#define A53_MAX_CC_COUNT 2000
@@ -762,9 +761,6 @@ static int mpeg_decode_mb(MpegEncContext *s, int16_t block[12][64])
memset(s->last_mv, 0, sizeof(s->last_mv));
}
s->mb_intra = 1;
- // if 1, we memcpy blocks in xvmcvideo
- if ((CONFIG_MPEG1_XVMC_HWACCEL || CONFIG_MPEG2_XVMC_HWACCEL) && s->pack_pblocks)
- ff_xvmc_pack_pblocks(s, -1); // inter are always full blocks
if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
if (s->avctx->flags2 & AV_CODEC_FLAG2_FAST) {
@@ -993,10 +989,6 @@ static int mpeg_decode_mb(MpegEncContext *s, int16_t block[12][64])
return AVERROR_INVALIDDATA;
}
- // if 1, we memcpy blocks in xvmcvideo
- if ((CONFIG_MPEG1_XVMC_HWACCEL || CONFIG_MPEG2_XVMC_HWACCEL) && s->pack_pblocks)
- ff_xvmc_pack_pblocks(s, cbp);
-
if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
if (s->avctx->flags2 & AV_CODEC_FLAG2_FAST) {
for (i = 0; i < 6; i++) {
@@ -1114,9 +1106,6 @@ static const enum AVPixelFormat mpeg1_hwaccel_pixfmt_list_420[] = {
#if CONFIG_MPEG1_NVDEC_HWACCEL
AV_PIX_FMT_CUDA,
#endif
-#if CONFIG_MPEG1_XVMC_HWACCEL
- AV_PIX_FMT_XVMC,
-#endif
#if CONFIG_MPEG1_VDPAU_HWACCEL
AV_PIX_FMT_VDPAU,
#endif
@@ -1128,9 +1117,6 @@ static const enum AVPixelFormat mpeg2_hwaccel_pixfmt_list_420[] = {
#if CONFIG_MPEG2_NVDEC_HWACCEL
AV_PIX_FMT_CUDA,
#endif
-#if CONFIG_MPEG2_XVMC_HWACCEL
- AV_PIX_FMT_XVMC,
-#endif
#if CONFIG_MPEG2_VDPAU_HWACCEL
AV_PIX_FMT_VDPAU,
#endif
@@ -1182,21 +1168,6 @@ static enum AVPixelFormat mpeg_get_pixelformat(AVCodecContext *avctx)
return ff_thread_get_format(avctx, pix_fmts);
}
-static void setup_hwaccel_for_pixfmt(AVCodecContext *avctx)
-{
- // until then pix_fmt may be changed right after codec init
- if (avctx->hwaccel)
- if (avctx->idct_algo == FF_IDCT_AUTO)
- avctx->idct_algo = FF_IDCT_NONE;
-
- if (avctx->hwaccel && avctx->pix_fmt == AV_PIX_FMT_XVMC) {
- Mpeg1Context *s1 = avctx->priv_data;
- MpegEncContext *s = &s1->mpeg_enc_ctx;
-
- s->pack_pblocks = 1;
- }
-}
-
/* Call this function when we know all parameters.
* It may be called in different places for MPEG-1 and MPEG-2. */
static int mpeg_decode_postinit(AVCodecContext *avctx)
@@ -1320,7 +1291,6 @@ static int mpeg_decode_postinit(AVCodecContext *avctx)
} // MPEG-2
avctx->pix_fmt = mpeg_get_pixelformat(avctx);
- setup_hwaccel_for_pixfmt(avctx);
/* Quantization matrices may need reordering
* if DCT permutation is changed. */
@@ -1808,10 +1778,6 @@ static int mpeg_decode_slice(MpegEncContext *s, int mb_y,
}
for (;;) {
- // If 1, we memcpy blocks in xvmcvideo.
- if ((CONFIG_MPEG1_XVMC_HWACCEL || CONFIG_MPEG2_XVMC_HWACCEL) && s->pack_pblocks)
- ff_xvmc_init_block(s); // set s->block
-
if ((ret = mpeg_decode_mb(s, s->block)) < 0)
return ret;
@@ -2165,7 +2131,6 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx,
s->codec_id =
s->avctx->codec_id = AV_CODEC_ID_MPEG1VIDEO;
s->out_format = FMT_MPEG1;
- s->swap_uv = 0; // AFAIK VCR2 does not have SEQ_HEADER
if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY)
s->low_delay = 1;
@@ -2194,7 +2159,6 @@ static int vcr2_init_sequence(AVCodecContext *avctx)
s->low_delay = 1;
avctx->pix_fmt = mpeg_get_pixelformat(avctx);
- setup_hwaccel_for_pixfmt(avctx);
ff_mpv_idct_init(s);
if ((ret = ff_mpv_common_init(s)) < 0)
@@ -2221,7 +2185,6 @@ static int vcr2_init_sequence(AVCodecContext *avctx)
if (s->codec_tag == AV_RL32("BW10")) {
s->codec_id = s->avctx->codec_id = AV_CODEC_ID_MPEG1VIDEO;
} else {
- s->swap_uv = 1; // in case of xvmc we need to swap uv for each MB
s->codec_id = s->avctx->codec_id = AV_CODEC_ID_MPEG2VIDEO;
}
s1->save_width = s->width;
@@ -2923,9 +2886,6 @@ const AVCodec ff_mpeg1video_decoder = {
#endif
#if CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL
HWACCEL_VIDEOTOOLBOX(mpeg1),
-#endif
-#if CONFIG_MPEG1_XVMC_HWACCEL
- HWACCEL_XVMC(mpeg1),
#endif
NULL
},
@@ -2971,9 +2931,6 @@ const AVCodec ff_mpeg2video_decoder = {
#endif
#if CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL
HWACCEL_VIDEOTOOLBOX(mpeg2),
-#endif
-#if CONFIG_MPEG2_XVMC_HWACCEL
- HWACCEL_XVMC(mpeg2),
#endif
NULL
},
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index bbcf00b014..30d84471d0 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -1644,12 +1644,6 @@ skip_idct:
void ff_mpv_reconstruct_mb(MpegEncContext *s, int16_t block[12][64])
{
- if (CONFIG_XVMC &&
- s->avctx->hwaccel && s->avctx->hwaccel->decode_mb) {
- s->avctx->hwaccel->decode_mb(s); //xvmc uses pblocks
- return;
- }
-
if (s->avctx->debug & FF_DEBUG_DCT_COEFF) {
/* print DCT coefficients */
av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y);
diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index 84d79d2e59..dfe1e72206 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -474,8 +474,6 @@ typedef struct MpegEncContext {
int rtp_payload_size;
uint8_t *ptr_lastgob;
- int swap_uv; //vcr2 codec is an MPEG-2 variant with U and V swapped
- int pack_pblocks; //xvmc needs to keep blocks without gaps.
int16_t (*pblocks[12])[64];
int16_t (*block)[64]; ///< points to one of the following blocks
diff --git a/libavcodec/mpegvideo_xvmc.c b/libavcodec/mpegvideo_xvmc.c
deleted file mode 100644
index f06583768c..0000000000
--- a/libavcodec/mpegvideo_xvmc.c
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- * XVideo Motion Compensation
- * Copyright (c) 2003 Ivan Kalvachev
- *
- * This file is part of FFmpeg.
- *
- * 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
- */
-
-#include <limits.h>
-#include <X11/extensions/XvMC.h>
-
-#include "avcodec.h"
-#include "mpegutils.h"
-#include "mpegvideo.h"
-
-#undef NDEBUG
-#include <assert.h>
-
-#include "xvmc.h"
-#include "xvmc_internal.h"
-#include "version.h"
-
-/**
- * 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
- * into the data_blocks array provided by xvmc.
- */
-void ff_xvmc_init_block(MpegEncContext *s)
-{
- 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 = (int16_t (*)[64])(render->data_blocks + render->next_free_data_block_num * 64);
-}
-
-static void exchange_uv(MpegEncContext *s)
-{
- int16_t (*tmp)[64];
-
- tmp = s->pblocks[4];
- s->pblocks[4] = s->pblocks[5];
- s->pblocks[5] = tmp;
-}
-
-/**
- * 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)
-{
- int i, j = 0;
- const int mb_block_count = 4 + (1 << s->chroma_format);
-
- cbp <<= 12-mb_block_count;
- for (i = 0; i < mb_block_count; i++) {
- if (cbp & (1 << 11))
- s->pblocks[i] = &s->block[j++];
- else
- s->pblocks[i] = NULL;
- cbp += cbp;
- }
- if (s->swap_uv) {
- exchange_uv(s);
- }
-}
-
-/**
- * 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.
- */
-static int ff_xvmc_field_start(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size)
-{
- struct MpegEncContext *s = avctx->priv_data;
- 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);
- if (!render || render->xvmc_id != AV_XVMC_ID ||
- !render->data_blocks || !render->mv_blocks ||
- (unsigned int)render->allocated_mv_blocks > INT_MAX/(64*6) ||
- (unsigned int)render->allocated_data_blocks > INT_MAX/64 ||
- !render->p_surface) {
- av_log(avctx, AV_LOG_ERROR,
- "Render token doesn't look as expected.\n");
- return -1; // make sure that this is a render packet
- }
-
- if (render->filled_mv_blocks_num) {
- av_log(avctx, AV_LOG_ERROR,
- "Rendering surface contains %i unprocessed blocks.\n",
- render->filled_mv_blocks_num);
- return -1;
- }
- if (render->allocated_mv_blocks < 1 ||
- render->allocated_data_blocks < render->allocated_mv_blocks*mb_block_count ||
- render->start_mv_blocks_num >= render->allocated_mv_blocks ||
- render->next_free_data_block_num >
- render->allocated_data_blocks -
- mb_block_count*(render->allocated_mv_blocks-render->start_mv_blocks_num)) {
- av_log(avctx, AV_LOG_ERROR,
- "Rendering surface doesn't provide enough block structures to work with.\n");
- return -1;
- }
-
- render->picture_structure = s->picture_structure;
- render->flags = s->first_field ? 0 : XVMC_SECOND_FIELD;
- render->p_future_surface = NULL;
- render->p_past_surface = NULL;
-
- switch(s->pict_type) {
- case AV_PICTURE_TYPE_I:
- return 0; // no prediction from other frames
- 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 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)
- return -1;
- render->p_past_surface = last->p_surface;
- return 0;
- }
-
-return -1;
-}
-
-/**
- * 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.
- */
-static int ff_xvmc_field_end(AVCodecContext *avctx)
-{
- struct MpegEncContext *s = avctx->priv_data;
- 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_mpeg_draw_horiz_band(s, 0, 0);
- return 0;
-}
-
-/**
- * Synthesize the data needed by XvMC to render one macroblock of data.
- * Fill all relevant fields, if necessary do IDCT.
- */
-static void ff_xvmc_decode_mb(struct MpegEncContext *s)
-{
- XvMCMacroBlock *mv_block;
- struct xvmc_pix_fmt *render;
- int i, cbp, blocks_per_mb;
-
- const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
-
-
- if (s->encoding) {
- av_log(s->avctx, AV_LOG_ERROR, "XVMC doesn't support encoding!!!\n");
- return;
- }
-
- // from ff_mpv_reconstruct_mb(), update DC predictors for P macroblocks
- if (!s->mb_intra) {
- s->last_dc[0] =
- s->last_dc[1] =
- s->last_dc[2] = 128 << s->intra_dc_precision;
- }
-
- // MC doesn't skip blocks
- s->mb_skipped = 0;
-
-
- // Do I need to export quant when I could not perform postprocessing?
- // Anyway, it doesn't hurt.
- s->current_picture.qscale_table[mb_xy] = s->qscale;
-
- // start of XVMC-specific code
- render = (struct xvmc_pix_fmt*)s->current_picture.f->data[2];
- assert(render);
- assert(render->xvmc_id == AV_XVMC_ID);
- assert(render->mv_blocks);
-
- // take the next free macroblock
- mv_block = &render->mv_blocks[render->start_mv_blocks_num +
- render->filled_mv_blocks_num];
-
- mv_block->x = s->mb_x;
- mv_block->y = s->mb_y;
- mv_block->dct_type = s->interlaced_dct; // XVMC_DCT_TYPE_FRAME/FIELD;
- if (s->mb_intra) {
- mv_block->macroblock_type = XVMC_MB_TYPE_INTRA; // no MC, all done
- } else {
- mv_block->macroblock_type = XVMC_MB_TYPE_PATTERN;
-
- if (s->mv_dir & MV_DIR_FORWARD) {
- mv_block->macroblock_type |= XVMC_MB_TYPE_MOTION_FORWARD;
- // PMV[n][dir][xy] = mv[dir][n][xy]
- mv_block->PMV[0][0][0] = s->mv[0][0][0];
- mv_block->PMV[0][0][1] = s->mv[0][0][1];
- mv_block->PMV[1][0][0] = s->mv[0][1][0];
- mv_block->PMV[1][0][1] = s->mv[0][1][1];
- }
- if (s->mv_dir & MV_DIR_BACKWARD) {
- mv_block->macroblock_type |= XVMC_MB_TYPE_MOTION_BACKWARD;
- mv_block->PMV[0][1][0] = s->mv[1][0][0];
- mv_block->PMV[0][1][1] = s->mv[1][0][1];
- mv_block->PMV[1][1][0] = s->mv[1][1][0];
- mv_block->PMV[1][1][1] = s->mv[1][1][1];
- }
-
- switch(s->mv_type) {
- case MV_TYPE_16X16:
- mv_block->motion_type = XVMC_PREDICTION_FRAME;
- break;
- case MV_TYPE_16X8:
- mv_block->motion_type = XVMC_PREDICTION_16x8;
- break;
- case MV_TYPE_FIELD:
- mv_block->motion_type = XVMC_PREDICTION_FIELD;
- if (s->picture_structure == PICT_FRAME) {
- mv_block->PMV[0][0][1] <<= 1;
- mv_block->PMV[1][0][1] <<= 1;
- mv_block->PMV[0][1][1] <<= 1;
- mv_block->PMV[1][1][1] <<= 1;
- }
- break;
- case MV_TYPE_DMV:
- mv_block->motion_type = XVMC_PREDICTION_DUAL_PRIME;
- if (s->picture_structure == PICT_FRAME) {
-
- mv_block->PMV[0][0][0] = s->mv[0][0][0]; // top from top
- mv_block->PMV[0][0][1] = s->mv[0][0][1] << 1;
-
- mv_block->PMV[0][1][0] = s->mv[0][0][0]; // bottom from bottom
- mv_block->PMV[0][1][1] = s->mv[0][0][1] << 1;
-
- mv_block->PMV[1][0][0] = s->mv[0][2][0]; // dmv00, top from bottom
- mv_block->PMV[1][0][1] = s->mv[0][2][1] << 1; // dmv01
-
- mv_block->PMV[1][1][0] = s->mv[0][3][0]; // dmv10, bottom from top
- mv_block->PMV[1][1][1] = s->mv[0][3][1] << 1; // dmv11
-
- } else {
- mv_block->PMV[0][1][0] = s->mv[0][2][0]; // dmv00
- mv_block->PMV[0][1][1] = s->mv[0][2][1]; // dmv01
- }
- break;
- default:
- assert(0);
- }
-
- mv_block->motion_vertical_field_select = 0;
-
- // set correct field references
- if (s->mv_type == MV_TYPE_FIELD || s->mv_type == MV_TYPE_16X8) {
- mv_block->motion_vertical_field_select |= s->field_select[0][0];
- mv_block->motion_vertical_field_select |= s->field_select[1][0] << 1;
- mv_block->motion_vertical_field_select |= s->field_select[0][1] << 2;
- mv_block->motion_vertical_field_select |= s->field_select[1][1] << 3;
- }
- } // !intra
- // time to handle data blocks
- mv_block->index = render->next_free_data_block_num;
-
- blocks_per_mb = 6;
- if (s->chroma_format >= 2) {
- blocks_per_mb = 4 + (1 << s->chroma_format);
- }
-
- // calculate cbp
- cbp = 0;
- for (i = 0; i < blocks_per_mb; i++) {
- cbp += cbp;
- if (s->block_last_index[i] >= 0)
- cbp++;
- }
-
- 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
- if (!render->unsigned_intra)
- *s->pblocks[i][0] = 1 << 10;
- }
- } else {
- cbp &= 0xf << (blocks_per_mb - 4);
- blocks_per_mb = 4; // luminance blocks only
- }
- }
- mv_block->coded_block_pattern = cbp;
- if (cbp == 0)
- mv_block->macroblock_type &= ~XVMC_MB_TYPE_PATTERN;
-
- 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->unsigned_intra))
- *s->pblocks[i][0] -= 1 << 10;
- if (!render->idct) {
- 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
- * slowdown. */
- }
- // copy blocks only if the codec doesn't support pblocks reordering
- if (!s->pack_pblocks) {
- memcpy(&render->data_blocks[render->next_free_data_block_num*64],
- s->pblocks[i], sizeof(*s->pblocks[i]));
- }
- render->next_free_data_block_num++;
- }
- }
- render->filled_mv_blocks_num++;
-
- assert(render->filled_mv_blocks_num <= render->allocated_mv_blocks);
- assert(render->next_free_data_block_num <= render->allocated_data_blocks);
- /* The above conditions should not be able to fail as long as this function
- * is used and the following 'if ()' automatically calls a callback to free
- * blocks. */
-
-
- if (render->filled_mv_blocks_num == render->allocated_mv_blocks)
- ff_mpeg_draw_horiz_band(s, 0, 0);
-}
-
-#if CONFIG_MPEG1_XVMC_HWACCEL
-const AVHWAccel ff_mpeg1_xvmc_hwaccel = {
- .name = "mpeg1_xvmc",
- .type = AVMEDIA_TYPE_VIDEO,
- .id = AV_CODEC_ID_MPEG1VIDEO,
- .pix_fmt = AV_PIX_FMT_XVMC,
- .start_frame = ff_xvmc_field_start,
- .end_frame = ff_xvmc_field_end,
- .decode_slice = NULL,
- .decode_mb = ff_xvmc_decode_mb,
- .priv_data_size = 0,
-};
-#endif
-
-#if CONFIG_MPEG2_XVMC_HWACCEL
-const AVHWAccel ff_mpeg2_xvmc_hwaccel = {
- .name = "mpeg2_xvmc",
- .type = AVMEDIA_TYPE_VIDEO,
- .id = AV_CODEC_ID_MPEG2VIDEO,
- .pix_fmt = AV_PIX_FMT_XVMC,
- .start_frame = ff_xvmc_field_start,
- .end_frame = ff_xvmc_field_end,
- .decode_slice = NULL,
- .decode_mb = ff_xvmc_decode_mb,
- .priv_data_size = 0,
-};
-#endif
diff --git a/libavcodec/x86/blockdsp_init.c b/libavcodec/x86/blockdsp_init.c
index 8b01a447cd..be3eef0021 100644
--- a/libavcodec/x86/blockdsp_init.c
+++ b/libavcodec/x86/blockdsp_init.c
@@ -44,10 +44,6 @@ av_cold void ff_blockdsp_init_x86(BlockDSPContext *c,
c->clear_blocks = ff_clear_blocks_mmx;
}
- /* XvMCCreateBlocks() may not allocate 16-byte aligned blocks */
- if (CONFIG_XVMC && avctx->hwaccel && avctx->hwaccel->decode_mb)
- return;
-
if (EXTERNAL_SSE(cpu_flags)) {
c->clear_block = ff_clear_block_sse;
c->clear_blocks = ff_clear_blocks_sse;
diff --git a/libavcodec/xvmc_internal.h b/libavcodec/xvmc_internal.h
deleted file mode 100644
index d365ef0266..0000000000
--- a/libavcodec/xvmc_internal.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * XVideo Motion Compensation internal functions
- *
- * This file is part of FFmpeg.
- *
- * 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
- */
-
-#ifndef AVCODEC_XVMC_INTERNAL_H
-#define AVCODEC_XVMC_INTERNAL_H
-
-#include "avcodec.h"
-#include "mpegvideo.h"
-#include "version.h"
-
-void ff_xvmc_init_block(MpegEncContext *s);
-void ff_xvmc_pack_pblocks(MpegEncContext *s, int cbp);
-
-#endif /* AVCODEC_XVMC_INTERNAL_H */
--
2.34.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 15+ messages in thread
* [FFmpeg-devel] [PATCH 2/4] lavc/xvmc.h: mark the header as deprecated
2022-02-01 10:02 [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC hwaccel code Anton Khirnov
@ 2022-02-01 10:02 ` Anton Khirnov
2022-02-01 10:02 ` [FFmpeg-devel] [PATCH 3/4] lavu/pixfmt: deprecate AV_PIX_FMT_XVMC Anton Khirnov
` (3 subsequent siblings)
4 siblings, 0 replies; 15+ messages in thread
From: Anton Khirnov @ 2022-02-01 10:02 UTC (permalink / raw)
To: ffmpeg-devel
---
libavcodec/xvmc.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/libavcodec/xvmc.h b/libavcodec/xvmc.h
index 465ee78d6e..78ec4530c2 100644
--- a/libavcodec/xvmc.h
+++ b/libavcodec/xvmc.h
@@ -27,6 +27,8 @@
* Public libavcodec XvMC header.
*/
+#pragma message("XvMC is no longer supported; this header is deprecated and will be removed")
+
#include <X11/extensions/XvMC.h>
#include "libavutil/attributes.h"
--
2.34.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 15+ messages in thread
* [FFmpeg-devel] [PATCH 3/4] lavu/pixfmt: deprecate AV_PIX_FMT_XVMC
2022-02-01 10:02 [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC hwaccel code Anton Khirnov
2022-02-01 10:02 ` [FFmpeg-devel] [PATCH 2/4] lavc/xvmc.h: mark the header as deprecated Anton Khirnov
@ 2022-02-01 10:02 ` Anton Khirnov
2022-02-01 10:02 ` [FFmpeg-devel] [PATCH 4/4] lavc: deprecate FF_IDCT_NONE Anton Khirnov
` (2 subsequent siblings)
4 siblings, 0 replies; 15+ messages in thread
From: Anton Khirnov @ 2022-02-01 10:02 UTC (permalink / raw)
To: ffmpeg-devel
It is no longer used for anything.
---
libavutil/pixdesc.c | 2 ++
libavutil/pixfmt.h | 2 ++
libavutil/version.h | 1 +
3 files changed, 5 insertions(+)
diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c
index 727d7540b3..6e57a82cb6 100644
--- a/libavutil/pixdesc.c
+++ b/libavutil/pixdesc.c
@@ -432,10 +432,12 @@ static const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {
},
.flags = AV_PIX_FMT_FLAG_PLANAR,
},
+#if FF_API_XVMC
[AV_PIX_FMT_XVMC] = {
.name = "xvmc",
.flags = AV_PIX_FMT_FLAG_HWACCEL,
},
+#endif
[AV_PIX_FMT_UYVY422] = {
.name = "uyvy422",
.nb_components = 3,
diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h
index 66913f606b..2d3927cc3f 100644
--- a/libavutil/pixfmt.h
+++ b/libavutil/pixfmt.h
@@ -260,7 +260,9 @@ enum AVPixelFormat {
AV_PIX_FMT_BAYER_GRBG16LE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, little-endian
AV_PIX_FMT_BAYER_GRBG16BE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, big-endian
+#if FF_API_XVMC
AV_PIX_FMT_XVMC,///< XVideo Motion Acceleration via common packet passing
+#endif
AV_PIX_FMT_YUV440P10LE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian
AV_PIX_FMT_YUV440P10BE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian
diff --git a/libavutil/version.h b/libavutil/version.h
index 331b8f6ea9..6f6e873a92 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -110,6 +110,7 @@
#define FF_API_COLORSPACE_NAME (LIBAVUTIL_VERSION_MAJOR < 58)
#define FF_API_AV_MALLOCZ_ARRAY (LIBAVUTIL_VERSION_MAJOR < 58)
#define FF_API_FIFO_PEEK2 (LIBAVUTIL_VERSION_MAJOR < 58)
+#define FF_API_XVMC (LIBAVUTIL_VERSION_MAJOR < 58)
/**
* @}
--
2.34.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 15+ messages in thread
* [FFmpeg-devel] [PATCH 4/4] lavc: deprecate FF_IDCT_NONE
2022-02-01 10:02 [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC hwaccel code Anton Khirnov
2022-02-01 10:02 ` [FFmpeg-devel] [PATCH 2/4] lavc/xvmc.h: mark the header as deprecated Anton Khirnov
2022-02-01 10:02 ` [FFmpeg-devel] [PATCH 3/4] lavu/pixfmt: deprecate AV_PIX_FMT_XVMC Anton Khirnov
@ 2022-02-01 10:02 ` Anton Khirnov
2022-02-01 11:16 ` Lynne
2022-02-07 1:46 ` [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC hwaccel code Andreas Rheinhardt
2022-02-08 9:37 ` Anton Khirnov
4 siblings, 1 reply; 15+ messages in thread
From: Anton Khirnov @ 2022-02-01 10:02 UTC (permalink / raw)
To: ffmpeg-devel
It was only used by XvMC.
---
libavcodec/avcodec.h | 5 ++++-
libavcodec/idctdsp.c | 1 -
libavcodec/version.h | 1 +
3 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index acb7ae0e14..5362446092 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -1407,7 +1407,10 @@ typedef struct AVCodecContext {
#define FF_IDCT_SIMPLEARMV6 17
#define FF_IDCT_FAAN 20
#define FF_IDCT_SIMPLENEON 22
-#define FF_IDCT_NONE 24 /* Used by XvMC to extract IDCT coefficients with FF_IDCT_PERM_NONE */
+#if FF_API_IDCT_NONE
+// formerly used by xvmc
+#define FF_IDCT_NONE 24
+#endif
#define FF_IDCT_SIMPLEAUTO 128
/**
diff --git a/libavcodec/idctdsp.c b/libavcodec/idctdsp.c
index 71bd03c606..79e7f87443 100644
--- a/libavcodec/idctdsp.c
+++ b/libavcodec/idctdsp.c
@@ -287,7 +287,6 @@ av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
c->perm_type = FF_IDCT_PERM_NONE;
#endif /* CONFIG_FAANIDCT */
} else { // accurate/default
- /* Be sure FF_IDCT_NONE will select this one, since it uses FF_IDCT_PERM_NONE */
c->idct_put = ff_simple_idct_put_int16_8bit;
c->idct_add = ff_simple_idct_add_int16_8bit;
c->idct = ff_simple_idct_int16_8bit;
diff --git a/libavcodec/version.h b/libavcodec/version.h
index a46fb05f1a..b2c57360cf 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -64,5 +64,6 @@
#define FF_API_FLAG_TRUNCATED (LIBAVCODEC_VERSION_MAJOR < 60)
#define FF_API_SUB_TEXT_FORMAT (LIBAVCODEC_VERSION_MAJOR < 60)
#define FF_API_MJPEG_PRED (LIBAVCODEC_VERSION_MAJOR < 60)
+#define FF_API_IDCT_NONE (LIBAVCODEC_VERSION_MAJOR < 60)
#endif /* AVCODEC_VERSION_H */
--
2.34.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [FFmpeg-devel] [PATCH 4/4] lavc: deprecate FF_IDCT_NONE
2022-02-01 10:02 ` [FFmpeg-devel] [PATCH 4/4] lavc: deprecate FF_IDCT_NONE Anton Khirnov
@ 2022-02-01 11:16 ` Lynne
2022-02-01 11:32 ` James Almer
0 siblings, 1 reply; 15+ messages in thread
From: Lynne @ 2022-02-01 11:16 UTC (permalink / raw)
To: FFmpeg development discussions and patches
1 Feb 2022, 11:02 by anton@khirnov.net:
> It was only used by XvMC.
> ---
> libavcodec/avcodec.h | 5 ++++-
> libavcodec/idctdsp.c | 1 -
> libavcodec/version.h | 1 +
> 3 files changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index acb7ae0e14..5362446092 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -1407,7 +1407,10 @@ typedef struct AVCodecContext {
> #define FF_IDCT_SIMPLEARMV6 17
> #define FF_IDCT_FAAN 20
> #define FF_IDCT_SIMPLENEON 22
> -#define FF_IDCT_NONE 24 /* Used by XvMC to extract IDCT coefficients with FF_IDCT_PERM_NONE */
> +#if FF_API_IDCT_NONE
> +// formerly used by xvmc
> +#define FF_IDCT_NONE 24
> +#endif
> #define FF_IDCT_SIMPLEAUTO 128
>
Isn't this a private define that clients weren't meant to use?
If so, may as well drop it with patch #1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [FFmpeg-devel] [PATCH 4/4] lavc: deprecate FF_IDCT_NONE
2022-02-01 11:16 ` Lynne
@ 2022-02-01 11:32 ` James Almer
0 siblings, 0 replies; 15+ messages in thread
From: James Almer @ 2022-02-01 11:32 UTC (permalink / raw)
To: ffmpeg-devel
On 2/1/2022 8:16 AM, Lynne wrote:
> 1 Feb 2022, 11:02 by anton@khirnov.net:
>
>> It was only used by XvMC.
>> ---
>> libavcodec/avcodec.h | 5 ++++-
>> libavcodec/idctdsp.c | 1 -
>> libavcodec/version.h | 1 +
>> 3 files changed, 5 insertions(+), 2 deletions(-)
>>
>> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
>> index acb7ae0e14..5362446092 100644
>> --- a/libavcodec/avcodec.h
>> +++ b/libavcodec/avcodec.h
>> @@ -1407,7 +1407,10 @@ typedef struct AVCodecContext {
>> #define FF_IDCT_SIMPLEARMV6 17
>> #define FF_IDCT_FAAN 20
>> #define FF_IDCT_SIMPLENEON 22
>> -#define FF_IDCT_NONE 24 /* Used by XvMC to extract IDCT coefficients with FF_IDCT_PERM_NONE */
>> +#if FF_API_IDCT_NONE
>> +// formerly used by xvmc
>> +#define FF_IDCT_NONE 24
>> +#endif
>> #define FF_IDCT_SIMPLEAUTO 128
>>
>
> Isn't this a private define that clients weren't meant to use?
Nowhere it says that. All FF_IDCT_ defines are documented as being able
to be used in AVCodecContext.idct_algo
> If so, may as well drop it with patch #1
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC hwaccel code
2022-02-01 10:02 [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC hwaccel code Anton Khirnov
` (2 preceding siblings ...)
2022-02-01 10:02 ` [FFmpeg-devel] [PATCH 4/4] lavc: deprecate FF_IDCT_NONE Anton Khirnov
@ 2022-02-07 1:46 ` Andreas Rheinhardt
2022-02-07 1:53 ` James Almer
2022-02-08 9:37 ` Anton Khirnov
4 siblings, 1 reply; 15+ messages in thread
From: Andreas Rheinhardt @ 2022-02-07 1:46 UTC (permalink / raw)
To: ffmpeg-devel
Anton Khirnov:
> XvMC was last relevant over 10 years ago, if ever. There is no reason to
> use it today.
> ---
> MAINTAINERS | 1 -
> configure | 9 -
> libavcodec/Makefile | 2 -
> libavcodec/avcodec.h | 12 --
> libavcodec/error_resilience.c | 9 -
> libavcodec/hwaccels.h | 2 -
> libavcodec/hwconfig.h | 2 -
> libavcodec/mpeg12dec.c | 43 ----
> libavcodec/mpegvideo.c | 6 -
> libavcodec/mpegvideo.h | 2 -
> libavcodec/mpegvideo_xvmc.c | 376 ---------------------------------
> libavcodec/x86/blockdsp_init.c | 4 -
> libavcodec/xvmc_internal.h | 31 ---
> 13 files changed, 499 deletions(-)
> delete mode 100644 libavcodec/mpegvideo_xvmc.c
> delete mode 100644 libavcodec/xvmc_internal.h
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index c065e94498..f33ccbd1d9 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -266,7 +266,6 @@ Codecs:
> xan.c Mike Melanson
> xbm* Paul B Mahol
> xface Stefano Sabatini
> - xvmc.c Ivan Kalvachev
> xwd* Paul B Mahol
>
> Hardware acceleration:
> diff --git a/configure b/configure
> index 5b19a35f59..6dbe108284 100755
> --- a/configure
> +++ b/configure
> @@ -1900,7 +1900,6 @@ HWACCEL_AUTODETECT_LIBRARY_LIST="
> videotoolbox
> vulkan
> v4l2_m2m
> - xvmc
> "
>
> # catchall list of things that require external libs to link
> @@ -3006,7 +3005,6 @@ vaapi_x11_deps="xlib_x11"
> videotoolbox_hwaccel_deps="videotoolbox pthreads"
> videotoolbox_hwaccel_extralibs="-framework QuartzCore"
> vulkan_deps_any="libdl LoadLibrary"
> -xvmc_deps="X11_extensions_XvMClib_h"
>
> av1_d3d11va_hwaccel_deps="d3d11va DXVA_PicParams_AV1"
> av1_d3d11va_hwaccel_select="av1_decoder"
> @@ -3054,16 +3052,12 @@ mjpeg_nvdec_hwaccel_deps="nvdec"
> mjpeg_nvdec_hwaccel_select="mjpeg_decoder"
> mjpeg_vaapi_hwaccel_deps="vaapi"
> mjpeg_vaapi_hwaccel_select="mjpeg_decoder"
> -mpeg_xvmc_hwaccel_deps="xvmc"
> -mpeg_xvmc_hwaccel_select="mpeg2video_decoder"
> mpeg1_nvdec_hwaccel_deps="nvdec"
> mpeg1_nvdec_hwaccel_select="mpeg1video_decoder"
> mpeg1_vdpau_hwaccel_deps="vdpau"
> mpeg1_vdpau_hwaccel_select="mpeg1video_decoder"
> mpeg1_videotoolbox_hwaccel_deps="videotoolbox"
> mpeg1_videotoolbox_hwaccel_select="mpeg1video_decoder"
> -mpeg1_xvmc_hwaccel_deps="xvmc"
> -mpeg1_xvmc_hwaccel_select="mpeg1video_decoder"
> mpeg2_d3d11va_hwaccel_deps="d3d11va"
> mpeg2_d3d11va_hwaccel_select="mpeg2video_decoder"
> mpeg2_d3d11va2_hwaccel_deps="d3d11va"
> @@ -3078,8 +3072,6 @@ mpeg2_vdpau_hwaccel_deps="vdpau"
> mpeg2_vdpau_hwaccel_select="mpeg2video_decoder"
> mpeg2_videotoolbox_hwaccel_deps="videotoolbox"
> mpeg2_videotoolbox_hwaccel_select="mpeg2video_decoder"
> -mpeg2_xvmc_hwaccel_deps="xvmc"
> -mpeg2_xvmc_hwaccel_select="mpeg2video_decoder"
> mpeg4_nvdec_hwaccel_deps="nvdec"
> mpeg4_nvdec_hwaccel_select="mpeg4_decoder"
> mpeg4_vaapi_hwaccel_deps="vaapi"
> @@ -6320,7 +6312,6 @@ check_headers unistd.h
> check_headers valgrind/valgrind.h
> check_func_headers VideoToolbox/VTCompressionSession.h VTCompressionSessionPrepareToEncodeFrames -framework VideoToolbox
> check_headers windows.h
> -check_headers X11/extensions/XvMClib.h
> check_headers asm/types.h
>
> # it seems there are versions of clang in some distros that try to use the
> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
> index cfc70a3eaf..6076b4ad80 100644
> --- a/libavcodec/Makefile
> +++ b/libavcodec/Makefile
> @@ -963,7 +963,6 @@ OBJS-$(CONFIG_MJPEG_VAAPI_HWACCEL) += vaapi_mjpeg.o
> OBJS-$(CONFIG_MPEG1_NVDEC_HWACCEL) += nvdec_mpeg12.o
> OBJS-$(CONFIG_MPEG1_VDPAU_HWACCEL) += vdpau_mpeg12.o
> OBJS-$(CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o
> -OBJS-$(CONFIG_MPEG1_XVMC_HWACCEL) += mpegvideo_xvmc.o
> OBJS-$(CONFIG_MPEG2_D3D11VA_HWACCEL) += dxva2_mpeg2.o
> OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL) += dxva2_mpeg2.o
> OBJS-$(CONFIG_MPEG2_NVDEC_HWACCEL) += nvdec_mpeg12.o
> @@ -971,7 +970,6 @@ OBJS-$(CONFIG_MPEG2_QSV_HWACCEL) += qsvdec.o
> OBJS-$(CONFIG_MPEG2_VAAPI_HWACCEL) += vaapi_mpeg2.o
> OBJS-$(CONFIG_MPEG2_VDPAU_HWACCEL) += vdpau_mpeg12.o
> OBJS-$(CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o
> -OBJS-$(CONFIG_MPEG2_XVMC_HWACCEL) += mpegvideo_xvmc.o
> OBJS-$(CONFIG_MPEG4_NVDEC_HWACCEL) += nvdec_mpeg4.o
> OBJS-$(CONFIG_MPEG4_VAAPI_HWACCEL) += vaapi_mpeg4.o
> OBJS-$(CONFIG_MPEG4_VDPAU_HWACCEL) += vdpau_mpeg4.o
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index ec1a0566a4..acb7ae0e14 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -2119,7 +2119,6 @@ typedef struct AVHWAccel {
> *
> * Meaningful slice information (codec specific) is guaranteed to
> * be parsed at this point. This function is mandatory.
> - * The only exception is XvMC, that works on MB level.
> *
> * @param avctx the codec context
> * @param buf the slice data buffer base
> @@ -2148,17 +2147,6 @@ typedef struct AVHWAccel {
> */
> int frame_priv_data_size;
>
> - /**
> - * Called for every Macroblock in a slice.
> - *
> - * XvMC uses it to replace the ff_mpv_reconstruct_mb().
> - * Instead of decoding to raw picture, MB parameters are
> - * stored in an array provided by the video driver.
> - *
> - * @param s the mpeg context
> - */
> - void (*decode_mb)(struct MpegEncContext *s);
> -
> /**
> * Initialize the hwaccel private data.
> *
> diff --git a/libavcodec/error_resilience.c b/libavcodec/error_resilience.c
> index 91cd8a4444..ce16cff1e9 100644
> --- a/libavcodec/error_resilience.c
> +++ b/libavcodec/error_resilience.c
> @@ -736,12 +736,6 @@ static int is_intra_more_likely(ERContext *s)
> if (undamaged_count < 5)
> return 0; // almost all MBs damaged -> use temporal prediction
>
> - // prevent dsp.sad() check, that requires access to the image
> - if (CONFIG_XVMC &&
> - s->avctx->hwaccel && s->avctx->hwaccel->decode_mb &&
> - s->cur_pic.f->pict_type == AV_PICTURE_TYPE_I)
> - return 1;
> -
> skip_amount = FFMAX(undamaged_count / 50, 1); // check only up to 50 MBs
> is_intra_likely = 0;
>
> @@ -1229,9 +1223,6 @@ void ff_er_frame_end(ERContext *s)
> } else
> guess_mv(s);
>
> - /* the filters below manipulate raw image, skip them */
> - if (CONFIG_XVMC && s->avctx->hwaccel && s->avctx->hwaccel->decode_mb)
> - goto ec_clean;
> /* fill DC for inter blocks */
> for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
> for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
> diff --git a/libavcodec/hwaccels.h b/libavcodec/hwaccels.h
> index 1e7b464950..ff4daca0e2 100644
> --- a/libavcodec/hwaccels.h
> +++ b/libavcodec/hwaccels.h
> @@ -47,7 +47,6 @@ extern const AVHWAccel ff_mjpeg_vaapi_hwaccel;
> extern const AVHWAccel ff_mpeg1_nvdec_hwaccel;
> extern const AVHWAccel ff_mpeg1_vdpau_hwaccel;
> extern const AVHWAccel ff_mpeg1_videotoolbox_hwaccel;
> -extern const AVHWAccel ff_mpeg1_xvmc_hwaccel;
> extern const AVHWAccel ff_mpeg2_d3d11va_hwaccel;
> extern const AVHWAccel ff_mpeg2_d3d11va2_hwaccel;
> extern const AVHWAccel ff_mpeg2_nvdec_hwaccel;
> @@ -55,7 +54,6 @@ extern const AVHWAccel ff_mpeg2_dxva2_hwaccel;
> extern const AVHWAccel ff_mpeg2_vaapi_hwaccel;
> extern const AVHWAccel ff_mpeg2_vdpau_hwaccel;
> extern const AVHWAccel ff_mpeg2_videotoolbox_hwaccel;
> -extern const AVHWAccel ff_mpeg2_xvmc_hwaccel;
> extern const AVHWAccel ff_mpeg4_nvdec_hwaccel;
> extern const AVHWAccel ff_mpeg4_vaapi_hwaccel;
> extern const AVHWAccel ff_mpeg4_vdpau_hwaccel;
> diff --git a/libavcodec/hwconfig.h b/libavcodec/hwconfig.h
> index f421dc909f..721424912c 100644
> --- a/libavcodec/hwconfig.h
> +++ b/libavcodec/hwconfig.h
> @@ -78,8 +78,6 @@ typedef struct AVCodecHWConfigInternal {
> HW_CONFIG_HWACCEL(1, 1, 1, VIDEOTOOLBOX, VIDEOTOOLBOX, ff_ ## codec ## _videotoolbox_hwaccel)
> #define HWACCEL_D3D11VA(codec) \
> HW_CONFIG_HWACCEL(0, 0, 1, D3D11VA_VLD, NONE, ff_ ## codec ## _d3d11va_hwaccel)
> -#define HWACCEL_XVMC(codec) \
> - HW_CONFIG_HWACCEL(0, 0, 1, XVMC, NONE, ff_ ## codec ## _xvmc_hwaccel)
>
> #define HW_CONFIG_ENCODER(device, frames, ad_hoc, format, device_type_) \
> &(const AVCodecHWConfigInternal) { \
> diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c
> index 4a7bd6d466..e0f8a2704f 100644
> --- a/libavcodec/mpeg12dec.c
> +++ b/libavcodec/mpeg12dec.c
> @@ -50,7 +50,6 @@
> #include "mpegvideodata.h"
> #include "profiles.h"
> #include "thread.h"
> -#include "xvmc_internal.h"
>
> #define A53_MAX_CC_COUNT 2000
>
> @@ -762,9 +761,6 @@ static int mpeg_decode_mb(MpegEncContext *s, int16_t block[12][64])
> memset(s->last_mv, 0, sizeof(s->last_mv));
> }
> s->mb_intra = 1;
> - // if 1, we memcpy blocks in xvmcvideo
> - if ((CONFIG_MPEG1_XVMC_HWACCEL || CONFIG_MPEG2_XVMC_HWACCEL) && s->pack_pblocks)
> - ff_xvmc_pack_pblocks(s, -1); // inter are always full blocks
>
> if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
> if (s->avctx->flags2 & AV_CODEC_FLAG2_FAST) {
> @@ -993,10 +989,6 @@ static int mpeg_decode_mb(MpegEncContext *s, int16_t block[12][64])
> return AVERROR_INVALIDDATA;
> }
>
> - // if 1, we memcpy blocks in xvmcvideo
> - if ((CONFIG_MPEG1_XVMC_HWACCEL || CONFIG_MPEG2_XVMC_HWACCEL) && s->pack_pblocks)
> - ff_xvmc_pack_pblocks(s, cbp);
> -
> if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
> if (s->avctx->flags2 & AV_CODEC_FLAG2_FAST) {
> for (i = 0; i < 6; i++) {
> @@ -1114,9 +1106,6 @@ static const enum AVPixelFormat mpeg1_hwaccel_pixfmt_list_420[] = {
> #if CONFIG_MPEG1_NVDEC_HWACCEL
> AV_PIX_FMT_CUDA,
> #endif
> -#if CONFIG_MPEG1_XVMC_HWACCEL
> - AV_PIX_FMT_XVMC,
> -#endif
> #if CONFIG_MPEG1_VDPAU_HWACCEL
> AV_PIX_FMT_VDPAU,
> #endif
> @@ -1128,9 +1117,6 @@ static const enum AVPixelFormat mpeg2_hwaccel_pixfmt_list_420[] = {
> #if CONFIG_MPEG2_NVDEC_HWACCEL
> AV_PIX_FMT_CUDA,
> #endif
> -#if CONFIG_MPEG2_XVMC_HWACCEL
> - AV_PIX_FMT_XVMC,
> -#endif
> #if CONFIG_MPEG2_VDPAU_HWACCEL
> AV_PIX_FMT_VDPAU,
> #endif
> @@ -1182,21 +1168,6 @@ static enum AVPixelFormat mpeg_get_pixelformat(AVCodecContext *avctx)
> return ff_thread_get_format(avctx, pix_fmts);
> }
>
> -static void setup_hwaccel_for_pixfmt(AVCodecContext *avctx)
> -{
> - // until then pix_fmt may be changed right after codec init
> - if (avctx->hwaccel)
> - if (avctx->idct_algo == FF_IDCT_AUTO)
> - avctx->idct_algo = FF_IDCT_NONE;
> -
> - if (avctx->hwaccel && avctx->pix_fmt == AV_PIX_FMT_XVMC) {
> - Mpeg1Context *s1 = avctx->priv_data;
> - MpegEncContext *s = &s1->mpeg_enc_ctx;
> -
> - s->pack_pblocks = 1;
> - }
> -}
> -
> /* Call this function when we know all parameters.
> * It may be called in different places for MPEG-1 and MPEG-2. */
> static int mpeg_decode_postinit(AVCodecContext *avctx)
> @@ -1320,7 +1291,6 @@ static int mpeg_decode_postinit(AVCodecContext *avctx)
> } // MPEG-2
>
> avctx->pix_fmt = mpeg_get_pixelformat(avctx);
> - setup_hwaccel_for_pixfmt(avctx);
>
> /* Quantization matrices may need reordering
> * if DCT permutation is changed. */
> @@ -1808,10 +1778,6 @@ static int mpeg_decode_slice(MpegEncContext *s, int mb_y,
> }
>
> for (;;) {
> - // If 1, we memcpy blocks in xvmcvideo.
> - if ((CONFIG_MPEG1_XVMC_HWACCEL || CONFIG_MPEG2_XVMC_HWACCEL) && s->pack_pblocks)
> - ff_xvmc_init_block(s); // set s->block
> -
> if ((ret = mpeg_decode_mb(s, s->block)) < 0)
> return ret;
>
> @@ -2165,7 +2131,6 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx,
> s->codec_id =
> s->avctx->codec_id = AV_CODEC_ID_MPEG1VIDEO;
> s->out_format = FMT_MPEG1;
> - s->swap_uv = 0; // AFAIK VCR2 does not have SEQ_HEADER
> if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY)
> s->low_delay = 1;
>
> @@ -2194,7 +2159,6 @@ static int vcr2_init_sequence(AVCodecContext *avctx)
> s->low_delay = 1;
>
> avctx->pix_fmt = mpeg_get_pixelformat(avctx);
> - setup_hwaccel_for_pixfmt(avctx);
>
> ff_mpv_idct_init(s);
> if ((ret = ff_mpv_common_init(s)) < 0)
> @@ -2221,7 +2185,6 @@ static int vcr2_init_sequence(AVCodecContext *avctx)
> if (s->codec_tag == AV_RL32("BW10")) {
> s->codec_id = s->avctx->codec_id = AV_CODEC_ID_MPEG1VIDEO;
> } else {
> - s->swap_uv = 1; // in case of xvmc we need to swap uv for each MB
> s->codec_id = s->avctx->codec_id = AV_CODEC_ID_MPEG2VIDEO;
> }
> s1->save_width = s->width;
> @@ -2923,9 +2886,6 @@ const AVCodec ff_mpeg1video_decoder = {
> #endif
> #if CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL
> HWACCEL_VIDEOTOOLBOX(mpeg1),
> -#endif
> -#if CONFIG_MPEG1_XVMC_HWACCEL
> - HWACCEL_XVMC(mpeg1),
> #endif
> NULL
> },
> @@ -2971,9 +2931,6 @@ const AVCodec ff_mpeg2video_decoder = {
> #endif
> #if CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL
> HWACCEL_VIDEOTOOLBOX(mpeg2),
> -#endif
> -#if CONFIG_MPEG2_XVMC_HWACCEL
> - HWACCEL_XVMC(mpeg2),
> #endif
> NULL
> },
> diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
> index bbcf00b014..30d84471d0 100644
> --- a/libavcodec/mpegvideo.c
> +++ b/libavcodec/mpegvideo.c
> @@ -1644,12 +1644,6 @@ skip_idct:
>
> void ff_mpv_reconstruct_mb(MpegEncContext *s, int16_t block[12][64])
> {
> - if (CONFIG_XVMC &&
> - s->avctx->hwaccel && s->avctx->hwaccel->decode_mb) {
> - s->avctx->hwaccel->decode_mb(s); //xvmc uses pblocks
> - return;
> - }
> -
> if (s->avctx->debug & FF_DEBUG_DCT_COEFF) {
> /* print DCT coefficients */
> av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y);
> diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
> index 84d79d2e59..dfe1e72206 100644
> --- a/libavcodec/mpegvideo.h
> +++ b/libavcodec/mpegvideo.h
> @@ -474,8 +474,6 @@ typedef struct MpegEncContext {
> int rtp_payload_size;
>
> uint8_t *ptr_lastgob;
> - int swap_uv; //vcr2 codec is an MPEG-2 variant with U and V swapped
> - int pack_pblocks; //xvmc needs to keep blocks without gaps.
> int16_t (*pblocks[12])[64];
>
> int16_t (*block)[64]; ///< points to one of the following blocks
> diff --git a/libavcodec/mpegvideo_xvmc.c b/libavcodec/mpegvideo_xvmc.c
> deleted file mode 100644
> index f06583768c..0000000000
> --- a/libavcodec/mpegvideo_xvmc.c
> +++ /dev/null
> @@ -1,376 +0,0 @@
> -/*
> - * XVideo Motion Compensation
> - * Copyright (c) 2003 Ivan Kalvachev
> - *
> - * This file is part of FFmpeg.
> - *
> - * 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
> - */
> -
> -#include <limits.h>
> -#include <X11/extensions/XvMC.h>
> -
> -#include "avcodec.h"
> -#include "mpegutils.h"
> -#include "mpegvideo.h"
> -
> -#undef NDEBUG
> -#include <assert.h>
> -
> -#include "xvmc.h"
> -#include "xvmc_internal.h"
> -#include "version.h"
> -
> -/**
> - * 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
> - * into the data_blocks array provided by xvmc.
> - */
> -void ff_xvmc_init_block(MpegEncContext *s)
> -{
> - 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 = (int16_t (*)[64])(render->data_blocks + render->next_free_data_block_num * 64);
> -}
> -
> -static void exchange_uv(MpegEncContext *s)
> -{
> - int16_t (*tmp)[64];
> -
> - tmp = s->pblocks[4];
> - s->pblocks[4] = s->pblocks[5];
> - s->pblocks[5] = tmp;
> -}
> -
> -/**
> - * 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)
> -{
> - int i, j = 0;
> - const int mb_block_count = 4 + (1 << s->chroma_format);
> -
> - cbp <<= 12-mb_block_count;
> - for (i = 0; i < mb_block_count; i++) {
> - if (cbp & (1 << 11))
> - s->pblocks[i] = &s->block[j++];
> - else
> - s->pblocks[i] = NULL;
> - cbp += cbp;
> - }
> - if (s->swap_uv) {
> - exchange_uv(s);
> - }
> -}
> -
> -/**
> - * 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.
> - */
> -static int ff_xvmc_field_start(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size)
> -{
> - struct MpegEncContext *s = avctx->priv_data;
> - 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);
> - if (!render || render->xvmc_id != AV_XVMC_ID ||
> - !render->data_blocks || !render->mv_blocks ||
> - (unsigned int)render->allocated_mv_blocks > INT_MAX/(64*6) ||
> - (unsigned int)render->allocated_data_blocks > INT_MAX/64 ||
> - !render->p_surface) {
> - av_log(avctx, AV_LOG_ERROR,
> - "Render token doesn't look as expected.\n");
> - return -1; // make sure that this is a render packet
> - }
> -
> - if (render->filled_mv_blocks_num) {
> - av_log(avctx, AV_LOG_ERROR,
> - "Rendering surface contains %i unprocessed blocks.\n",
> - render->filled_mv_blocks_num);
> - return -1;
> - }
> - if (render->allocated_mv_blocks < 1 ||
> - render->allocated_data_blocks < render->allocated_mv_blocks*mb_block_count ||
> - render->start_mv_blocks_num >= render->allocated_mv_blocks ||
> - render->next_free_data_block_num >
> - render->allocated_data_blocks -
> - mb_block_count*(render->allocated_mv_blocks-render->start_mv_blocks_num)) {
> - av_log(avctx, AV_LOG_ERROR,
> - "Rendering surface doesn't provide enough block structures to work with.\n");
> - return -1;
> - }
> -
> - render->picture_structure = s->picture_structure;
> - render->flags = s->first_field ? 0 : XVMC_SECOND_FIELD;
> - render->p_future_surface = NULL;
> - render->p_past_surface = NULL;
> -
> - switch(s->pict_type) {
> - case AV_PICTURE_TYPE_I:
> - return 0; // no prediction from other frames
> - 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 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)
> - return -1;
> - render->p_past_surface = last->p_surface;
> - return 0;
> - }
> -
> -return -1;
> -}
> -
> -/**
> - * 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.
> - */
> -static int ff_xvmc_field_end(AVCodecContext *avctx)
> -{
> - struct MpegEncContext *s = avctx->priv_data;
> - 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_mpeg_draw_horiz_band(s, 0, 0);
> - return 0;
> -}
> -
> -/**
> - * Synthesize the data needed by XvMC to render one macroblock of data.
> - * Fill all relevant fields, if necessary do IDCT.
> - */
> -static void ff_xvmc_decode_mb(struct MpegEncContext *s)
> -{
> - XvMCMacroBlock *mv_block;
> - struct xvmc_pix_fmt *render;
> - int i, cbp, blocks_per_mb;
> -
> - const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
> -
> -
> - if (s->encoding) {
> - av_log(s->avctx, AV_LOG_ERROR, "XVMC doesn't support encoding!!!\n");
> - return;
> - }
> -
> - // from ff_mpv_reconstruct_mb(), update DC predictors for P macroblocks
> - if (!s->mb_intra) {
> - s->last_dc[0] =
> - s->last_dc[1] =
> - s->last_dc[2] = 128 << s->intra_dc_precision;
> - }
> -
> - // MC doesn't skip blocks
> - s->mb_skipped = 0;
> -
> -
> - // Do I need to export quant when I could not perform postprocessing?
> - // Anyway, it doesn't hurt.
> - s->current_picture.qscale_table[mb_xy] = s->qscale;
> -
> - // start of XVMC-specific code
> - render = (struct xvmc_pix_fmt*)s->current_picture.f->data[2];
> - assert(render);
> - assert(render->xvmc_id == AV_XVMC_ID);
> - assert(render->mv_blocks);
> -
> - // take the next free macroblock
> - mv_block = &render->mv_blocks[render->start_mv_blocks_num +
> - render->filled_mv_blocks_num];
> -
> - mv_block->x = s->mb_x;
> - mv_block->y = s->mb_y;
> - mv_block->dct_type = s->interlaced_dct; // XVMC_DCT_TYPE_FRAME/FIELD;
> - if (s->mb_intra) {
> - mv_block->macroblock_type = XVMC_MB_TYPE_INTRA; // no MC, all done
> - } else {
> - mv_block->macroblock_type = XVMC_MB_TYPE_PATTERN;
> -
> - if (s->mv_dir & MV_DIR_FORWARD) {
> - mv_block->macroblock_type |= XVMC_MB_TYPE_MOTION_FORWARD;
> - // PMV[n][dir][xy] = mv[dir][n][xy]
> - mv_block->PMV[0][0][0] = s->mv[0][0][0];
> - mv_block->PMV[0][0][1] = s->mv[0][0][1];
> - mv_block->PMV[1][0][0] = s->mv[0][1][0];
> - mv_block->PMV[1][0][1] = s->mv[0][1][1];
> - }
> - if (s->mv_dir & MV_DIR_BACKWARD) {
> - mv_block->macroblock_type |= XVMC_MB_TYPE_MOTION_BACKWARD;
> - mv_block->PMV[0][1][0] = s->mv[1][0][0];
> - mv_block->PMV[0][1][1] = s->mv[1][0][1];
> - mv_block->PMV[1][1][0] = s->mv[1][1][0];
> - mv_block->PMV[1][1][1] = s->mv[1][1][1];
> - }
> -
> - switch(s->mv_type) {
> - case MV_TYPE_16X16:
> - mv_block->motion_type = XVMC_PREDICTION_FRAME;
> - break;
> - case MV_TYPE_16X8:
> - mv_block->motion_type = XVMC_PREDICTION_16x8;
> - break;
> - case MV_TYPE_FIELD:
> - mv_block->motion_type = XVMC_PREDICTION_FIELD;
> - if (s->picture_structure == PICT_FRAME) {
> - mv_block->PMV[0][0][1] <<= 1;
> - mv_block->PMV[1][0][1] <<= 1;
> - mv_block->PMV[0][1][1] <<= 1;
> - mv_block->PMV[1][1][1] <<= 1;
> - }
> - break;
> - case MV_TYPE_DMV:
> - mv_block->motion_type = XVMC_PREDICTION_DUAL_PRIME;
> - if (s->picture_structure == PICT_FRAME) {
> -
> - mv_block->PMV[0][0][0] = s->mv[0][0][0]; // top from top
> - mv_block->PMV[0][0][1] = s->mv[0][0][1] << 1;
> -
> - mv_block->PMV[0][1][0] = s->mv[0][0][0]; // bottom from bottom
> - mv_block->PMV[0][1][1] = s->mv[0][0][1] << 1;
> -
> - mv_block->PMV[1][0][0] = s->mv[0][2][0]; // dmv00, top from bottom
> - mv_block->PMV[1][0][1] = s->mv[0][2][1] << 1; // dmv01
> -
> - mv_block->PMV[1][1][0] = s->mv[0][3][0]; // dmv10, bottom from top
> - mv_block->PMV[1][1][1] = s->mv[0][3][1] << 1; // dmv11
> -
> - } else {
> - mv_block->PMV[0][1][0] = s->mv[0][2][0]; // dmv00
> - mv_block->PMV[0][1][1] = s->mv[0][2][1]; // dmv01
> - }
> - break;
> - default:
> - assert(0);
> - }
> -
> - mv_block->motion_vertical_field_select = 0;
> -
> - // set correct field references
> - if (s->mv_type == MV_TYPE_FIELD || s->mv_type == MV_TYPE_16X8) {
> - mv_block->motion_vertical_field_select |= s->field_select[0][0];
> - mv_block->motion_vertical_field_select |= s->field_select[1][0] << 1;
> - mv_block->motion_vertical_field_select |= s->field_select[0][1] << 2;
> - mv_block->motion_vertical_field_select |= s->field_select[1][1] << 3;
> - }
> - } // !intra
> - // time to handle data blocks
> - mv_block->index = render->next_free_data_block_num;
> -
> - blocks_per_mb = 6;
> - if (s->chroma_format >= 2) {
> - blocks_per_mb = 4 + (1 << s->chroma_format);
> - }
> -
> - // calculate cbp
> - cbp = 0;
> - for (i = 0; i < blocks_per_mb; i++) {
> - cbp += cbp;
> - if (s->block_last_index[i] >= 0)
> - cbp++;
> - }
> -
> - 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
> - if (!render->unsigned_intra)
> - *s->pblocks[i][0] = 1 << 10;
> - }
> - } else {
> - cbp &= 0xf << (blocks_per_mb - 4);
> - blocks_per_mb = 4; // luminance blocks only
> - }
> - }
> - mv_block->coded_block_pattern = cbp;
> - if (cbp == 0)
> - mv_block->macroblock_type &= ~XVMC_MB_TYPE_PATTERN;
> -
> - 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->unsigned_intra))
> - *s->pblocks[i][0] -= 1 << 10;
> - if (!render->idct) {
> - 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
> - * slowdown. */
> - }
> - // copy blocks only if the codec doesn't support pblocks reordering
> - if (!s->pack_pblocks) {
> - memcpy(&render->data_blocks[render->next_free_data_block_num*64],
> - s->pblocks[i], sizeof(*s->pblocks[i]));
> - }
> - render->next_free_data_block_num++;
> - }
> - }
> - render->filled_mv_blocks_num++;
> -
> - assert(render->filled_mv_blocks_num <= render->allocated_mv_blocks);
> - assert(render->next_free_data_block_num <= render->allocated_data_blocks);
> - /* The above conditions should not be able to fail as long as this function
> - * is used and the following 'if ()' automatically calls a callback to free
> - * blocks. */
> -
> -
> - if (render->filled_mv_blocks_num == render->allocated_mv_blocks)
> - ff_mpeg_draw_horiz_band(s, 0, 0);
> -}
> -
> -#if CONFIG_MPEG1_XVMC_HWACCEL
> -const AVHWAccel ff_mpeg1_xvmc_hwaccel = {
> - .name = "mpeg1_xvmc",
> - .type = AVMEDIA_TYPE_VIDEO,
> - .id = AV_CODEC_ID_MPEG1VIDEO,
> - .pix_fmt = AV_PIX_FMT_XVMC,
> - .start_frame = ff_xvmc_field_start,
> - .end_frame = ff_xvmc_field_end,
> - .decode_slice = NULL,
> - .decode_mb = ff_xvmc_decode_mb,
> - .priv_data_size = 0,
> -};
> -#endif
> -
> -#if CONFIG_MPEG2_XVMC_HWACCEL
> -const AVHWAccel ff_mpeg2_xvmc_hwaccel = {
> - .name = "mpeg2_xvmc",
> - .type = AVMEDIA_TYPE_VIDEO,
> - .id = AV_CODEC_ID_MPEG2VIDEO,
> - .pix_fmt = AV_PIX_FMT_XVMC,
> - .start_frame = ff_xvmc_field_start,
> - .end_frame = ff_xvmc_field_end,
> - .decode_slice = NULL,
> - .decode_mb = ff_xvmc_decode_mb,
> - .priv_data_size = 0,
> -};
> -#endif
> diff --git a/libavcodec/x86/blockdsp_init.c b/libavcodec/x86/blockdsp_init.c
> index 8b01a447cd..be3eef0021 100644
> --- a/libavcodec/x86/blockdsp_init.c
> +++ b/libavcodec/x86/blockdsp_init.c
> @@ -44,10 +44,6 @@ av_cold void ff_blockdsp_init_x86(BlockDSPContext *c,
> c->clear_blocks = ff_clear_blocks_mmx;
> }
>
> - /* XvMCCreateBlocks() may not allocate 16-byte aligned blocks */
> - if (CONFIG_XVMC && avctx->hwaccel && avctx->hwaccel->decode_mb)
> - return;
> -
> if (EXTERNAL_SSE(cpu_flags)) {
> c->clear_block = ff_clear_block_sse;
> c->clear_blocks = ff_clear_blocks_sse;
> diff --git a/libavcodec/xvmc_internal.h b/libavcodec/xvmc_internal.h
> deleted file mode 100644
> index d365ef0266..0000000000
> --- a/libavcodec/xvmc_internal.h
> +++ /dev/null
> @@ -1,31 +0,0 @@
> -/*
> - * XVideo Motion Compensation internal functions
> - *
> - * This file is part of FFmpeg.
> - *
> - * 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
> - */
> -
> -#ifndef AVCODEC_XVMC_INTERNAL_H
> -#define AVCODEC_XVMC_INTERNAL_H
> -
> -#include "avcodec.h"
> -#include "mpegvideo.h"
> -#include "version.h"
> -
> -void ff_xvmc_init_block(MpegEncContext *s);
> -void ff_xvmc_pack_pblocks(MpegEncContext *s, int cbp);
> -
> -#endif /* AVCODEC_XVMC_INTERNAL_H */
I thought that removing components is only possible at a major version
bump. Am I wrong?
- Andreas
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC hwaccel code
2022-02-07 1:46 ` [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC hwaccel code Andreas Rheinhardt
@ 2022-02-07 1:53 ` James Almer
2022-02-07 2:18 ` Soft Works
2022-02-08 9:36 ` Anton Khirnov
0 siblings, 2 replies; 15+ messages in thread
From: James Almer @ 2022-02-07 1:53 UTC (permalink / raw)
To: ffmpeg-devel
On 2/6/2022 10:46 PM, Andreas Rheinhardt wrote:
> Anton Khirnov:
>> XvMC was last relevant over 10 years ago, if ever. There is no reason to
>> use it today.
>> ---
>> MAINTAINERS | 1 -
>> configure | 9 -
>> libavcodec/Makefile | 2 -
>> libavcodec/avcodec.h | 12 --
>> libavcodec/error_resilience.c | 9 -
>> libavcodec/hwaccels.h | 2 -
>> libavcodec/hwconfig.h | 2 -
>> libavcodec/mpeg12dec.c | 43 ----
>> libavcodec/mpegvideo.c | 6 -
>> libavcodec/mpegvideo.h | 2 -
>> libavcodec/mpegvideo_xvmc.c | 376 ---------------------------------
>> libavcodec/x86/blockdsp_init.c | 4 -
>> libavcodec/xvmc_internal.h | 31 ---
>> 13 files changed, 499 deletions(-)
>> delete mode 100644 libavcodec/mpegvideo_xvmc.c
>> delete mode 100644 libavcodec/xvmc_internal.h
>>
>> diff --git a/MAINTAINERS b/MAINTAINERS
>> index c065e94498..f33ccbd1d9 100644
>> --- a/MAINTAINERS
>> +++ b/MAINTAINERS
>> @@ -266,7 +266,6 @@ Codecs:
>> xan.c Mike Melanson
>> xbm* Paul B Mahol
>> xface Stefano Sabatini
>> - xvmc.c Ivan Kalvachev
>> xwd* Paul B Mahol
>>
>> Hardware acceleration:
>> diff --git a/configure b/configure
>> index 5b19a35f59..6dbe108284 100755
>> --- a/configure
>> +++ b/configure
>> @@ -1900,7 +1900,6 @@ HWACCEL_AUTODETECT_LIBRARY_LIST="
>> videotoolbox
>> vulkan
>> v4l2_m2m
>> - xvmc
>> "
>>
>> # catchall list of things that require external libs to link
>> @@ -3006,7 +3005,6 @@ vaapi_x11_deps="xlib_x11"
>> videotoolbox_hwaccel_deps="videotoolbox pthreads"
>> videotoolbox_hwaccel_extralibs="-framework QuartzCore"
>> vulkan_deps_any="libdl LoadLibrary"
>> -xvmc_deps="X11_extensions_XvMClib_h"
>>
>> av1_d3d11va_hwaccel_deps="d3d11va DXVA_PicParams_AV1"
>> av1_d3d11va_hwaccel_select="av1_decoder"
>> @@ -3054,16 +3052,12 @@ mjpeg_nvdec_hwaccel_deps="nvdec"
>> mjpeg_nvdec_hwaccel_select="mjpeg_decoder"
>> mjpeg_vaapi_hwaccel_deps="vaapi"
>> mjpeg_vaapi_hwaccel_select="mjpeg_decoder"
>> -mpeg_xvmc_hwaccel_deps="xvmc"
>> -mpeg_xvmc_hwaccel_select="mpeg2video_decoder"
>> mpeg1_nvdec_hwaccel_deps="nvdec"
>> mpeg1_nvdec_hwaccel_select="mpeg1video_decoder"
>> mpeg1_vdpau_hwaccel_deps="vdpau"
>> mpeg1_vdpau_hwaccel_select="mpeg1video_decoder"
>> mpeg1_videotoolbox_hwaccel_deps="videotoolbox"
>> mpeg1_videotoolbox_hwaccel_select="mpeg1video_decoder"
>> -mpeg1_xvmc_hwaccel_deps="xvmc"
>> -mpeg1_xvmc_hwaccel_select="mpeg1video_decoder"
>> mpeg2_d3d11va_hwaccel_deps="d3d11va"
>> mpeg2_d3d11va_hwaccel_select="mpeg2video_decoder"
>> mpeg2_d3d11va2_hwaccel_deps="d3d11va"
>> @@ -3078,8 +3072,6 @@ mpeg2_vdpau_hwaccel_deps="vdpau"
>> mpeg2_vdpau_hwaccel_select="mpeg2video_decoder"
>> mpeg2_videotoolbox_hwaccel_deps="videotoolbox"
>> mpeg2_videotoolbox_hwaccel_select="mpeg2video_decoder"
>> -mpeg2_xvmc_hwaccel_deps="xvmc"
>> -mpeg2_xvmc_hwaccel_select="mpeg2video_decoder"
>> mpeg4_nvdec_hwaccel_deps="nvdec"
>> mpeg4_nvdec_hwaccel_select="mpeg4_decoder"
>> mpeg4_vaapi_hwaccel_deps="vaapi"
>> @@ -6320,7 +6312,6 @@ check_headers unistd.h
>> check_headers valgrind/valgrind.h
>> check_func_headers VideoToolbox/VTCompressionSession.h VTCompressionSessionPrepareToEncodeFrames -framework VideoToolbox
>> check_headers windows.h
>> -check_headers X11/extensions/XvMClib.h
>> check_headers asm/types.h
>>
>> # it seems there are versions of clang in some distros that try to use the
>> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
>> index cfc70a3eaf..6076b4ad80 100644
>> --- a/libavcodec/Makefile
>> +++ b/libavcodec/Makefile
>> @@ -963,7 +963,6 @@ OBJS-$(CONFIG_MJPEG_VAAPI_HWACCEL) += vaapi_mjpeg.o
>> OBJS-$(CONFIG_MPEG1_NVDEC_HWACCEL) += nvdec_mpeg12.o
>> OBJS-$(CONFIG_MPEG1_VDPAU_HWACCEL) += vdpau_mpeg12.o
>> OBJS-$(CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o
>> -OBJS-$(CONFIG_MPEG1_XVMC_HWACCEL) += mpegvideo_xvmc.o
>> OBJS-$(CONFIG_MPEG2_D3D11VA_HWACCEL) += dxva2_mpeg2.o
>> OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL) += dxva2_mpeg2.o
>> OBJS-$(CONFIG_MPEG2_NVDEC_HWACCEL) += nvdec_mpeg12.o
>> @@ -971,7 +970,6 @@ OBJS-$(CONFIG_MPEG2_QSV_HWACCEL) += qsvdec.o
>> OBJS-$(CONFIG_MPEG2_VAAPI_HWACCEL) += vaapi_mpeg2.o
>> OBJS-$(CONFIG_MPEG2_VDPAU_HWACCEL) += vdpau_mpeg12.o
>> OBJS-$(CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o
>> -OBJS-$(CONFIG_MPEG2_XVMC_HWACCEL) += mpegvideo_xvmc.o
>> OBJS-$(CONFIG_MPEG4_NVDEC_HWACCEL) += nvdec_mpeg4.o
>> OBJS-$(CONFIG_MPEG4_VAAPI_HWACCEL) += vaapi_mpeg4.o
>> OBJS-$(CONFIG_MPEG4_VDPAU_HWACCEL) += vdpau_mpeg4.o
>> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
>> index ec1a0566a4..acb7ae0e14 100644
>> --- a/libavcodec/avcodec.h
>> +++ b/libavcodec/avcodec.h
>> @@ -2119,7 +2119,6 @@ typedef struct AVHWAccel {
>> *
>> * Meaningful slice information (codec specific) is guaranteed to
>> * be parsed at this point. This function is mandatory.
>> - * The only exception is XvMC, that works on MB level.
>> *
>> * @param avctx the codec context
>> * @param buf the slice data buffer base
>> @@ -2148,17 +2147,6 @@ typedef struct AVHWAccel {
>> */
>> int frame_priv_data_size;
>>
>> - /**
>> - * Called for every Macroblock in a slice.
>> - *
>> - * XvMC uses it to replace the ff_mpv_reconstruct_mb().
>> - * Instead of decoding to raw picture, MB parameters are
>> - * stored in an array provided by the video driver.
>> - *
>> - * @param s the mpeg context
>> - */
>> - void (*decode_mb)(struct MpegEncContext *s);
>> -
>> /**
>> * Initialize the hwaccel private data.
>> *
>> diff --git a/libavcodec/error_resilience.c b/libavcodec/error_resilience.c
>> index 91cd8a4444..ce16cff1e9 100644
>> --- a/libavcodec/error_resilience.c
>> +++ b/libavcodec/error_resilience.c
>> @@ -736,12 +736,6 @@ static int is_intra_more_likely(ERContext *s)
>> if (undamaged_count < 5)
>> return 0; // almost all MBs damaged -> use temporal prediction
>>
>> - // prevent dsp.sad() check, that requires access to the image
>> - if (CONFIG_XVMC &&
>> - s->avctx->hwaccel && s->avctx->hwaccel->decode_mb &&
>> - s->cur_pic.f->pict_type == AV_PICTURE_TYPE_I)
>> - return 1;
>> -
>> skip_amount = FFMAX(undamaged_count / 50, 1); // check only up to 50 MBs
>> is_intra_likely = 0;
>>
>> @@ -1229,9 +1223,6 @@ void ff_er_frame_end(ERContext *s)
>> } else
>> guess_mv(s);
>>
>> - /* the filters below manipulate raw image, skip them */
>> - if (CONFIG_XVMC && s->avctx->hwaccel && s->avctx->hwaccel->decode_mb)
>> - goto ec_clean;
>> /* fill DC for inter blocks */
>> for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
>> for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
>> diff --git a/libavcodec/hwaccels.h b/libavcodec/hwaccels.h
>> index 1e7b464950..ff4daca0e2 100644
>> --- a/libavcodec/hwaccels.h
>> +++ b/libavcodec/hwaccels.h
>> @@ -47,7 +47,6 @@ extern const AVHWAccel ff_mjpeg_vaapi_hwaccel;
>> extern const AVHWAccel ff_mpeg1_nvdec_hwaccel;
>> extern const AVHWAccel ff_mpeg1_vdpau_hwaccel;
>> extern const AVHWAccel ff_mpeg1_videotoolbox_hwaccel;
>> -extern const AVHWAccel ff_mpeg1_xvmc_hwaccel;
>> extern const AVHWAccel ff_mpeg2_d3d11va_hwaccel;
>> extern const AVHWAccel ff_mpeg2_d3d11va2_hwaccel;
>> extern const AVHWAccel ff_mpeg2_nvdec_hwaccel;
>> @@ -55,7 +54,6 @@ extern const AVHWAccel ff_mpeg2_dxva2_hwaccel;
>> extern const AVHWAccel ff_mpeg2_vaapi_hwaccel;
>> extern const AVHWAccel ff_mpeg2_vdpau_hwaccel;
>> extern const AVHWAccel ff_mpeg2_videotoolbox_hwaccel;
>> -extern const AVHWAccel ff_mpeg2_xvmc_hwaccel;
>> extern const AVHWAccel ff_mpeg4_nvdec_hwaccel;
>> extern const AVHWAccel ff_mpeg4_vaapi_hwaccel;
>> extern const AVHWAccel ff_mpeg4_vdpau_hwaccel;
>> diff --git a/libavcodec/hwconfig.h b/libavcodec/hwconfig.h
>> index f421dc909f..721424912c 100644
>> --- a/libavcodec/hwconfig.h
>> +++ b/libavcodec/hwconfig.h
>> @@ -78,8 +78,6 @@ typedef struct AVCodecHWConfigInternal {
>> HW_CONFIG_HWACCEL(1, 1, 1, VIDEOTOOLBOX, VIDEOTOOLBOX, ff_ ## codec ## _videotoolbox_hwaccel)
>> #define HWACCEL_D3D11VA(codec) \
>> HW_CONFIG_HWACCEL(0, 0, 1, D3D11VA_VLD, NONE, ff_ ## codec ## _d3d11va_hwaccel)
>> -#define HWACCEL_XVMC(codec) \
>> - HW_CONFIG_HWACCEL(0, 0, 1, XVMC, NONE, ff_ ## codec ## _xvmc_hwaccel)
>>
>> #define HW_CONFIG_ENCODER(device, frames, ad_hoc, format, device_type_) \
>> &(const AVCodecHWConfigInternal) { \
>> diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c
>> index 4a7bd6d466..e0f8a2704f 100644
>> --- a/libavcodec/mpeg12dec.c
>> +++ b/libavcodec/mpeg12dec.c
>> @@ -50,7 +50,6 @@
>> #include "mpegvideodata.h"
>> #include "profiles.h"
>> #include "thread.h"
>> -#include "xvmc_internal.h"
>>
>> #define A53_MAX_CC_COUNT 2000
>>
>> @@ -762,9 +761,6 @@ static int mpeg_decode_mb(MpegEncContext *s, int16_t block[12][64])
>> memset(s->last_mv, 0, sizeof(s->last_mv));
>> }
>> s->mb_intra = 1;
>> - // if 1, we memcpy blocks in xvmcvideo
>> - if ((CONFIG_MPEG1_XVMC_HWACCEL || CONFIG_MPEG2_XVMC_HWACCEL) && s->pack_pblocks)
>> - ff_xvmc_pack_pblocks(s, -1); // inter are always full blocks
>>
>> if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
>> if (s->avctx->flags2 & AV_CODEC_FLAG2_FAST) {
>> @@ -993,10 +989,6 @@ static int mpeg_decode_mb(MpegEncContext *s, int16_t block[12][64])
>> return AVERROR_INVALIDDATA;
>> }
>>
>> - // if 1, we memcpy blocks in xvmcvideo
>> - if ((CONFIG_MPEG1_XVMC_HWACCEL || CONFIG_MPEG2_XVMC_HWACCEL) && s->pack_pblocks)
>> - ff_xvmc_pack_pblocks(s, cbp);
>> -
>> if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
>> if (s->avctx->flags2 & AV_CODEC_FLAG2_FAST) {
>> for (i = 0; i < 6; i++) {
>> @@ -1114,9 +1106,6 @@ static const enum AVPixelFormat mpeg1_hwaccel_pixfmt_list_420[] = {
>> #if CONFIG_MPEG1_NVDEC_HWACCEL
>> AV_PIX_FMT_CUDA,
>> #endif
>> -#if CONFIG_MPEG1_XVMC_HWACCEL
>> - AV_PIX_FMT_XVMC,
>> -#endif
>> #if CONFIG_MPEG1_VDPAU_HWACCEL
>> AV_PIX_FMT_VDPAU,
>> #endif
>> @@ -1128,9 +1117,6 @@ static const enum AVPixelFormat mpeg2_hwaccel_pixfmt_list_420[] = {
>> #if CONFIG_MPEG2_NVDEC_HWACCEL
>> AV_PIX_FMT_CUDA,
>> #endif
>> -#if CONFIG_MPEG2_XVMC_HWACCEL
>> - AV_PIX_FMT_XVMC,
>> -#endif
>> #if CONFIG_MPEG2_VDPAU_HWACCEL
>> AV_PIX_FMT_VDPAU,
>> #endif
>> @@ -1182,21 +1168,6 @@ static enum AVPixelFormat mpeg_get_pixelformat(AVCodecContext *avctx)
>> return ff_thread_get_format(avctx, pix_fmts);
>> }
>>
>> -static void setup_hwaccel_for_pixfmt(AVCodecContext *avctx)
>> -{
>> - // until then pix_fmt may be changed right after codec init
>> - if (avctx->hwaccel)
>> - if (avctx->idct_algo == FF_IDCT_AUTO)
>> - avctx->idct_algo = FF_IDCT_NONE;
>> -
>> - if (avctx->hwaccel && avctx->pix_fmt == AV_PIX_FMT_XVMC) {
>> - Mpeg1Context *s1 = avctx->priv_data;
>> - MpegEncContext *s = &s1->mpeg_enc_ctx;
>> -
>> - s->pack_pblocks = 1;
>> - }
>> -}
>> -
>> /* Call this function when we know all parameters.
>> * It may be called in different places for MPEG-1 and MPEG-2. */
>> static int mpeg_decode_postinit(AVCodecContext *avctx)
>> @@ -1320,7 +1291,6 @@ static int mpeg_decode_postinit(AVCodecContext *avctx)
>> } // MPEG-2
>>
>> avctx->pix_fmt = mpeg_get_pixelformat(avctx);
>> - setup_hwaccel_for_pixfmt(avctx);
>>
>> /* Quantization matrices may need reordering
>> * if DCT permutation is changed. */
>> @@ -1808,10 +1778,6 @@ static int mpeg_decode_slice(MpegEncContext *s, int mb_y,
>> }
>>
>> for (;;) {
>> - // If 1, we memcpy blocks in xvmcvideo.
>> - if ((CONFIG_MPEG1_XVMC_HWACCEL || CONFIG_MPEG2_XVMC_HWACCEL) && s->pack_pblocks)
>> - ff_xvmc_init_block(s); // set s->block
>> -
>> if ((ret = mpeg_decode_mb(s, s->block)) < 0)
>> return ret;
>>
>> @@ -2165,7 +2131,6 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx,
>> s->codec_id =
>> s->avctx->codec_id = AV_CODEC_ID_MPEG1VIDEO;
>> s->out_format = FMT_MPEG1;
>> - s->swap_uv = 0; // AFAIK VCR2 does not have SEQ_HEADER
>> if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY)
>> s->low_delay = 1;
>>
>> @@ -2194,7 +2159,6 @@ static int vcr2_init_sequence(AVCodecContext *avctx)
>> s->low_delay = 1;
>>
>> avctx->pix_fmt = mpeg_get_pixelformat(avctx);
>> - setup_hwaccel_for_pixfmt(avctx);
>>
>> ff_mpv_idct_init(s);
>> if ((ret = ff_mpv_common_init(s)) < 0)
>> @@ -2221,7 +2185,6 @@ static int vcr2_init_sequence(AVCodecContext *avctx)
>> if (s->codec_tag == AV_RL32("BW10")) {
>> s->codec_id = s->avctx->codec_id = AV_CODEC_ID_MPEG1VIDEO;
>> } else {
>> - s->swap_uv = 1; // in case of xvmc we need to swap uv for each MB
>> s->codec_id = s->avctx->codec_id = AV_CODEC_ID_MPEG2VIDEO;
>> }
>> s1->save_width = s->width;
>> @@ -2923,9 +2886,6 @@ const AVCodec ff_mpeg1video_decoder = {
>> #endif
>> #if CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL
>> HWACCEL_VIDEOTOOLBOX(mpeg1),
>> -#endif
>> -#if CONFIG_MPEG1_XVMC_HWACCEL
>> - HWACCEL_XVMC(mpeg1),
>> #endif
>> NULL
>> },
>> @@ -2971,9 +2931,6 @@ const AVCodec ff_mpeg2video_decoder = {
>> #endif
>> #if CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL
>> HWACCEL_VIDEOTOOLBOX(mpeg2),
>> -#endif
>> -#if CONFIG_MPEG2_XVMC_HWACCEL
>> - HWACCEL_XVMC(mpeg2),
>> #endif
>> NULL
>> },
>> diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
>> index bbcf00b014..30d84471d0 100644
>> --- a/libavcodec/mpegvideo.c
>> +++ b/libavcodec/mpegvideo.c
>> @@ -1644,12 +1644,6 @@ skip_idct:
>>
>> void ff_mpv_reconstruct_mb(MpegEncContext *s, int16_t block[12][64])
>> {
>> - if (CONFIG_XVMC &&
>> - s->avctx->hwaccel && s->avctx->hwaccel->decode_mb) {
>> - s->avctx->hwaccel->decode_mb(s); //xvmc uses pblocks
>> - return;
>> - }
>> -
>> if (s->avctx->debug & FF_DEBUG_DCT_COEFF) {
>> /* print DCT coefficients */
>> av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y);
>> diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
>> index 84d79d2e59..dfe1e72206 100644
>> --- a/libavcodec/mpegvideo.h
>> +++ b/libavcodec/mpegvideo.h
>> @@ -474,8 +474,6 @@ typedef struct MpegEncContext {
>> int rtp_payload_size;
>>
>> uint8_t *ptr_lastgob;
>> - int swap_uv; //vcr2 codec is an MPEG-2 variant with U and V swapped
>> - int pack_pblocks; //xvmc needs to keep blocks without gaps.
>> int16_t (*pblocks[12])[64];
>>
>> int16_t (*block)[64]; ///< points to one of the following blocks
>> diff --git a/libavcodec/mpegvideo_xvmc.c b/libavcodec/mpegvideo_xvmc.c
>> deleted file mode 100644
>> index f06583768c..0000000000
>> --- a/libavcodec/mpegvideo_xvmc.c
>> +++ /dev/null
>> @@ -1,376 +0,0 @@
>> -/*
>> - * XVideo Motion Compensation
>> - * Copyright (c) 2003 Ivan Kalvachev
>> - *
>> - * This file is part of FFmpeg.
>> - *
>> - * 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
>> - */
>> -
>> -#include <limits.h>
>> -#include <X11/extensions/XvMC.h>
>> -
>> -#include "avcodec.h"
>> -#include "mpegutils.h"
>> -#include "mpegvideo.h"
>> -
>> -#undef NDEBUG
>> -#include <assert.h>
>> -
>> -#include "xvmc.h"
>> -#include "xvmc_internal.h"
>> -#include "version.h"
>> -
>> -/**
>> - * 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
>> - * into the data_blocks array provided by xvmc.
>> - */
>> -void ff_xvmc_init_block(MpegEncContext *s)
>> -{
>> - 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 = (int16_t (*)[64])(render->data_blocks + render->next_free_data_block_num * 64);
>> -}
>> -
>> -static void exchange_uv(MpegEncContext *s)
>> -{
>> - int16_t (*tmp)[64];
>> -
>> - tmp = s->pblocks[4];
>> - s->pblocks[4] = s->pblocks[5];
>> - s->pblocks[5] = tmp;
>> -}
>> -
>> -/**
>> - * 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)
>> -{
>> - int i, j = 0;
>> - const int mb_block_count = 4 + (1 << s->chroma_format);
>> -
>> - cbp <<= 12-mb_block_count;
>> - for (i = 0; i < mb_block_count; i++) {
>> - if (cbp & (1 << 11))
>> - s->pblocks[i] = &s->block[j++];
>> - else
>> - s->pblocks[i] = NULL;
>> - cbp += cbp;
>> - }
>> - if (s->swap_uv) {
>> - exchange_uv(s);
>> - }
>> -}
>> -
>> -/**
>> - * 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.
>> - */
>> -static int ff_xvmc_field_start(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size)
>> -{
>> - struct MpegEncContext *s = avctx->priv_data;
>> - 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);
>> - if (!render || render->xvmc_id != AV_XVMC_ID ||
>> - !render->data_blocks || !render->mv_blocks ||
>> - (unsigned int)render->allocated_mv_blocks > INT_MAX/(64*6) ||
>> - (unsigned int)render->allocated_data_blocks > INT_MAX/64 ||
>> - !render->p_surface) {
>> - av_log(avctx, AV_LOG_ERROR,
>> - "Render token doesn't look as expected.\n");
>> - return -1; // make sure that this is a render packet
>> - }
>> -
>> - if (render->filled_mv_blocks_num) {
>> - av_log(avctx, AV_LOG_ERROR,
>> - "Rendering surface contains %i unprocessed blocks.\n",
>> - render->filled_mv_blocks_num);
>> - return -1;
>> - }
>> - if (render->allocated_mv_blocks < 1 ||
>> - render->allocated_data_blocks < render->allocated_mv_blocks*mb_block_count ||
>> - render->start_mv_blocks_num >= render->allocated_mv_blocks ||
>> - render->next_free_data_block_num >
>> - render->allocated_data_blocks -
>> - mb_block_count*(render->allocated_mv_blocks-render->start_mv_blocks_num)) {
>> - av_log(avctx, AV_LOG_ERROR,
>> - "Rendering surface doesn't provide enough block structures to work with.\n");
>> - return -1;
>> - }
>> -
>> - render->picture_structure = s->picture_structure;
>> - render->flags = s->first_field ? 0 : XVMC_SECOND_FIELD;
>> - render->p_future_surface = NULL;
>> - render->p_past_surface = NULL;
>> -
>> - switch(s->pict_type) {
>> - case AV_PICTURE_TYPE_I:
>> - return 0; // no prediction from other frames
>> - 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 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)
>> - return -1;
>> - render->p_past_surface = last->p_surface;
>> - return 0;
>> - }
>> -
>> -return -1;
>> -}
>> -
>> -/**
>> - * 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.
>> - */
>> -static int ff_xvmc_field_end(AVCodecContext *avctx)
>> -{
>> - struct MpegEncContext *s = avctx->priv_data;
>> - 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_mpeg_draw_horiz_band(s, 0, 0);
>> - return 0;
>> -}
>> -
>> -/**
>> - * Synthesize the data needed by XvMC to render one macroblock of data.
>> - * Fill all relevant fields, if necessary do IDCT.
>> - */
>> -static void ff_xvmc_decode_mb(struct MpegEncContext *s)
>> -{
>> - XvMCMacroBlock *mv_block;
>> - struct xvmc_pix_fmt *render;
>> - int i, cbp, blocks_per_mb;
>> -
>> - const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
>> -
>> -
>> - if (s->encoding) {
>> - av_log(s->avctx, AV_LOG_ERROR, "XVMC doesn't support encoding!!!\n");
>> - return;
>> - }
>> -
>> - // from ff_mpv_reconstruct_mb(), update DC predictors for P macroblocks
>> - if (!s->mb_intra) {
>> - s->last_dc[0] =
>> - s->last_dc[1] =
>> - s->last_dc[2] = 128 << s->intra_dc_precision;
>> - }
>> -
>> - // MC doesn't skip blocks
>> - s->mb_skipped = 0;
>> -
>> -
>> - // Do I need to export quant when I could not perform postprocessing?
>> - // Anyway, it doesn't hurt.
>> - s->current_picture.qscale_table[mb_xy] = s->qscale;
>> -
>> - // start of XVMC-specific code
>> - render = (struct xvmc_pix_fmt*)s->current_picture.f->data[2];
>> - assert(render);
>> - assert(render->xvmc_id == AV_XVMC_ID);
>> - assert(render->mv_blocks);
>> -
>> - // take the next free macroblock
>> - mv_block = &render->mv_blocks[render->start_mv_blocks_num +
>> - render->filled_mv_blocks_num];
>> -
>> - mv_block->x = s->mb_x;
>> - mv_block->y = s->mb_y;
>> - mv_block->dct_type = s->interlaced_dct; // XVMC_DCT_TYPE_FRAME/FIELD;
>> - if (s->mb_intra) {
>> - mv_block->macroblock_type = XVMC_MB_TYPE_INTRA; // no MC, all done
>> - } else {
>> - mv_block->macroblock_type = XVMC_MB_TYPE_PATTERN;
>> -
>> - if (s->mv_dir & MV_DIR_FORWARD) {
>> - mv_block->macroblock_type |= XVMC_MB_TYPE_MOTION_FORWARD;
>> - // PMV[n][dir][xy] = mv[dir][n][xy]
>> - mv_block->PMV[0][0][0] = s->mv[0][0][0];
>> - mv_block->PMV[0][0][1] = s->mv[0][0][1];
>> - mv_block->PMV[1][0][0] = s->mv[0][1][0];
>> - mv_block->PMV[1][0][1] = s->mv[0][1][1];
>> - }
>> - if (s->mv_dir & MV_DIR_BACKWARD) {
>> - mv_block->macroblock_type |= XVMC_MB_TYPE_MOTION_BACKWARD;
>> - mv_block->PMV[0][1][0] = s->mv[1][0][0];
>> - mv_block->PMV[0][1][1] = s->mv[1][0][1];
>> - mv_block->PMV[1][1][0] = s->mv[1][1][0];
>> - mv_block->PMV[1][1][1] = s->mv[1][1][1];
>> - }
>> -
>> - switch(s->mv_type) {
>> - case MV_TYPE_16X16:
>> - mv_block->motion_type = XVMC_PREDICTION_FRAME;
>> - break;
>> - case MV_TYPE_16X8:
>> - mv_block->motion_type = XVMC_PREDICTION_16x8;
>> - break;
>> - case MV_TYPE_FIELD:
>> - mv_block->motion_type = XVMC_PREDICTION_FIELD;
>> - if (s->picture_structure == PICT_FRAME) {
>> - mv_block->PMV[0][0][1] <<= 1;
>> - mv_block->PMV[1][0][1] <<= 1;
>> - mv_block->PMV[0][1][1] <<= 1;
>> - mv_block->PMV[1][1][1] <<= 1;
>> - }
>> - break;
>> - case MV_TYPE_DMV:
>> - mv_block->motion_type = XVMC_PREDICTION_DUAL_PRIME;
>> - if (s->picture_structure == PICT_FRAME) {
>> -
>> - mv_block->PMV[0][0][0] = s->mv[0][0][0]; // top from top
>> - mv_block->PMV[0][0][1] = s->mv[0][0][1] << 1;
>> -
>> - mv_block->PMV[0][1][0] = s->mv[0][0][0]; // bottom from bottom
>> - mv_block->PMV[0][1][1] = s->mv[0][0][1] << 1;
>> -
>> - mv_block->PMV[1][0][0] = s->mv[0][2][0]; // dmv00, top from bottom
>> - mv_block->PMV[1][0][1] = s->mv[0][2][1] << 1; // dmv01
>> -
>> - mv_block->PMV[1][1][0] = s->mv[0][3][0]; // dmv10, bottom from top
>> - mv_block->PMV[1][1][1] = s->mv[0][3][1] << 1; // dmv11
>> -
>> - } else {
>> - mv_block->PMV[0][1][0] = s->mv[0][2][0]; // dmv00
>> - mv_block->PMV[0][1][1] = s->mv[0][2][1]; // dmv01
>> - }
>> - break;
>> - default:
>> - assert(0);
>> - }
>> -
>> - mv_block->motion_vertical_field_select = 0;
>> -
>> - // set correct field references
>> - if (s->mv_type == MV_TYPE_FIELD || s->mv_type == MV_TYPE_16X8) {
>> - mv_block->motion_vertical_field_select |= s->field_select[0][0];
>> - mv_block->motion_vertical_field_select |= s->field_select[1][0] << 1;
>> - mv_block->motion_vertical_field_select |= s->field_select[0][1] << 2;
>> - mv_block->motion_vertical_field_select |= s->field_select[1][1] << 3;
>> - }
>> - } // !intra
>> - // time to handle data blocks
>> - mv_block->index = render->next_free_data_block_num;
>> -
>> - blocks_per_mb = 6;
>> - if (s->chroma_format >= 2) {
>> - blocks_per_mb = 4 + (1 << s->chroma_format);
>> - }
>> -
>> - // calculate cbp
>> - cbp = 0;
>> - for (i = 0; i < blocks_per_mb; i++) {
>> - cbp += cbp;
>> - if (s->block_last_index[i] >= 0)
>> - cbp++;
>> - }
>> -
>> - 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
>> - if (!render->unsigned_intra)
>> - *s->pblocks[i][0] = 1 << 10;
>> - }
>> - } else {
>> - cbp &= 0xf << (blocks_per_mb - 4);
>> - blocks_per_mb = 4; // luminance blocks only
>> - }
>> - }
>> - mv_block->coded_block_pattern = cbp;
>> - if (cbp == 0)
>> - mv_block->macroblock_type &= ~XVMC_MB_TYPE_PATTERN;
>> -
>> - 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->unsigned_intra))
>> - *s->pblocks[i][0] -= 1 << 10;
>> - if (!render->idct) {
>> - 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
>> - * slowdown. */
>> - }
>> - // copy blocks only if the codec doesn't support pblocks reordering
>> - if (!s->pack_pblocks) {
>> - memcpy(&render->data_blocks[render->next_free_data_block_num*64],
>> - s->pblocks[i], sizeof(*s->pblocks[i]));
>> - }
>> - render->next_free_data_block_num++;
>> - }
>> - }
>> - render->filled_mv_blocks_num++;
>> -
>> - assert(render->filled_mv_blocks_num <= render->allocated_mv_blocks);
>> - assert(render->next_free_data_block_num <= render->allocated_data_blocks);
>> - /* The above conditions should not be able to fail as long as this function
>> - * is used and the following 'if ()' automatically calls a callback to free
>> - * blocks. */
>> -
>> -
>> - if (render->filled_mv_blocks_num == render->allocated_mv_blocks)
>> - ff_mpeg_draw_horiz_band(s, 0, 0);
>> -}
>> -
>> -#if CONFIG_MPEG1_XVMC_HWACCEL
>> -const AVHWAccel ff_mpeg1_xvmc_hwaccel = {
>> - .name = "mpeg1_xvmc",
>> - .type = AVMEDIA_TYPE_VIDEO,
>> - .id = AV_CODEC_ID_MPEG1VIDEO,
>> - .pix_fmt = AV_PIX_FMT_XVMC,
>> - .start_frame = ff_xvmc_field_start,
>> - .end_frame = ff_xvmc_field_end,
>> - .decode_slice = NULL,
>> - .decode_mb = ff_xvmc_decode_mb,
>> - .priv_data_size = 0,
>> -};
>> -#endif
>> -
>> -#if CONFIG_MPEG2_XVMC_HWACCEL
>> -const AVHWAccel ff_mpeg2_xvmc_hwaccel = {
>> - .name = "mpeg2_xvmc",
>> - .type = AVMEDIA_TYPE_VIDEO,
>> - .id = AV_CODEC_ID_MPEG2VIDEO,
>> - .pix_fmt = AV_PIX_FMT_XVMC,
>> - .start_frame = ff_xvmc_field_start,
>> - .end_frame = ff_xvmc_field_end,
>> - .decode_slice = NULL,
>> - .decode_mb = ff_xvmc_decode_mb,
>> - .priv_data_size = 0,
>> -};
>> -#endif
>> diff --git a/libavcodec/x86/blockdsp_init.c b/libavcodec/x86/blockdsp_init.c
>> index 8b01a447cd..be3eef0021 100644
>> --- a/libavcodec/x86/blockdsp_init.c
>> +++ b/libavcodec/x86/blockdsp_init.c
>> @@ -44,10 +44,6 @@ av_cold void ff_blockdsp_init_x86(BlockDSPContext *c,
>> c->clear_blocks = ff_clear_blocks_mmx;
>> }
>>
>> - /* XvMCCreateBlocks() may not allocate 16-byte aligned blocks */
>> - if (CONFIG_XVMC && avctx->hwaccel && avctx->hwaccel->decode_mb)
>> - return;
>> -
>> if (EXTERNAL_SSE(cpu_flags)) {
>> c->clear_block = ff_clear_block_sse;
>> c->clear_blocks = ff_clear_blocks_sse;
>> diff --git a/libavcodec/xvmc_internal.h b/libavcodec/xvmc_internal.h
>> deleted file mode 100644
>> index d365ef0266..0000000000
>> --- a/libavcodec/xvmc_internal.h
>> +++ /dev/null
>> @@ -1,31 +0,0 @@
>> -/*
>> - * XVideo Motion Compensation internal functions
>> - *
>> - * This file is part of FFmpeg.
>> - *
>> - * 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
>> - */
>> -
>> -#ifndef AVCODEC_XVMC_INTERNAL_H
>> -#define AVCODEC_XVMC_INTERNAL_H
>> -
>> -#include "avcodec.h"
>> -#include "mpegvideo.h"
>> -#include "version.h"
>> -
>> -void ff_xvmc_init_block(MpegEncContext *s);
>> -void ff_xvmc_pack_pblocks(MpegEncContext *s, int cbp);
>> -
>> -#endif /* AVCODEC_XVMC_INTERNAL_H */
>
> I thought that removing components is only possible at a major version
> bump. Am I wrong?
We have removed components outside of major bump unstable periods
before. See the libdcadec wrapper.
This change for that matter needs a minor bump.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC hwaccel code
2022-02-07 1:53 ` James Almer
@ 2022-02-07 2:18 ` Soft Works
2022-02-08 9:36 ` Anton Khirnov
1 sibling, 0 replies; 15+ messages in thread
From: Soft Works @ 2022-02-07 2:18 UTC (permalink / raw)
To: FFmpeg development discussions and patches
> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of
> James Almer
> Sent: Monday, February 7, 2022 2:53 AM
> To: ffmpeg-devel@ffmpeg.org
> Subject: Re: [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC
> hwaccel code
>
> On 2/6/2022 10:46 PM, Andreas Rheinhardt wrote:
> > Anton Khirnov:
> >> XvMC was last relevant over 10 years ago, if ever. There is no
> reason to
> >> use it today.
> >> ---
> >> MAINTAINERS | 1 -
> >> configure | 9 -
> >> libavcodec/Makefile | 2 -
> >> libavcodec/avcodec.h | 12 --
> >> libavcodec/error_resilience.c | 9 -
> >> libavcodec/hwaccels.h | 2 -
> >> libavcodec/hwconfig.h | 2 -
> >> libavcodec/mpeg12dec.c | 43 ----
> >> libavcodec/mpegvideo.c | 6 -
> >> libavcodec/mpegvideo.h | 2 -
> >> libavcodec/mpegvideo_xvmc.c | 376 ----------------------------
> -----
> >> libavcodec/x86/blockdsp_init.c | 4 -
> >> libavcodec/xvmc_internal.h | 31 ---
> >> 13 files changed, 499 deletions(-)
> >> delete mode 100644 libavcodec/mpegvideo_xvmc.c
> >> delete mode 100644 libavcodec/xvmc_internal.h
> >>
> >> diff --git a/MAINTAINERS b/MAINTAINERS
> >> index c065e94498..f33ccbd1d9 100644
> >> --- a/MAINTAINERS
> >> +++ b/MAINTAINERS
> >> @@ -266,7 +266,6 @@ Codecs:
> >> xan.c Mike Melanson
> >> xbm* Paul B Mahol
> >> xface Stefano Sabatini
> >> - xvmc.c Ivan Kalvachev
> >> xwd* Paul B Mahol
> >>
> >> Hardware acceleration:
> >> diff --git a/configure b/configure
> >> index 5b19a35f59..6dbe108284 100755
> >> --- a/configure
> >> +++ b/configure
> >> @@ -1900,7 +1900,6 @@ HWACCEL_AUTODETECT_LIBRARY_LIST="
> >> videotoolbox
> >> vulkan
> >> v4l2_m2m
> >> - xvmc
> >> "
> >>
> >> # catchall list of things that require external libs to link
> >> @@ -3006,7 +3005,6 @@ vaapi_x11_deps="xlib_x11"
> >> videotoolbox_hwaccel_deps="videotoolbox pthreads"
> >> videotoolbox_hwaccel_extralibs="-framework QuartzCore"
> >> vulkan_deps_any="libdl LoadLibrary"
> >> -xvmc_deps="X11_extensions_XvMClib_h"
> >>
> >> av1_d3d11va_hwaccel_deps="d3d11va DXVA_PicParams_AV1"
> >> av1_d3d11va_hwaccel_select="av1_decoder"
> >> @@ -3054,16 +3052,12 @@ mjpeg_nvdec_hwaccel_deps="nvdec"
> >> mjpeg_nvdec_hwaccel_select="mjpeg_decoder"
> >> mjpeg_vaapi_hwaccel_deps="vaapi"
> >> mjpeg_vaapi_hwaccel_select="mjpeg_decoder"
> >> -mpeg_xvmc_hwaccel_deps="xvmc"
> >> -mpeg_xvmc_hwaccel_select="mpeg2video_decoder"
> >> mpeg1_nvdec_hwaccel_deps="nvdec"
> >> mpeg1_nvdec_hwaccel_select="mpeg1video_decoder"
> >> mpeg1_vdpau_hwaccel_deps="vdpau"
> >> mpeg1_vdpau_hwaccel_select="mpeg1video_decoder"
> >> mpeg1_videotoolbox_hwaccel_deps="videotoolbox"
> >> mpeg1_videotoolbox_hwaccel_select="mpeg1video_decoder"
> >> -mpeg1_xvmc_hwaccel_deps="xvmc"
> >> -mpeg1_xvmc_hwaccel_select="mpeg1video_decoder"
> >> mpeg2_d3d11va_hwaccel_deps="d3d11va"
> >> mpeg2_d3d11va_hwaccel_select="mpeg2video_decoder"
> >> mpeg2_d3d11va2_hwaccel_deps="d3d11va"
> >> @@ -3078,8 +3072,6 @@ mpeg2_vdpau_hwaccel_deps="vdpau"
> >> mpeg2_vdpau_hwaccel_select="mpeg2video_decoder"
> >> mpeg2_videotoolbox_hwaccel_deps="videotoolbox"
> >> mpeg2_videotoolbox_hwaccel_select="mpeg2video_decoder"
> >> -mpeg2_xvmc_hwaccel_deps="xvmc"
> >> -mpeg2_xvmc_hwaccel_select="mpeg2video_decoder"
> >> mpeg4_nvdec_hwaccel_deps="nvdec"
> >> mpeg4_nvdec_hwaccel_select="mpeg4_decoder"
> >> mpeg4_vaapi_hwaccel_deps="vaapi"
> >> @@ -6320,7 +6312,6 @@ check_headers unistd.h
> >> check_headers valgrind/valgrind.h
> >> check_func_headers VideoToolbox/VTCompressionSession.h
> VTCompressionSessionPrepareToEncodeFrames -framework VideoToolbox
> >> check_headers windows.h
> >> -check_headers X11/extensions/XvMClib.h
> >> check_headers asm/types.h
> >>
> >> # it seems there are versions of clang in some distros that try
> to use the
> >> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
> >> index cfc70a3eaf..6076b4ad80 100644
> >> --- a/libavcodec/Makefile
> >> +++ b/libavcodec/Makefile
> >> @@ -963,7 +963,6 @@ OBJS-$(CONFIG_MJPEG_VAAPI_HWACCEL) +=
> vaapi_mjpeg.o
> >> OBJS-$(CONFIG_MPEG1_NVDEC_HWACCEL) += nvdec_mpeg12.o
> >> OBJS-$(CONFIG_MPEG1_VDPAU_HWACCEL) += vdpau_mpeg12.o
> >> OBJS-$(CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o
> >> -OBJS-$(CONFIG_MPEG1_XVMC_HWACCEL) += mpegvideo_xvmc.o
> >> OBJS-$(CONFIG_MPEG2_D3D11VA_HWACCEL) += dxva2_mpeg2.o
> >> OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL) += dxva2_mpeg2.o
> >> OBJS-$(CONFIG_MPEG2_NVDEC_HWACCEL) += nvdec_mpeg12.o
> >> @@ -971,7 +970,6 @@ OBJS-$(CONFIG_MPEG2_QSV_HWACCEL) +=
> qsvdec.o
> >> OBJS-$(CONFIG_MPEG2_VAAPI_HWACCEL) += vaapi_mpeg2.o
> >> OBJS-$(CONFIG_MPEG2_VDPAU_HWACCEL) += vdpau_mpeg12.o
> >> OBJS-$(CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o
> >> -OBJS-$(CONFIG_MPEG2_XVMC_HWACCEL) += mpegvideo_xvmc.o
> >> OBJS-$(CONFIG_MPEG4_NVDEC_HWACCEL) += nvdec_mpeg4.o
> >> OBJS-$(CONFIG_MPEG4_VAAPI_HWACCEL) += vaapi_mpeg4.o
> >> OBJS-$(CONFIG_MPEG4_VDPAU_HWACCEL) += vdpau_mpeg4.o
> >> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> >> index ec1a0566a4..acb7ae0e14 100644
> >> --- a/libavcodec/avcodec.h
> >> +++ b/libavcodec/avcodec.h
> >> @@ -2119,7 +2119,6 @@ typedef struct AVHWAccel {
> >> *
> >> * Meaningful slice information (codec specific) is
> guaranteed to
> >> * be parsed at this point. This function is mandatory.
> >> - * The only exception is XvMC, that works on MB level.
> >> *
> >> * @param avctx the codec context
> >> * @param buf the slice data buffer base
> >> @@ -2148,17 +2147,6 @@ typedef struct AVHWAccel {
> >> */
> >> int frame_priv_data_size;
> >>
> >> - /**
> >> - * Called for every Macroblock in a slice.
> >> - *
> >> - * XvMC uses it to replace the ff_mpv_reconstruct_mb().
> >> - * Instead of decoding to raw picture, MB parameters are
> >> - * stored in an array provided by the video driver.
> >> - *
> >> - * @param s the mpeg context
> >> - */
> >> - void (*decode_mb)(struct MpegEncContext *s);
> >> -
> >> /**
> >> * Initialize the hwaccel private data.
> >> *
> >> diff --git a/libavcodec/error_resilience.c
> b/libavcodec/error_resilience.c
> >> index 91cd8a4444..ce16cff1e9 100644
> >> --- a/libavcodec/error_resilience.c
> >> +++ b/libavcodec/error_resilience.c
> >> @@ -736,12 +736,6 @@ static int is_intra_more_likely(ERContext *s)
> >> if (undamaged_count < 5)
> >> return 0; // almost all MBs damaged -> use temporal
> prediction
> >>
> >> - // prevent dsp.sad() check, that requires access to the image
> >> - if (CONFIG_XVMC &&
> >> - s->avctx->hwaccel && s->avctx->hwaccel->decode_mb &&
> >> - s->cur_pic.f->pict_type == AV_PICTURE_TYPE_I)
> >> - return 1;
> >> -
> >> skip_amount = FFMAX(undamaged_count / 50, 1); // check
> only up to 50 MBs
> >> is_intra_likely = 0;
> >>
> >> @@ -1229,9 +1223,6 @@ void ff_er_frame_end(ERContext *s)
> >> } else
> >> guess_mv(s);
> >>
> >> - /* the filters below manipulate raw image, skip them */
> >> - if (CONFIG_XVMC && s->avctx->hwaccel && s->avctx->hwaccel-
> >decode_mb)
> >> - goto ec_clean;
> >> /* fill DC for inter blocks */
> >> for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
> >> for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
> >> diff --git a/libavcodec/hwaccels.h b/libavcodec/hwaccels.h
> >> index 1e7b464950..ff4daca0e2 100644
> >> --- a/libavcodec/hwaccels.h
> >> +++ b/libavcodec/hwaccels.h
> >> @@ -47,7 +47,6 @@ extern const AVHWAccel ff_mjpeg_vaapi_hwaccel;
> >> extern const AVHWAccel ff_mpeg1_nvdec_hwaccel;
> >> extern const AVHWAccel ff_mpeg1_vdpau_hwaccel;
> >> extern const AVHWAccel ff_mpeg1_videotoolbox_hwaccel;
> >> -extern const AVHWAccel ff_mpeg1_xvmc_hwaccel;
> >> extern const AVHWAccel ff_mpeg2_d3d11va_hwaccel;
> >> extern const AVHWAccel ff_mpeg2_d3d11va2_hwaccel;
> >> extern const AVHWAccel ff_mpeg2_nvdec_hwaccel;
> >> @@ -55,7 +54,6 @@ extern const AVHWAccel ff_mpeg2_dxva2_hwaccel;
> >> extern const AVHWAccel ff_mpeg2_vaapi_hwaccel;
> >> extern const AVHWAccel ff_mpeg2_vdpau_hwaccel;
> >> extern const AVHWAccel ff_mpeg2_videotoolbox_hwaccel;
> >> -extern const AVHWAccel ff_mpeg2_xvmc_hwaccel;
> >> extern const AVHWAccel ff_mpeg4_nvdec_hwaccel;
> >> extern const AVHWAccel ff_mpeg4_vaapi_hwaccel;
> >> extern const AVHWAccel ff_mpeg4_vdpau_hwaccel;
> >> diff --git a/libavcodec/hwconfig.h b/libavcodec/hwconfig.h
> >> index f421dc909f..721424912c 100644
> >> --- a/libavcodec/hwconfig.h
> >> +++ b/libavcodec/hwconfig.h
> >> @@ -78,8 +78,6 @@ typedef struct AVCodecHWConfigInternal {
> >> HW_CONFIG_HWACCEL(1, 1, 1, VIDEOTOOLBOX, VIDEOTOOLBOX, ff_ ##
> codec ## _videotoolbox_hwaccel)
> >> #define HWACCEL_D3D11VA(codec) \
> >> HW_CONFIG_HWACCEL(0, 0, 1, D3D11VA_VLD, NONE, ff_ ##
> codec ## _d3d11va_hwaccel)
> >> -#define HWACCEL_XVMC(codec) \
> >> - HW_CONFIG_HWACCEL(0, 0, 1, XVMC, NONE, ff_ ##
> codec ## _xvmc_hwaccel)
> >>
> >> #define HW_CONFIG_ENCODER(device, frames, ad_hoc, format,
> device_type_) \
> >> &(const AVCodecHWConfigInternal) { \
> >> diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c
> >> index 4a7bd6d466..e0f8a2704f 100644
> >> --- a/libavcodec/mpeg12dec.c
> >> +++ b/libavcodec/mpeg12dec.c
> >> @@ -50,7 +50,6 @@
> >> #include "mpegvideodata.h"
> >> #include "profiles.h"
> >> #include "thread.h"
> >> -#include "xvmc_internal.h"
> >>
> >> #define A53_MAX_CC_COUNT 2000
> >>
> >> @@ -762,9 +761,6 @@ static int mpeg_decode_mb(MpegEncContext *s,
> int16_t block[12][64])
> >> memset(s->last_mv, 0, sizeof(s->last_mv));
> >> }
> >> s->mb_intra = 1;
> >> - // if 1, we memcpy blocks in xvmcvideo
> >> - if ((CONFIG_MPEG1_XVMC_HWACCEL ||
> CONFIG_MPEG2_XVMC_HWACCEL) && s->pack_pblocks)
> >> - ff_xvmc_pack_pblocks(s, -1); // inter are always full
> blocks
> >>
> >> if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
> >> if (s->avctx->flags2 & AV_CODEC_FLAG2_FAST) {
> >> @@ -993,10 +989,6 @@ static int mpeg_decode_mb(MpegEncContext *s,
> int16_t block[12][64])
> >> return AVERROR_INVALIDDATA;
> >> }
> >>
> >> - // if 1, we memcpy blocks in xvmcvideo
> >> - if ((CONFIG_MPEG1_XVMC_HWACCEL ||
> CONFIG_MPEG2_XVMC_HWACCEL) && s->pack_pblocks)
> >> - ff_xvmc_pack_pblocks(s, cbp);
> >> -
> >> if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
> >> if (s->avctx->flags2 & AV_CODEC_FLAG2_FAST) {
> >> for (i = 0; i < 6; i++) {
> >> @@ -1114,9 +1106,6 @@ static const enum AVPixelFormat
> mpeg1_hwaccel_pixfmt_list_420[] = {
> >> #if CONFIG_MPEG1_NVDEC_HWACCEL
> >> AV_PIX_FMT_CUDA,
> >> #endif
> >> -#if CONFIG_MPEG1_XVMC_HWACCEL
> >> - AV_PIX_FMT_XVMC,
> >> -#endif
> >> #if CONFIG_MPEG1_VDPAU_HWACCEL
> >> AV_PIX_FMT_VDPAU,
> >> #endif
> >> @@ -1128,9 +1117,6 @@ static const enum AVPixelFormat
> mpeg2_hwaccel_pixfmt_list_420[] = {
> >> #if CONFIG_MPEG2_NVDEC_HWACCEL
> >> AV_PIX_FMT_CUDA,
> >> #endif
> >> -#if CONFIG_MPEG2_XVMC_HWACCEL
> >> - AV_PIX_FMT_XVMC,
> >> -#endif
> >> #if CONFIG_MPEG2_VDPAU_HWACCEL
> >> AV_PIX_FMT_VDPAU,
> >> #endif
> >> @@ -1182,21 +1168,6 @@ static enum AVPixelFormat
> mpeg_get_pixelformat(AVCodecContext *avctx)
> >> return ff_thread_get_format(avctx, pix_fmts);
> >> }
> >>
> >> -static void setup_hwaccel_for_pixfmt(AVCodecContext *avctx)
> >> -{
> >> - // until then pix_fmt may be changed right after codec init
> >> - if (avctx->hwaccel)
> >> - if (avctx->idct_algo == FF_IDCT_AUTO)
> >> - avctx->idct_algo = FF_IDCT_NONE;
> >> -
> >> - if (avctx->hwaccel && avctx->pix_fmt == AV_PIX_FMT_XVMC) {
> >> - Mpeg1Context *s1 = avctx->priv_data;
> >> - MpegEncContext *s = &s1->mpeg_enc_ctx;
> >> -
> >> - s->pack_pblocks = 1;
> >> - }
> >> -}
> >> -
> >> /* Call this function when we know all parameters.
> >> * It may be called in different places for MPEG-1 and MPEG-2. */
> >> static int mpeg_decode_postinit(AVCodecContext *avctx)
> >> @@ -1320,7 +1291,6 @@ static int
> mpeg_decode_postinit(AVCodecContext *avctx)
> >> } // MPEG-2
> >>
> >> avctx->pix_fmt = mpeg_get_pixelformat(avctx);
> >> - setup_hwaccel_for_pixfmt(avctx);
> >>
> >> /* Quantization matrices may need reordering
> >> * if DCT permutation is changed. */
> >> @@ -1808,10 +1778,6 @@ static int mpeg_decode_slice(MpegEncContext
> *s, int mb_y,
> >> }
> >>
> >> for (;;) {
> >> - // If 1, we memcpy blocks in xvmcvideo.
> >> - if ((CONFIG_MPEG1_XVMC_HWACCEL ||
> CONFIG_MPEG2_XVMC_HWACCEL) && s->pack_pblocks)
> >> - ff_xvmc_init_block(s); // set s->block
> >> -
> >> if ((ret = mpeg_decode_mb(s, s->block)) < 0)
> >> return ret;
> >>
> >> @@ -2165,7 +2131,6 @@ static int
> mpeg1_decode_sequence(AVCodecContext *avctx,
> >> s->codec_id =
> >> s->avctx->codec_id = AV_CODEC_ID_MPEG1VIDEO;
> >> s->out_format = FMT_MPEG1;
> >> - s->swap_uv = 0; // AFAIK VCR2 does not have
> SEQ_HEADER
> >> if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY)
> >> s->low_delay = 1;
> >>
> >> @@ -2194,7 +2159,6 @@ static int vcr2_init_sequence(AVCodecContext
> *avctx)
> >> s->low_delay = 1;
> >>
> >> avctx->pix_fmt = mpeg_get_pixelformat(avctx);
> >> - setup_hwaccel_for_pixfmt(avctx);
> >>
> >> ff_mpv_idct_init(s);
> >> if ((ret = ff_mpv_common_init(s)) < 0)
> >> @@ -2221,7 +2185,6 @@ static int vcr2_init_sequence(AVCodecContext
> *avctx)
> >> if (s->codec_tag == AV_RL32("BW10")) {
> >> s->codec_id = s->avctx->codec_id =
> AV_CODEC_ID_MPEG1VIDEO;
> >> } else {
> >> - s->swap_uv = 1; // in case of xvmc we need to swap uv for
> each MB
> >> s->codec_id = s->avctx->codec_id =
> AV_CODEC_ID_MPEG2VIDEO;
> >> }
> >> s1->save_width = s->width;
> >> @@ -2923,9 +2886,6 @@ const AVCodec ff_mpeg1video_decoder = {
> >> #endif
> >> #if CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL
> >> HWACCEL_VIDEOTOOLBOX(mpeg1),
> >> -#endif
> >> -#if CONFIG_MPEG1_XVMC_HWACCEL
> >> - HWACCEL_XVMC(mpeg1),
> >> #endif
> >> NULL
> >> },
> >> @@ -2971,9 +2931,6 @@ const AVCodec ff_mpeg2video_decoder = {
> >> #endif
> >> #if CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL
> >> HWACCEL_VIDEOTOOLBOX(mpeg2),
> >> -#endif
> >> -#if CONFIG_MPEG2_XVMC_HWACCEL
> >> - HWACCEL_XVMC(mpeg2),
> >> #endif
> >> NULL
> >> },
> >> diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
> >> index bbcf00b014..30d84471d0 100644
> >> --- a/libavcodec/mpegvideo.c
> >> +++ b/libavcodec/mpegvideo.c
> >> @@ -1644,12 +1644,6 @@ skip_idct:
> >>
> >> void ff_mpv_reconstruct_mb(MpegEncContext *s, int16_t
> block[12][64])
> >> {
> >> - if (CONFIG_XVMC &&
> >> - s->avctx->hwaccel && s->avctx->hwaccel->decode_mb) {
> >> - s->avctx->hwaccel->decode_mb(s); //xvmc uses pblocks
> >> - return;
> >> - }
> >> -
> >> if (s->avctx->debug & FF_DEBUG_DCT_COEFF) {
> >> /* print DCT coefficients */
> >> av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at
> %dx%d:\n", s->mb_x, s->mb_y);
> >> diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
> >> index 84d79d2e59..dfe1e72206 100644
> >> --- a/libavcodec/mpegvideo.h
> >> +++ b/libavcodec/mpegvideo.h
> >> @@ -474,8 +474,6 @@ typedef struct MpegEncContext {
> >> int rtp_payload_size;
> >>
> >> uint8_t *ptr_lastgob;
> >> - int swap_uv; //vcr2 codec is an MPEG-2 variant
> with U and V swapped
> >> - int pack_pblocks; //xvmc needs to keep blocks without
> gaps.
> >> int16_t (*pblocks[12])[64];
> >>
> >> int16_t (*block)[64]; ///< points to one of the following
> blocks
> >> diff --git a/libavcodec/mpegvideo_xvmc.c
> b/libavcodec/mpegvideo_xvmc.c
> >> deleted file mode 100644
> >> index f06583768c..0000000000
> >> --- a/libavcodec/mpegvideo_xvmc.c
> >> +++ /dev/null
> >> @@ -1,376 +0,0 @@
> >> -/*
> >> - * XVideo Motion Compensation
> >> - * Copyright (c) 2003 Ivan Kalvachev
> >> - *
> >> - * This file is part of FFmpeg.
> >> - *
> >> - * 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
> >> - */
> >> -
> >> -#include <limits.h>
> >> -#include <X11/extensions/XvMC.h>
> >> -
> >> -#include "avcodec.h"
> >> -#include "mpegutils.h"
> >> -#include "mpegvideo.h"
> >> -
> >> -#undef NDEBUG
> >> -#include <assert.h>
> >> -
> >> -#include "xvmc.h"
> >> -#include "xvmc_internal.h"
> >> -#include "version.h"
> >> -
> >> -/**
> >> - * 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
> >> - * into the data_blocks array provided by xvmc.
> >> - */
> >> -void ff_xvmc_init_block(MpegEncContext *s)
> >> -{
> >> - 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 = (int16_t (*)[64])(render->data_blocks + render-
> >next_free_data_block_num * 64);
> >> -}
> >> -
> >> -static void exchange_uv(MpegEncContext *s)
> >> -{
> >> - int16_t (*tmp)[64];
> >> -
> >> - tmp = s->pblocks[4];
> >> - s->pblocks[4] = s->pblocks[5];
> >> - s->pblocks[5] = tmp;
> >> -}
> >> -
> >> -/**
> >> - * 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)
> >> -{
> >> - int i, j = 0;
> >> - const int mb_block_count = 4 + (1 << s->chroma_format);
> >> -
> >> - cbp <<= 12-mb_block_count;
> >> - for (i = 0; i < mb_block_count; i++) {
> >> - if (cbp & (1 << 11))
> >> - s->pblocks[i] = &s->block[j++];
> >> - else
> >> - s->pblocks[i] = NULL;
> >> - cbp += cbp;
> >> - }
> >> - if (s->swap_uv) {
> >> - exchange_uv(s);
> >> - }
> >> -}
> >> -
> >> -/**
> >> - * 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.
> >> - */
> >> -static int ff_xvmc_field_start(AVCodecContext *avctx, const
> uint8_t *buf, uint32_t buf_size)
> >> -{
> >> - struct MpegEncContext *s = avctx->priv_data;
> >> - 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);
> >> - if (!render || render->xvmc_id != AV_XVMC_ID ||
> >> - !render->data_blocks || !render->mv_blocks ||
> >> - (unsigned int)render->allocated_mv_blocks >
> INT_MAX/(64*6) ||
> >> - (unsigned int)render->allocated_data_blocks > INT_MAX/64
> ||
> >> - !render->p_surface) {
> >> - av_log(avctx, AV_LOG_ERROR,
> >> - "Render token doesn't look as expected.\n");
> >> - return -1; // make sure that this is a render packet
> >> - }
> >> -
> >> - if (render->filled_mv_blocks_num) {
> >> - av_log(avctx, AV_LOG_ERROR,
> >> - "Rendering surface contains %i unprocessed
> blocks.\n",
> >> - render->filled_mv_blocks_num);
> >> - return -1;
> >> - }
> >> - if (render->allocated_mv_blocks < 1 ||
> >> - render->allocated_data_blocks < render-
> >allocated_mv_blocks*mb_block_count ||
> >> - render->start_mv_blocks_num >= render-
> >allocated_mv_blocks ||
> >> - render->next_free_data_block_num >
> >> - render->allocated_data_blocks -
> >> - mb_block_count*(render-
> >allocated_mv_blocks-render->start_mv_blocks_num)) {
> >> - av_log(avctx, AV_LOG_ERROR,
> >> - "Rendering surface doesn't provide enough block
> structures to work with.\n");
> >> - return -1;
> >> - }
> >> -
> >> - render->picture_structure = s->picture_structure;
> >> - render->flags = s->first_field ? 0 :
> XVMC_SECOND_FIELD;
> >> - render->p_future_surface = NULL;
> >> - render->p_past_surface = NULL;
> >> -
> >> - switch(s->pict_type) {
> >> - case AV_PICTURE_TYPE_I:
> >> - return 0; // no prediction from other frames
> >> - 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 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)
> >> - return -1;
> >> - render->p_past_surface = last->p_surface;
> >> - return 0;
> >> - }
> >> -
> >> -return -1;
> >> -}
> >> -
> >> -/**
> >> - * 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.
> >> - */
> >> -static int ff_xvmc_field_end(AVCodecContext *avctx)
> >> -{
> >> - struct MpegEncContext *s = avctx->priv_data;
> >> - 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_mpeg_draw_horiz_band(s, 0, 0);
> >> - return 0;
> >> -}
> >> -
> >> -/**
> >> - * Synthesize the data needed by XvMC to render one macroblock of
> data.
> >> - * Fill all relevant fields, if necessary do IDCT.
> >> - */
> >> -static void ff_xvmc_decode_mb(struct MpegEncContext *s)
> >> -{
> >> - XvMCMacroBlock *mv_block;
> >> - struct xvmc_pix_fmt *render;
> >> - int i, cbp, blocks_per_mb;
> >> -
> >> - const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
> >> -
> >> -
> >> - if (s->encoding) {
> >> - av_log(s->avctx, AV_LOG_ERROR, "XVMC doesn't support
> encoding!!!\n");
> >> - return;
> >> - }
> >> -
> >> - // from ff_mpv_reconstruct_mb(), update DC predictors for P
> macroblocks
> >> - if (!s->mb_intra) {
> >> - s->last_dc[0] =
> >> - s->last_dc[1] =
> >> - s->last_dc[2] = 128 << s->intra_dc_precision;
> >> - }
> >> -
> >> - // MC doesn't skip blocks
> >> - s->mb_skipped = 0;
> >> -
> >> -
> >> - // Do I need to export quant when I could not perform
> postprocessing?
> >> - // Anyway, it doesn't hurt.
> >> - s->current_picture.qscale_table[mb_xy] = s->qscale;
> >> -
> >> - // start of XVMC-specific code
> >> - render = (struct xvmc_pix_fmt*)s->current_picture.f->data[2];
> >> - assert(render);
> >> - assert(render->xvmc_id == AV_XVMC_ID);
> >> - assert(render->mv_blocks);
> >> -
> >> - // take the next free macroblock
> >> - mv_block = &render->mv_blocks[render->start_mv_blocks_num +
> >> - render->filled_mv_blocks_num];
> >> -
> >> - mv_block->x = s->mb_x;
> >> - mv_block->y = s->mb_y;
> >> - mv_block->dct_type = s->interlaced_dct; //
> XVMC_DCT_TYPE_FRAME/FIELD;
> >> - if (s->mb_intra) {
> >> - mv_block->macroblock_type = XVMC_MB_TYPE_INTRA; // no MC,
> all done
> >> - } else {
> >> - mv_block->macroblock_type = XVMC_MB_TYPE_PATTERN;
> >> -
> >> - if (s->mv_dir & MV_DIR_FORWARD) {
> >> - mv_block->macroblock_type |=
> XVMC_MB_TYPE_MOTION_FORWARD;
> >> - // PMV[n][dir][xy] = mv[dir][n][xy]
> >> - mv_block->PMV[0][0][0] = s->mv[0][0][0];
> >> - mv_block->PMV[0][0][1] = s->mv[0][0][1];
> >> - mv_block->PMV[1][0][0] = s->mv[0][1][0];
> >> - mv_block->PMV[1][0][1] = s->mv[0][1][1];
> >> - }
> >> - if (s->mv_dir & MV_DIR_BACKWARD) {
> >> - mv_block->macroblock_type |=
> XVMC_MB_TYPE_MOTION_BACKWARD;
> >> - mv_block->PMV[0][1][0] = s->mv[1][0][0];
> >> - mv_block->PMV[0][1][1] = s->mv[1][0][1];
> >> - mv_block->PMV[1][1][0] = s->mv[1][1][0];
> >> - mv_block->PMV[1][1][1] = s->mv[1][1][1];
> >> - }
> >> -
> >> - switch(s->mv_type) {
> >> - case MV_TYPE_16X16:
> >> - mv_block->motion_type = XVMC_PREDICTION_FRAME;
> >> - break;
> >> - case MV_TYPE_16X8:
> >> - mv_block->motion_type = XVMC_PREDICTION_16x8;
> >> - break;
> >> - case MV_TYPE_FIELD:
> >> - mv_block->motion_type = XVMC_PREDICTION_FIELD;
> >> - if (s->picture_structure == PICT_FRAME) {
> >> - mv_block->PMV[0][0][1] <<= 1;
> >> - mv_block->PMV[1][0][1] <<= 1;
> >> - mv_block->PMV[0][1][1] <<= 1;
> >> - mv_block->PMV[1][1][1] <<= 1;
> >> - }
> >> - break;
> >> - case MV_TYPE_DMV:
> >> - mv_block->motion_type =
> XVMC_PREDICTION_DUAL_PRIME;
> >> - if (s->picture_structure == PICT_FRAME) {
> >> -
> >> - mv_block->PMV[0][0][0] = s->mv[0][0][0];
> // top from top
> >> - mv_block->PMV[0][0][1] = s->mv[0][0][1] << 1;
> >> -
> >> - mv_block->PMV[0][1][0] = s->mv[0][0][0];
> // bottom from bottom
> >> - mv_block->PMV[0][1][1] = s->mv[0][0][1] << 1;
> >> -
> >> - mv_block->PMV[1][0][0] = s->mv[0][2][0];
> // dmv00, top from bottom
> >> - mv_block->PMV[1][0][1] = s->mv[0][2][1] << 1;
> // dmv01
> >> -
> >> - mv_block->PMV[1][1][0] = s->mv[0][3][0];
> // dmv10, bottom from top
> >> - mv_block->PMV[1][1][1] = s->mv[0][3][1] << 1;
> // dmv11
> >> -
> >> - } else {
> >> - mv_block->PMV[0][1][0] = s->mv[0][2][0];
> // dmv00
> >> - mv_block->PMV[0][1][1] = s->mv[0][2][1];
> // dmv01
> >> - }
> >> - break;
> >> - default:
> >> - assert(0);
> >> - }
> >> -
> >> - mv_block->motion_vertical_field_select = 0;
> >> -
> >> - // set correct field references
> >> - if (s->mv_type == MV_TYPE_FIELD || s->mv_type ==
> MV_TYPE_16X8) {
> >> - mv_block->motion_vertical_field_select |= s-
> >field_select[0][0];
> >> - mv_block->motion_vertical_field_select |= s-
> >field_select[1][0] << 1;
> >> - mv_block->motion_vertical_field_select |= s-
> >field_select[0][1] << 2;
> >> - mv_block->motion_vertical_field_select |= s-
> >field_select[1][1] << 3;
> >> - }
> >> - } // !intra
> >> - // time to handle data blocks
> >> - mv_block->index = render->next_free_data_block_num;
> >> -
> >> - blocks_per_mb = 6;
> >> - if (s->chroma_format >= 2) {
> >> - blocks_per_mb = 4 + (1 << s->chroma_format);
> >> - }
> >> -
> >> - // calculate cbp
> >> - cbp = 0;
> >> - for (i = 0; i < blocks_per_mb; i++) {
> >> - cbp += cbp;
> >> - if (s->block_last_index[i] >= 0)
> >> - cbp++;
> >> - }
> >> -
> >> - 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
> >> - if (!render->unsigned_intra)
> >> - *s->pblocks[i][0] = 1 << 10;
> >> - }
> >> - } else {
> >> - cbp &= 0xf << (blocks_per_mb - 4);
> >> - blocks_per_mb = 4; //
> luminance blocks only
> >> - }
> >> - }
> >> - mv_block->coded_block_pattern = cbp;
> >> - if (cbp == 0)
> >> - mv_block->macroblock_type &= ~XVMC_MB_TYPE_PATTERN;
> >> -
> >> - 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-
> >unsigned_intra))
> >> - *s->pblocks[i][0] -= 1 << 10;
> >> - if (!render->idct) {
> >> - 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
> >> - * slowdown. */
> >> - }
> >> - // copy blocks only if the codec doesn't support
> pblocks reordering
> >> - if (!s->pack_pblocks) {
> >> - memcpy(&render->data_blocks[render-
> >next_free_data_block_num*64],
> >> - s->pblocks[i], sizeof(*s->pblocks[i]));
> >> - }
> >> - render->next_free_data_block_num++;
> >> - }
> >> - }
> >> - render->filled_mv_blocks_num++;
> >> -
> >> - assert(render->filled_mv_blocks_num <= render-
> >allocated_mv_blocks);
> >> - assert(render->next_free_data_block_num <= render-
> >allocated_data_blocks);
> >> - /* The above conditions should not be able to fail as long as
> this function
> >> - * is used and the following 'if ()' automatically calls a
> callback to free
> >> - * blocks. */
> >> -
> >> -
> >> - if (render->filled_mv_blocks_num == render-
> >allocated_mv_blocks)
> >> - ff_mpeg_draw_horiz_band(s, 0, 0);
> >> -}
> >> -
> >> -#if CONFIG_MPEG1_XVMC_HWACCEL
> >> -const AVHWAccel ff_mpeg1_xvmc_hwaccel = {
> >> - .name = "mpeg1_xvmc",
> >> - .type = AVMEDIA_TYPE_VIDEO,
> >> - .id = AV_CODEC_ID_MPEG1VIDEO,
> >> - .pix_fmt = AV_PIX_FMT_XVMC,
> >> - .start_frame = ff_xvmc_field_start,
> >> - .end_frame = ff_xvmc_field_end,
> >> - .decode_slice = NULL,
> >> - .decode_mb = ff_xvmc_decode_mb,
> >> - .priv_data_size = 0,
> >> -};
> >> -#endif
> >> -
> >> -#if CONFIG_MPEG2_XVMC_HWACCEL
> >> -const AVHWAccel ff_mpeg2_xvmc_hwaccel = {
> >> - .name = "mpeg2_xvmc",
> >> - .type = AVMEDIA_TYPE_VIDEO,
> >> - .id = AV_CODEC_ID_MPEG2VIDEO,
> >> - .pix_fmt = AV_PIX_FMT_XVMC,
> >> - .start_frame = ff_xvmc_field_start,
> >> - .end_frame = ff_xvmc_field_end,
> >> - .decode_slice = NULL,
> >> - .decode_mb = ff_xvmc_decode_mb,
> >> - .priv_data_size = 0,
> >> -};
> >> -#endif
> >> diff --git a/libavcodec/x86/blockdsp_init.c
> b/libavcodec/x86/blockdsp_init.c
> >> index 8b01a447cd..be3eef0021 100644
> >> --- a/libavcodec/x86/blockdsp_init.c
> >> +++ b/libavcodec/x86/blockdsp_init.c
> >> @@ -44,10 +44,6 @@ av_cold void
> ff_blockdsp_init_x86(BlockDSPContext *c,
> >> c->clear_blocks = ff_clear_blocks_mmx;
> >> }
> >>
> >> - /* XvMCCreateBlocks() may not allocate 16-byte aligned blocks
> */
> >> - if (CONFIG_XVMC && avctx->hwaccel && avctx->hwaccel-
> >decode_mb)
> >> - return;
> >> -
> >> if (EXTERNAL_SSE(cpu_flags)) {
> >> c->clear_block = ff_clear_block_sse;
> >> c->clear_blocks = ff_clear_blocks_sse;
> >> diff --git a/libavcodec/xvmc_internal.h
> b/libavcodec/xvmc_internal.h
> >> deleted file mode 100644
> >> index d365ef0266..0000000000
> >> --- a/libavcodec/xvmc_internal.h
> >> +++ /dev/null
> >> @@ -1,31 +0,0 @@
> >> -/*
> >> - * XVideo Motion Compensation internal functions
> >> - *
> >> - * This file is part of FFmpeg.
> >> - *
> >> - * 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
> >> - */
> >> -
> >> -#ifndef AVCODEC_XVMC_INTERNAL_H
> >> -#define AVCODEC_XVMC_INTERNAL_H
> >> -
> >> -#include "avcodec.h"
> >> -#include "mpegvideo.h"
> >> -#include "version.h"
> >> -
> >> -void ff_xvmc_init_block(MpegEncContext *s);
> >> -void ff_xvmc_pack_pblocks(MpegEncContext *s, int cbp);
> >> -
> >> -#endif /* AVCODEC_XVMC_INTERNAL_H */
> >
> > I thought that removing components is only possible at a major
> version
> > bump. Am I wrong?
>
> We have removed components outside of major bump unstable periods
> before. See the libdcadec wrapper.
>
> This change for that matter needs a minor bump.
I sometimes wonder whether there exists a single API user who
really understands this (very special) kind of logic and
would make decisions based on that understanding.
When it's not even fully understood internally, how should it
be understood externally?
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC hwaccel code
2022-02-07 1:53 ` James Almer
2022-02-07 2:18 ` Soft Works
@ 2022-02-08 9:36 ` Anton Khirnov
2022-02-08 21:34 ` Soft Works
2022-02-09 5:49 ` Anton Khirnov
1 sibling, 2 replies; 15+ messages in thread
From: Anton Khirnov @ 2022-02-08 9:36 UTC (permalink / raw)
To: FFmpeg development discussions and patches
Quoting Soft Works (2022-02-07 03:18:54)
> I sometimes wonder whether there exists a single API user who
> really understands this (very special) kind of logic and
> would make decisions based on that understanding.
>
> When it's not even fully understood internally, how should it
> be understood externally?
The rule for API users is simple: you are not allowed to assume a
specific component (like a decoder, demuxer or hwaccel) will be
available at runtime*. You are supposed to check for it using the APIs
provided for this purpose. In this case, AV_PIX_FMT_XVMC will just stop
being offered in get_format().
Not to mention that I very much doubt there are any users of xvmc left,
besides the original mplayer.
* unless you are running with a very specific verified build, in which
case a removal like this should be caught at the build stage
--
Anton Khirnov
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC hwaccel code
2022-02-08 9:36 ` Anton Khirnov
@ 2022-02-08 21:34 ` Soft Works
2022-02-09 5:49 ` Anton Khirnov
1 sibling, 0 replies; 15+ messages in thread
From: Soft Works @ 2022-02-08 21:34 UTC (permalink / raw)
To: FFmpeg development discussions and patches
> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of
> Anton Khirnov
> Sent: Tuesday, February 8, 2022 10:37 AM
> To: FFmpeg development discussions and patches <ffmpeg-
> devel@ffmpeg.org>
> Subject: Re: [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC
> hwaccel code
>
> Quoting Soft Works (2022-02-07 03:18:54)
> > I sometimes wonder whether there exists a single API user who
> > really understands this (very special) kind of logic and
> > would make decisions based on that understanding.
> >
> > When it's not even fully understood internally, how should it
> > be understood externally?
>
> The rule for API users is simple: you are not allowed to assume a
> specific component (like a decoder, demuxer or hwaccel) will be
> available at runtime*. You are supposed to check for it using the APIs
> provided for this purpose. In this case, AV_PIX_FMT_XVMC will just
> stop
> being offered in get_format().
>
> Not to mention that I very much doubt there are any users of xvmc
> left,
> besides the original mplayer.
>
> * unless you are running with a very specific verified build, in which
> case a removal like this should be caught at the build stage
Thanks for the explanation. I misunderstood this a bit - when the
only effect of the "removal" is an output like when the libs wouldn't
have been compiled with that part, then that's maybe nothing to
be blamed for.
On the other side: when somebody is using it and updates the libs
to a point where it's missing, it will be broken for her/him.
So the outcome might not be _that_ different for any other breaking
changes being made. And that's what I meant to point out:
On one side, we are carefully curating those versioning changes
(individually for each lib!) with a complex set of rules and
considerations to be made, while in the majority of cases I tend
to believe that not many really care that much about it, instead
sitting there, happily using it until the moment "Oh it's broken -
- need to do something - fix it and go on.." :-)
softworkz
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC hwaccel code
2022-02-08 9:36 ` Anton Khirnov
2022-02-08 21:34 ` Soft Works
@ 2022-02-09 5:49 ` Anton Khirnov
2022-02-09 6:19 ` Soft Works
2022-02-09 6:38 ` Anton Khirnov
1 sibling, 2 replies; 15+ messages in thread
From: Anton Khirnov @ 2022-02-09 5:49 UTC (permalink / raw)
To: FFmpeg development discussions and patches
Quoting Soft Works (2022-02-08 22:34:42)
>
>
> > -----Original Message-----
> > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of
> > Anton Khirnov
> > Sent: Tuesday, February 8, 2022 10:37 AM
> > To: FFmpeg development discussions and patches <ffmpeg-
> > devel@ffmpeg.org>
> > Subject: Re: [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC
> > hwaccel code
> >
> > Quoting Soft Works (2022-02-07 03:18:54)
> > > I sometimes wonder whether there exists a single API user who
> > > really understands this (very special) kind of logic and
> > > would make decisions based on that understanding.
> > >
> > > When it's not even fully understood internally, how should it
> > > be understood externally?
> >
> > The rule for API users is simple: you are not allowed to assume a
> > specific component (like a decoder, demuxer or hwaccel) will be
> > available at runtime*. You are supposed to check for it using the APIs
> > provided for this purpose. In this case, AV_PIX_FMT_XVMC will just
> > stop
> > being offered in get_format().
> >
> > Not to mention that I very much doubt there are any users of xvmc
> > left,
> > besides the original mplayer.
> >
> > * unless you are running with a very specific verified build, in which
> > case a removal like this should be caught at the build stage
>
> Thanks for the explanation. I misunderstood this a bit - when the
> only effect of the "removal" is an output like when the libs wouldn't
> have been compiled with that part, then that's maybe nothing to
> be blamed for.
> On the other side: when somebody is using it and updates the libs
> to a point where it's missing, it will be broken for her/him.
> So the outcome might not be _that_ different for any other breaking
> changes being made.
I agree that in general removing random components would be a bad thing
to do, even though it's not technically an API break. That's why we
don't do it if there's any chance the component in question is useful.
The argument _in this specific case_ is that xvmc is not useful to
anyone and has not been for a very long time, so no valid use cases are
broken by its removal. In fact its only user ever I'm aware of is the
original mplayer (mplayer2, which was later forked into mpv, dropped it
in 2011).
--
Anton Khirnov
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC hwaccel code
2022-02-09 5:49 ` Anton Khirnov
@ 2022-02-09 6:19 ` Soft Works
2022-02-09 6:38 ` Anton Khirnov
1 sibling, 0 replies; 15+ messages in thread
From: Soft Works @ 2022-02-09 6:19 UTC (permalink / raw)
To: FFmpeg development discussions and patches
> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of
> Anton Khirnov
> Sent: Wednesday, February 9, 2022 6:49 AM
> To: FFmpeg development discussions and patches <ffmpeg-
> devel@ffmpeg.org>
> Subject: Re: [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC
> hwaccel code
>
> Quoting Soft Works (2022-02-08 22:34:42)
> >
> >
> > > -----Original Message-----
> > > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of
> > > Anton Khirnov
> > > Sent: Tuesday, February 8, 2022 10:37 AM
> > > To: FFmpeg development discussions and patches <ffmpeg-
> > > devel@ffmpeg.org>
> > > Subject: Re: [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC
> > > hwaccel code
> > >
> > > Quoting Soft Works (2022-02-07 03:18:54)
> > > > I sometimes wonder whether there exists a single API user who
> > > > really understands this (very special) kind of logic and
> > > > would make decisions based on that understanding.
> > > >
> > > > When it's not even fully understood internally, how should it
> > > > be understood externally?
> > >
> > > The rule for API users is simple: you are not allowed to assume a
> > > specific component (like a decoder, demuxer or hwaccel) will be
> > > available at runtime*. You are supposed to check for it using the
> APIs
> > > provided for this purpose. In this case, AV_PIX_FMT_XVMC will just
> > > stop
> > > being offered in get_format().
> > >
> > > Not to mention that I very much doubt there are any users of xvmc
> > > left,
> > > besides the original mplayer.
> > >
> > > * unless you are running with a very specific verified build, in
> which
> > > case a removal like this should be caught at the build stage
> >
> > Thanks for the explanation. I misunderstood this a bit - when the
> > only effect of the "removal" is an output like when the libs
> wouldn't
> > have been compiled with that part, then that's maybe nothing to
> > be blamed for.
> > On the other side: when somebody is using it and updates the libs
> > to a point where it's missing, it will be broken for her/him.
> > So the outcome might not be _that_ different for any other breaking
> > changes being made.
>
> I agree that in general removing random components would be a bad
> thing
> to do, even though it's not technically an API break. That's why we
> don't do it if there's any chance the component in question is useful.
>
> The argument _in this specific case_ is that xvmc is not useful to
> anyone and has not been for a very long time, so no valid use cases
> are
> broken by its removal. In fact its only user ever I'm aware of is the
> original mplayer (mplayer2, which was later forked into mpv, dropped
> it
> in 2011).
Sure. Don't understand my reply as an objection I don't even know what
xvmc is (or was). I rather see the burden and effort that it takes
to retain all those compatibility paths and at the same time how it
is blocking innovation and progress.
Compatibility is important - without question, but doing it in a way
that libs from different versions can be combined, is a somewhat crazy
endeavor. I keep wondering who would be the developer whose dreams
this might fulfil..
The discussion about that seems to have gotten stuck about whether
to merge libs together or not, or how, but I haven't followed in
detailed, so please excuse the question (which has probably been
covered before):
Why can't ffmpeg simply declare that starting from version X, it
will be a requirement that all libs are from the same version?
(of course after equalizing)
BR,
softworkz
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC hwaccel code
2022-02-09 5:49 ` Anton Khirnov
2022-02-09 6:19 ` Soft Works
@ 2022-02-09 6:38 ` Anton Khirnov
1 sibling, 0 replies; 15+ messages in thread
From: Anton Khirnov @ 2022-02-09 6:38 UTC (permalink / raw)
To: FFmpeg development discussions and patches
Quoting Soft Works (2022-02-09 07:19:23)
>
> Sure. Don't understand my reply as an objection I don't even know what
> xvmc is (or was). I rather see the burden and effort that it takes
> to retain all those compatibility paths and at the same time how it
> is blocking innovation and progress.
> Compatibility is important - without question, but doing it in a way
> that libs from different versions can be combined, is a somewhat crazy
> endeavor. I keep wondering who would be the developer whose dreams
> this might fulfil..
> The discussion about that seems to have gotten stuck about whether
> to merge libs together or not, or how, but I haven't followed in
> detailed, so please excuse the question (which has probably been
> covered before):
> Why can't ffmpeg simply declare that starting from version X, it
> will be a requirement that all libs are from the same version?
> (of course after equalizing)
That is pretty offtopic in this thread =p
That said, in my opinion
- the extra flexibility is useful
- the actual effort required to allow mismatching versions is overstated
- the things this mainly affects are various private interfaces, which
IMO are a mispattern and should not exist anyway
--
Anton Khirnov
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC hwaccel code
2022-02-01 10:02 [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC hwaccel code Anton Khirnov
` (3 preceding siblings ...)
2022-02-07 1:46 ` [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC hwaccel code Andreas Rheinhardt
@ 2022-02-08 9:37 ` Anton Khirnov
4 siblings, 0 replies; 15+ messages in thread
From: Anton Khirnov @ 2022-02-08 9:37 UTC (permalink / raw)
To: FFmpeg development discussions and patches
Quoting Andreas Rheinhardt (2022-02-07 02:46:08)
> I thought that removing components is only possible at a major version
> bump. Am I wrong?
AFAIK we provide no API guarantees for specific components being
available.
--
Anton Khirnov
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2022-02-09 6:38 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-01 10:02 [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC hwaccel code Anton Khirnov
2022-02-01 10:02 ` [FFmpeg-devel] [PATCH 2/4] lavc/xvmc.h: mark the header as deprecated Anton Khirnov
2022-02-01 10:02 ` [FFmpeg-devel] [PATCH 3/4] lavu/pixfmt: deprecate AV_PIX_FMT_XVMC Anton Khirnov
2022-02-01 10:02 ` [FFmpeg-devel] [PATCH 4/4] lavc: deprecate FF_IDCT_NONE Anton Khirnov
2022-02-01 11:16 ` Lynne
2022-02-01 11:32 ` James Almer
2022-02-07 1:46 ` [FFmpeg-devel] [PATCH 1/4] lavc/mpeg*: drop the XvMC hwaccel code Andreas Rheinhardt
2022-02-07 1:53 ` James Almer
2022-02-07 2:18 ` Soft Works
2022-02-08 9:36 ` Anton Khirnov
2022-02-08 21:34 ` Soft Works
2022-02-09 5:49 ` Anton Khirnov
2022-02-09 6:19 ` Soft Works
2022-02-09 6:38 ` Anton Khirnov
2022-02-08 9:37 ` Anton Khirnov
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git