summaryrefslogtreecommitdiff
path: root/fftools/ffmpeg.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2023-04-11 13:21:56 +0200
committerAnton Khirnov <anton@khirnov.net>2023-04-17 12:01:40 +0200
commit9ce1a041d8879379cc2a4231d073738616b2c3e5 (patch)
treef04b6b146a5409c748bffc2bee3ebd0016933a31 /fftools/ffmpeg.c
parentff92ecad2fca6143637538fb7ab3423205ebb4a7 (diff)
downloadffmpeg-9ce1a041d8879379cc2a4231d073738616b2c3e5.tar.gz
fftools/ffmpeg: move opening decoders to a new file
All decoding code will be moved to this file in the future.
Diffstat (limited to 'fftools/ffmpeg.c')
-rw-r--r--fftools/ffmpeg.c111
1 files changed, 1 insertions, 110 deletions
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index 0ceb25fed0..ba92b2aa84 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -621,11 +621,6 @@ void assert_avoptions(AVDictionary *m)
}
}
-static void abort_codec_experimental(const AVCodec *c, int encoder)
-{
- exit_program(1);
-}
-
void update_benchmark(const char *fmt, ...)
{
if (do_benchmark_all) {
@@ -1858,110 +1853,6 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt, int no_eo
return !eof_reached;
}
-static enum AVPixelFormat get_format(AVCodecContext *s, const enum AVPixelFormat *pix_fmts)
-{
- InputStream *ist = s->opaque;
- const enum AVPixelFormat *p;
- int ret;
-
- for (p = pix_fmts; *p != AV_PIX_FMT_NONE; p++) {
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(*p);
- const AVCodecHWConfig *config = NULL;
- int i;
-
- if (!(desc->flags & AV_PIX_FMT_FLAG_HWACCEL))
- break;
-
- if (ist->hwaccel_id == HWACCEL_GENERIC ||
- ist->hwaccel_id == HWACCEL_AUTO) {
- for (i = 0;; i++) {
- config = avcodec_get_hw_config(s->codec, i);
- if (!config)
- break;
- if (!(config->methods &
- AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX))
- continue;
- if (config->pix_fmt == *p)
- break;
- }
- }
- if (config && config->device_type == ist->hwaccel_device_type) {
- ret = hwaccel_decode_init(s);
- if (ret < 0) {
- if (ist->hwaccel_id == HWACCEL_GENERIC) {
- av_log(NULL, AV_LOG_FATAL,
- "%s hwaccel requested for input stream #%d:%d, "
- "but cannot be initialized.\n",
- av_hwdevice_get_type_name(config->device_type),
- ist->file_index, ist->st->index);
- return AV_PIX_FMT_NONE;
- }
- continue;
- }
-
- ist->hwaccel_pix_fmt = *p;
- break;
- }
- }
-
- return *p;
-}
-
-static int init_input_stream(InputStream *ist)
-{
- int ret;
-
- if (ist->decoding_needed) {
- const AVCodec *codec = ist->dec;
- if (!codec) {
- av_log(ist, AV_LOG_ERROR,
- "Decoding requested, but no decoder found for: %s\n",
- avcodec_get_name(ist->dec_ctx->codec_id));
- return AVERROR(EINVAL);
- }
-
- ist->dec_ctx->opaque = ist;
- ist->dec_ctx->get_format = get_format;
-
- if (ist->dec_ctx->codec_id == AV_CODEC_ID_DVB_SUBTITLE &&
- (ist->decoding_needed & DECODING_FOR_OST)) {
- av_dict_set(&ist->decoder_opts, "compute_edt", "1", AV_DICT_DONT_OVERWRITE);
- if (ist->decoding_needed & DECODING_FOR_FILTER)
- av_log(NULL, AV_LOG_WARNING, "Warning using DVB subtitles for filtering and output at the same time is not fully supported, also see -compute_edt [0|1]\n");
- }
-
- /* Useful for subtitles retiming by lavf (FIXME), skipping samples in
- * audio, and video decoders such as cuvid or mediacodec */
- ist->dec_ctx->pkt_timebase = ist->st->time_base;
-
- if (!av_dict_get(ist->decoder_opts, "threads", NULL, 0))
- av_dict_set(&ist->decoder_opts, "threads", "auto", 0);
- /* Attached pics are sparse, therefore we would not want to delay their decoding till EOF. */
- if (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC)
- av_dict_set(&ist->decoder_opts, "threads", "1", 0);
-
- ret = hw_device_setup_for_decode(ist);
- if (ret < 0) {
- av_log(ist, AV_LOG_ERROR,
- "Hardware device setup failed for decoder: %s\n",
- av_err2str(ret));
- return ret;
- }
-
- if ((ret = avcodec_open2(ist->dec_ctx, codec, &ist->decoder_opts)) < 0) {
- if (ret == AVERROR_EXPERIMENTAL)
- abort_codec_experimental(codec, 0);
-
- av_log(ist, AV_LOG_ERROR, "Error while opening decoder: %s\n",
- av_err2str(ret));
- return ret;
- }
- assert_avoptions(ist->decoder_opts);
- }
-
- return 0;
-}
-
static int init_output_stream_nofilter(OutputStream *ost)
{
int ret = 0;
@@ -1993,7 +1884,7 @@ static int transcode_init(void)
/* init input streams */
for (InputStream *ist = ist_iter(NULL); ist; ist = ist_iter(ist))
- if ((ret = init_input_stream(ist)) < 0)
+ if (ist->decoding_needed && (ret = dec_open(ist)) < 0)
goto dump_format;
/*