mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-22 15:23:11 +00:00
ffmpeg: remove ffmpeg_videotoolbox
This was almost completely redundant. The only functionality that's no longer available after this removal is the videotoolbox_pixfmt arg, which has been obsolete for several years.
This commit is contained in:
parent
5593f5cf24
commit
4b54818981
@ -10,10 +10,6 @@ ALLAVPROGS = $(AVBASENAMES:%=%$(PROGSSUF)$(EXESUF))
|
|||||||
ALLAVPROGS_G = $(AVBASENAMES:%=%$(PROGSSUF)_g$(EXESUF))
|
ALLAVPROGS_G = $(AVBASENAMES:%=%$(PROGSSUF)_g$(EXESUF))
|
||||||
|
|
||||||
OBJS-ffmpeg += fftools/ffmpeg_opt.o fftools/ffmpeg_filter.o fftools/ffmpeg_hw.o
|
OBJS-ffmpeg += fftools/ffmpeg_opt.o fftools/ffmpeg_filter.o fftools/ffmpeg_hw.o
|
||||||
ifndef CONFIG_VIDEOTOOLBOX
|
|
||||||
OBJS-ffmpeg-$(CONFIG_VDA) += fftools/ffmpeg_videotoolbox.o
|
|
||||||
endif
|
|
||||||
OBJS-ffmpeg-$(CONFIG_VIDEOTOOLBOX) += fftools/ffmpeg_videotoolbox.o
|
|
||||||
|
|
||||||
define DOFFTOOL
|
define DOFFTOOL
|
||||||
OBJS-$(1) += fftools/cmdutils.o fftools/$(1).o $(OBJS-$(1)-yes)
|
OBJS-$(1) += fftools/cmdutils.o fftools/$(1).o $(OBJS-$(1)-yes)
|
||||||
|
@ -2858,12 +2858,7 @@ static enum AVPixelFormat get_format(AVCodecContext *s, const enum AVPixelFormat
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (config) {
|
if (config && config->device_type == ist->hwaccel_device_type) {
|
||||||
if (config->device_type != ist->hwaccel_device_type) {
|
|
||||||
// Different hwaccel offered, ignore.
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = hwaccel_decode_init(s);
|
ret = hwaccel_decode_init(s);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
if (ist->hwaccel_id == HWACCEL_GENERIC) {
|
if (ist->hwaccel_id == HWACCEL_GENERIC) {
|
||||||
@ -2876,36 +2871,10 @@ static enum AVPixelFormat get_format(AVCodecContext *s, const enum AVPixelFormat
|
|||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
const HWAccel *hwaccel = NULL;
|
|
||||||
int i;
|
|
||||||
for (i = 0; hwaccels[i].name; i++) {
|
|
||||||
if (hwaccels[i].pix_fmt == *p) {
|
|
||||||
hwaccel = &hwaccels[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!hwaccel) {
|
|
||||||
// No hwaccel supporting this pixfmt.
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (hwaccel->id != ist->hwaccel_id) {
|
|
||||||
// Does not match requested hwaccel.
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = hwaccel->init(s);
|
ist->hwaccel_pix_fmt = *p;
|
||||||
if (ret < 0) {
|
break;
|
||||||
av_log(NULL, AV_LOG_FATAL,
|
|
||||||
"%s hwaccel requested for input stream #%d:%d, "
|
|
||||||
"but cannot be initialized.\n", hwaccel->name,
|
|
||||||
ist->file_index, ist->st->index);
|
|
||||||
return AV_PIX_FMT_NONE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ist->hwaccel_pix_fmt = *p;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return *p;
|
return *p;
|
||||||
|
@ -60,16 +60,8 @@ enum HWAccelID {
|
|||||||
HWACCEL_NONE = 0,
|
HWACCEL_NONE = 0,
|
||||||
HWACCEL_AUTO,
|
HWACCEL_AUTO,
|
||||||
HWACCEL_GENERIC,
|
HWACCEL_GENERIC,
|
||||||
HWACCEL_VIDEOTOOLBOX,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct HWAccel {
|
|
||||||
const char *name;
|
|
||||||
int (*init)(AVCodecContext *s);
|
|
||||||
enum HWAccelID id;
|
|
||||||
enum AVPixelFormat pix_fmt;
|
|
||||||
} HWAccel;
|
|
||||||
|
|
||||||
typedef struct HWDevice {
|
typedef struct HWDevice {
|
||||||
const char *name;
|
const char *name;
|
||||||
enum AVHWDeviceType type;
|
enum AVHWDeviceType type;
|
||||||
@ -626,7 +618,6 @@ extern int stdin_interaction;
|
|||||||
extern int frame_bits_per_raw_sample;
|
extern int frame_bits_per_raw_sample;
|
||||||
extern AVIOContext *progress_avio;
|
extern AVIOContext *progress_avio;
|
||||||
extern float max_error_rate;
|
extern float max_error_rate;
|
||||||
extern char *videotoolbox_pixfmt;
|
|
||||||
|
|
||||||
extern char *filter_nbthreads;
|
extern char *filter_nbthreads;
|
||||||
extern int filter_complex_nbthreads;
|
extern int filter_complex_nbthreads;
|
||||||
@ -636,7 +627,6 @@ extern int auto_conversion_filters;
|
|||||||
extern const AVIOInterruptCB int_cb;
|
extern const AVIOInterruptCB int_cb;
|
||||||
|
|
||||||
extern const OptionDef options[];
|
extern const OptionDef options[];
|
||||||
extern const HWAccel hwaccels[];
|
|
||||||
#if CONFIG_QSV
|
#if CONFIG_QSV
|
||||||
extern char *qsv_device;
|
extern char *qsv_device;
|
||||||
#endif
|
#endif
|
||||||
|
@ -134,12 +134,6 @@ static const char *const opt_name_enc_time_bases[] = {"enc_time_base"
|
|||||||
}\
|
}\
|
||||||
}
|
}
|
||||||
|
|
||||||
const HWAccel hwaccels[] = {
|
|
||||||
#if CONFIG_VIDEOTOOLBOX
|
|
||||||
{ "videotoolbox", videotoolbox_init, HWACCEL_VIDEOTOOLBOX, AV_PIX_FMT_VIDEOTOOLBOX },
|
|
||||||
#endif
|
|
||||||
{ 0 },
|
|
||||||
};
|
|
||||||
HWDevice *filter_hw_device;
|
HWDevice *filter_hw_device;
|
||||||
|
|
||||||
char *vstats_filename;
|
char *vstats_filename;
|
||||||
@ -931,21 +925,10 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
|
|||||||
else if (!strcmp(hwaccel, "auto"))
|
else if (!strcmp(hwaccel, "auto"))
|
||||||
ist->hwaccel_id = HWACCEL_AUTO;
|
ist->hwaccel_id = HWACCEL_AUTO;
|
||||||
else {
|
else {
|
||||||
enum AVHWDeviceType type;
|
enum AVHWDeviceType type = av_hwdevice_find_type_by_name(hwaccel);
|
||||||
int i;
|
if (type != AV_HWDEVICE_TYPE_NONE) {
|
||||||
for (i = 0; hwaccels[i].name; i++) {
|
ist->hwaccel_id = HWACCEL_GENERIC;
|
||||||
if (!strcmp(hwaccels[i].name, hwaccel)) {
|
ist->hwaccel_device_type = type;
|
||||||
ist->hwaccel_id = hwaccels[i].id;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ist->hwaccel_id) {
|
|
||||||
type = av_hwdevice_find_type_by_name(hwaccel);
|
|
||||||
if (type != AV_HWDEVICE_TYPE_NONE) {
|
|
||||||
ist->hwaccel_id = HWACCEL_GENERIC;
|
|
||||||
ist->hwaccel_device_type = type;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ist->hwaccel_id) {
|
if (!ist->hwaccel_id) {
|
||||||
@ -3811,9 +3794,6 @@ const OptionDef options[] = {
|
|||||||
{ "hwaccel_output_format", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
|
{ "hwaccel_output_format", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
|
||||||
OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_output_formats) },
|
OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_output_formats) },
|
||||||
"select output format used with HW accelerated decoding", "format" },
|
"select output format used with HW accelerated decoding", "format" },
|
||||||
#if CONFIG_VIDEOTOOLBOX
|
|
||||||
{ "videotoolbox_pixfmt", HAS_ARG | OPT_STRING | OPT_EXPERT, { &videotoolbox_pixfmt}, "" },
|
|
||||||
#endif
|
|
||||||
{ "hwaccels", OPT_EXIT, { .func_arg = show_hwaccels },
|
{ "hwaccels", OPT_EXIT, { .func_arg = show_hwaccels },
|
||||||
"show available HW acceleration methods" },
|
"show available HW acceleration methods" },
|
||||||
{ "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC |
|
{ "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC |
|
||||||
|
@ -1,177 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 "config.h"
|
|
||||||
|
|
||||||
#if HAVE_UTGETOSTYPEFROMSTRING
|
|
||||||
#include <CoreServices/CoreServices.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "libavcodec/avcodec.h"
|
|
||||||
#include "libavcodec/videotoolbox.h"
|
|
||||||
#include "libavutil/imgutils.h"
|
|
||||||
#include "ffmpeg.h"
|
|
||||||
|
|
||||||
typedef struct VTContext {
|
|
||||||
AVFrame *tmp_frame;
|
|
||||||
int log_once;
|
|
||||||
} VTContext;
|
|
||||||
|
|
||||||
char *videotoolbox_pixfmt;
|
|
||||||
|
|
||||||
static int videotoolbox_retrieve_data(AVCodecContext *s, AVFrame *frame)
|
|
||||||
{
|
|
||||||
InputStream *ist = s->opaque;
|
|
||||||
VTContext *vt = ist->hwaccel_ctx;
|
|
||||||
CVPixelBufferRef pixbuf = (CVPixelBufferRef)frame->data[3];
|
|
||||||
OSType pixel_format = CVPixelBufferGetPixelFormatType(pixbuf);
|
|
||||||
CVReturn err;
|
|
||||||
uint8_t *data[4] = { 0 };
|
|
||||||
int linesize[4] = { 0 };
|
|
||||||
int planes, ret, i;
|
|
||||||
|
|
||||||
if (frame->format == ist->hwaccel_output_format) {
|
|
||||||
av_log_once(s, AV_LOG_INFO, AV_LOG_TRACE, &vt->log_once,
|
|
||||||
"There is no video filter for videotoolbox pix_fmt now, remove the "
|
|
||||||
"-hwaccel_output_format option if video filter doesn't work\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
av_frame_unref(vt->tmp_frame);
|
|
||||||
|
|
||||||
switch (pixel_format) {
|
|
||||||
case kCVPixelFormatType_420YpCbCr8Planar: vt->tmp_frame->format = AV_PIX_FMT_YUV420P; break;
|
|
||||||
case kCVPixelFormatType_422YpCbCr8: vt->tmp_frame->format = AV_PIX_FMT_UYVY422; break;
|
|
||||||
case kCVPixelFormatType_32BGRA: vt->tmp_frame->format = AV_PIX_FMT_BGRA; break;
|
|
||||||
#ifdef kCFCoreFoundationVersionNumber10_7
|
|
||||||
case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange:
|
|
||||||
case kCVPixelFormatType_420YpCbCr8BiPlanarFullRange: vt->tmp_frame->format = AV_PIX_FMT_NV12; break;
|
|
||||||
#endif
|
|
||||||
#if HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE
|
|
||||||
case kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange:
|
|
||||||
case kCVPixelFormatType_420YpCbCr10BiPlanarFullRange: vt->tmp_frame->format = AV_PIX_FMT_P010; break;
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
av_log(NULL, AV_LOG_ERROR,
|
|
||||||
"%s: Unsupported pixel format: %s\n",
|
|
||||||
av_fourcc2str(s->codec_tag), videotoolbox_pixfmt);
|
|
||||||
return AVERROR(ENOSYS);
|
|
||||||
}
|
|
||||||
|
|
||||||
vt->tmp_frame->width = frame->width;
|
|
||||||
vt->tmp_frame->height = frame->height;
|
|
||||||
ret = av_frame_get_buffer(vt->tmp_frame, 0);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
err = CVPixelBufferLockBaseAddress(pixbuf, kCVPixelBufferLock_ReadOnly);
|
|
||||||
if (err != kCVReturnSuccess) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "Error locking the pixel buffer.\n");
|
|
||||||
return AVERROR_UNKNOWN;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CVPixelBufferIsPlanar(pixbuf)) {
|
|
||||||
|
|
||||||
planes = CVPixelBufferGetPlaneCount(pixbuf);
|
|
||||||
for (i = 0; i < planes; i++) {
|
|
||||||
data[i] = CVPixelBufferGetBaseAddressOfPlane(pixbuf, i);
|
|
||||||
linesize[i] = CVPixelBufferGetBytesPerRowOfPlane(pixbuf, i);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
data[0] = CVPixelBufferGetBaseAddress(pixbuf);
|
|
||||||
linesize[0] = CVPixelBufferGetBytesPerRow(pixbuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
av_image_copy(vt->tmp_frame->data, vt->tmp_frame->linesize,
|
|
||||||
(const uint8_t **)data, linesize, vt->tmp_frame->format,
|
|
||||||
frame->width, frame->height);
|
|
||||||
|
|
||||||
ret = av_frame_copy_props(vt->tmp_frame, frame);
|
|
||||||
CVPixelBufferUnlockBaseAddress(pixbuf, kCVPixelBufferLock_ReadOnly);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
av_frame_unref(frame);
|
|
||||||
av_frame_move_ref(frame, vt->tmp_frame);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void videotoolbox_uninit(AVCodecContext *s)
|
|
||||||
{
|
|
||||||
InputStream *ist = s->opaque;
|
|
||||||
VTContext *vt = ist->hwaccel_ctx;
|
|
||||||
|
|
||||||
ist->hwaccel_uninit = NULL;
|
|
||||||
ist->hwaccel_retrieve_data = NULL;
|
|
||||||
|
|
||||||
av_frame_free(&vt->tmp_frame);
|
|
||||||
|
|
||||||
av_videotoolbox_default_free(s);
|
|
||||||
av_freep(&ist->hwaccel_ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
int videotoolbox_init(AVCodecContext *s)
|
|
||||||
{
|
|
||||||
InputStream *ist = s->opaque;
|
|
||||||
int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
|
|
||||||
int ret = 0;
|
|
||||||
VTContext *vt;
|
|
||||||
|
|
||||||
vt = av_mallocz(sizeof(*vt));
|
|
||||||
if (!vt)
|
|
||||||
return AVERROR(ENOMEM);
|
|
||||||
|
|
||||||
ist->hwaccel_ctx = vt;
|
|
||||||
ist->hwaccel_uninit = videotoolbox_uninit;
|
|
||||||
ist->hwaccel_retrieve_data = videotoolbox_retrieve_data;
|
|
||||||
|
|
||||||
vt->tmp_frame = av_frame_alloc();
|
|
||||||
if (!vt->tmp_frame) {
|
|
||||||
ret = AVERROR(ENOMEM);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: reindent
|
|
||||||
if (!videotoolbox_pixfmt) {
|
|
||||||
ret = av_videotoolbox_default_init(s);
|
|
||||||
} else {
|
|
||||||
AVVideotoolboxContext *vtctx = av_videotoolbox_alloc_context();
|
|
||||||
CFStringRef pixfmt_str = CFStringCreateWithCString(kCFAllocatorDefault,
|
|
||||||
videotoolbox_pixfmt,
|
|
||||||
kCFStringEncodingUTF8);
|
|
||||||
#if HAVE_UTGETOSTYPEFROMSTRING
|
|
||||||
vtctx->cv_pix_fmt_type = UTGetOSTypeFromString(pixfmt_str);
|
|
||||||
#else
|
|
||||||
av_log(s, loglevel, "UTGetOSTypeFromString() is not available "
|
|
||||||
"on this platform, %s pixel format can not be honored from "
|
|
||||||
"the command line\n", videotoolbox_pixfmt);
|
|
||||||
#endif
|
|
||||||
ret = av_videotoolbox_default_init2(s, vtctx);
|
|
||||||
CFRelease(pixfmt_str);
|
|
||||||
}
|
|
||||||
if (ret < 0) {
|
|
||||||
av_log(NULL, loglevel, "Error creating Videotoolbox decoder.\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
fail:
|
|
||||||
videotoolbox_uninit(s);
|
|
||||||
return ret;
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user