* [FFmpeg-devel] [PATCH v4 1/2] ffmpeg_opt: select a decoder after getting values for per-stream hwdec options
@ 2022-08-02 7:56 Xiang, Haihao
2022-08-02 7:56 ` [FFmpeg-devel] [PATCH v4 2/2] ffmpeg_opt: consider HW acceleration method when selecting decoder Xiang, Haihao
0 siblings, 1 reply; 5+ messages in thread
From: Xiang, Haihao @ 2022-08-02 7:56 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Haihao Xiang
From: Haihao Xiang <haihao.xiang@intel.com>
After applying this patch, the desired HW acceleration method is known
before selecting decoder, so we may take HW acceleration method into
account when selecting decoder for input stream in the next commit
There should be no functional changes in this patch
Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
---
fftools/ffmpeg_opt.c | 134 ++++++++++++++++++++++---------------------
1 file changed, 68 insertions(+), 66 deletions(-)
diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
index a96bcf9b8a..cf0c31bdc2 100644
--- a/fftools/ffmpeg_opt.c
+++ b/fftools/ffmpeg_opt.c
@@ -935,72 +935,7 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
st->codecpar->codec_tag = tag;
}
- ist->dec = choose_decoder(o, ic, st);
- ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codecpar->codec_id, ic, st, ist->dec);
-
- ist->reinit_filters = -1;
- MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);
-
- MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st);
- ist->user_set_discard = AVDISCARD_NONE;
-
- if ((o->video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) ||
- (o->audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) ||
- (o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) ||
- (o->data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA))
- ist->user_set_discard = AVDISCARD_ALL;
-
- if (discard_str && av_opt_eval_int(&cc, discard_opt, discard_str, &ist->user_set_discard) < 0) {
- av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n",
- discard_str);
- exit_program(1);
- }
-
- ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE;
- ist->prev_pkt_pts = AV_NOPTS_VALUE;
-
- ist->dec_ctx = avcodec_alloc_context3(ist->dec);
- if (!ist->dec_ctx) {
- av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
- exit_program(1);
- }
-
- ret = avcodec_parameters_to_context(ist->dec_ctx, par);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
- exit_program(1);
- }
-
- ist->decoded_frame = av_frame_alloc();
- if (!ist->decoded_frame)
- exit_program(1);
-
- ist->pkt = av_packet_alloc();
- if (!ist->pkt)
- exit_program(1);
-
- if (o->bitexact)
- ist->dec_ctx->flags |= AV_CODEC_FLAG_BITEXACT;
-
- switch (par->codec_type) {
- case AVMEDIA_TYPE_VIDEO:
- if(!ist->dec)
- ist->dec = avcodec_find_decoder(par->codec_id);
-
- // avformat_find_stream_info() doesn't set this for us anymore.
- ist->dec_ctx->framerate = st->avg_frame_rate;
-
- MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
- if (framerate && av_parse_video_rate(&ist->framerate,
- framerate) < 0) {
- av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
- framerate);
- exit_program(1);
- }
-
- ist->top_field_first = -1;
- MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
-
+ if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
MATCH_PER_STREAM_OPT(hwaccel_output_formats, str,
hwaccel_output_format, ic, st);
@@ -1066,6 +1001,73 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
}
ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
+ }
+
+ ist->dec = choose_decoder(o, ic, st);
+ ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codecpar->codec_id, ic, st, ist->dec);
+
+ ist->reinit_filters = -1;
+ MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);
+
+ MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st);
+ ist->user_set_discard = AVDISCARD_NONE;
+
+ if ((o->video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) ||
+ (o->audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) ||
+ (o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) ||
+ (o->data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA))
+ ist->user_set_discard = AVDISCARD_ALL;
+
+ if (discard_str && av_opt_eval_int(&cc, discard_opt, discard_str, &ist->user_set_discard) < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n",
+ discard_str);
+ exit_program(1);
+ }
+
+ ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE;
+ ist->prev_pkt_pts = AV_NOPTS_VALUE;
+
+ ist->dec_ctx = avcodec_alloc_context3(ist->dec);
+ if (!ist->dec_ctx) {
+ av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
+ exit_program(1);
+ }
+
+ ret = avcodec_parameters_to_context(ist->dec_ctx, par);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
+ exit_program(1);
+ }
+
+ ist->decoded_frame = av_frame_alloc();
+ if (!ist->decoded_frame)
+ exit_program(1);
+
+ ist->pkt = av_packet_alloc();
+ if (!ist->pkt)
+ exit_program(1);
+
+ if (o->bitexact)
+ ist->dec_ctx->flags |= AV_CODEC_FLAG_BITEXACT;
+
+ switch (par->codec_type) {
+ case AVMEDIA_TYPE_VIDEO:
+ if(!ist->dec)
+ ist->dec = avcodec_find_decoder(par->codec_id);
+
+ // avformat_find_stream_info() doesn't set this for us anymore.
+ ist->dec_ctx->framerate = st->avg_frame_rate;
+
+ MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
+ if (framerate && av_parse_video_rate(&ist->framerate,
+ framerate) < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
+ framerate);
+ exit_program(1);
+ }
+
+ ist->top_field_first = -1;
+ MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
break;
case AVMEDIA_TYPE_AUDIO:
--
2.17.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] 5+ messages in thread
* [FFmpeg-devel] [PATCH v4 2/2] ffmpeg_opt: consider HW acceleration method when selecting decoder
2022-08-02 7:56 [FFmpeg-devel] [PATCH v4 1/2] ffmpeg_opt: select a decoder after getting values for per-stream hwdec options Xiang, Haihao
@ 2022-08-02 7:56 ` Xiang, Haihao
2022-08-02 9:11 ` Anton Khirnov
2022-08-02 11:29 ` Anton Khirnov
0 siblings, 2 replies; 5+ messages in thread
From: Xiang, Haihao @ 2022-08-02 7:56 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Haihao Xiang
From: Haihao Xiang <haihao.xiang@intel.com>
Usually a HW decoder is expected when user specifies a HW acceleration
method via -hwaccel option, however the current implementation doesn't
take HW acceleration method into account, it is possible to select a SW
decoder.
For example:
$ ffmpeg -hwaccel vaapi -i av1.mp4 -f null -
$ ffmpeg -hwaccel nvdec -i av1.mp4 -f null -
$ ffmpeg -hwaccel vdpau -i av1.mp4 -f null -
[...]
Stream #0:0 -> #0:0 (av1 (libdav1d) -> wrapped_avframe (native))
libdav1d is selected in this case even if vaapi, nvdec or vdpau is
specified.
After applying this patch, the native av1 decoder (with vaapi, nvdec or
vdpau support) is selected for decoding(libdav1d is still used for
probing format).
$ ffmpeg -hwaccel vaapi -i av1.mp4 -f null -
$ ffmpeg -hwaccel nvdec -i av1.mp4 -f null -
$ ffmpeg -hwaccel vdpau -i av1.mp4 -f null -
[...]
Stream #0:0 -> #0:0 (av1 (native) -> wrapped_avframe (native))
Tested-by: Mario Roy <marioeroy@gmail.com>
Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
---
fftools/ffmpeg_opt.c | 31 +++++++++++++++++++++++++++----
1 file changed, 27 insertions(+), 4 deletions(-)
diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
index cf0c31bdc2..db51cca66d 100644
--- a/fftools/ffmpeg_opt.c
+++ b/fftools/ffmpeg_opt.c
@@ -857,7 +857,9 @@ static const AVCodec *find_codec_or_die(const char *name, enum AVMediaType type,
return codec;
}
-static const AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
+static const AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st,
+ enum HWAccelID hwaccel_id, enum AVHWDeviceType hwaccel_device_type)
+
{
char *codec_name = NULL;
@@ -868,8 +870,29 @@ static const AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVSt
if (recast_media && st->codecpar->codec_type != codec->type)
st->codecpar->codec_type = codec->type;
return codec;
- } else
+ } else {
+ if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
+ hwaccel_id == HWACCEL_GENERIC &&
+ hwaccel_device_type != AV_HWDEVICE_TYPE_NONE) {
+ const AVCodec *c;
+ void *i = NULL;
+
+ while ((c = av_codec_iterate(&i))) {
+ const AVCodecHWConfig *config;
+
+ if (c->id != st->codecpar->codec_id ||
+ !av_codec_is_decoder(c))
+ continue;
+
+ for (int j = 0; config = avcodec_get_hw_config(c, j); j++) {
+ if (config->device_type == hwaccel_device_type)
+ return c;
+ }
+ }
+ }
+
return avcodec_find_decoder(st->codecpar->codec_id);
+ }
}
static int guess_input_channel_layout(InputStream *ist)
@@ -1003,7 +1026,7 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
}
- ist->dec = choose_decoder(o, ic, st);
+ ist->dec = choose_decoder(o, ic, st, ist->hwaccel_id, ist->hwaccel_device_type);
ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codecpar->codec_id, ic, st, ist->dec);
ist->reinit_filters = -1;
@@ -1309,7 +1332,7 @@ static int open_input_file(OptionsContext *o, const char *filename)
/* apply forced codec ids */
for (i = 0; i < ic->nb_streams; i++)
- choose_decoder(o, ic, ic->streams[i]);
+ choose_decoder(o, ic, ic->streams[i], HWACCEL_NONE, AV_HWDEVICE_TYPE_NONE);
if (find_stream_info) {
AVDictionary **opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
--
2.17.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] 5+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 2/2] ffmpeg_opt: consider HW acceleration method when selecting decoder
2022-08-02 7:56 ` [FFmpeg-devel] [PATCH v4 2/2] ffmpeg_opt: consider HW acceleration method when selecting decoder Xiang, Haihao
@ 2022-08-02 9:11 ` Anton Khirnov
2022-08-02 11:29 ` Anton Khirnov
1 sibling, 0 replies; 5+ messages in thread
From: Anton Khirnov @ 2022-08-02 9:11 UTC (permalink / raw)
To: FFmpeg development discussions and patches; +Cc: Haihao Xiang
Both patches LGTM
--
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] 5+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 2/2] ffmpeg_opt: consider HW acceleration method when selecting decoder
2022-08-02 7:56 ` [FFmpeg-devel] [PATCH v4 2/2] ffmpeg_opt: consider HW acceleration method when selecting decoder Xiang, Haihao
2022-08-02 9:11 ` Anton Khirnov
@ 2022-08-02 11:29 ` Anton Khirnov
2022-08-03 3:20 ` Xiang, Haihao
1 sibling, 1 reply; 5+ messages in thread
From: Anton Khirnov @ 2022-08-02 11:29 UTC (permalink / raw)
To: FFmpeg development discussions and patches; +Cc: Haihao Xiang
Quoting Xiang, Haihao (2022-08-02 09:56:01)
> From: Haihao Xiang <haihao.xiang@intel.com>
>
> Usually a HW decoder is expected when user specifies a HW acceleration
> method via -hwaccel option, however the current implementation doesn't
> take HW acceleration method into account, it is possible to select a SW
> decoder.
>
> For example:
> $ ffmpeg -hwaccel vaapi -i av1.mp4 -f null -
> $ ffmpeg -hwaccel nvdec -i av1.mp4 -f null -
> $ ffmpeg -hwaccel vdpau -i av1.mp4 -f null -
> [...]
> Stream #0:0 -> #0:0 (av1 (libdav1d) -> wrapped_avframe (native))
>
> libdav1d is selected in this case even if vaapi, nvdec or vdpau is
> specified.
>
> After applying this patch, the native av1 decoder (with vaapi, nvdec or
> vdpau support) is selected for decoding(libdav1d is still used for
> probing format).
> $ ffmpeg -hwaccel vaapi -i av1.mp4 -f null -
> $ ffmpeg -hwaccel nvdec -i av1.mp4 -f null -
> $ ffmpeg -hwaccel vdpau -i av1.mp4 -f null -
> [...]
> Stream #0:0 -> #0:0 (av1 (native) -> wrapped_avframe (native))
>
> Tested-by: Mario Roy <marioeroy@gmail.com>
> Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
> ---
> fftools/ffmpeg_opt.c | 31 +++++++++++++++++++++++++++----
> 1 file changed, 27 insertions(+), 4 deletions(-)
>
> diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
> index cf0c31bdc2..db51cca66d 100644
> --- a/fftools/ffmpeg_opt.c
> +++ b/fftools/ffmpeg_opt.c
> @@ -857,7 +857,9 @@ static const AVCodec *find_codec_or_die(const char *name, enum AVMediaType type,
> return codec;
> }
>
> -static const AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
> +static const AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st,
> + enum HWAccelID hwaccel_id, enum AVHWDeviceType hwaccel_device_type)
> +
> {
> char *codec_name = NULL;
>
> @@ -868,8 +870,29 @@ static const AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVSt
> if (recast_media && st->codecpar->codec_type != codec->type)
> st->codecpar->codec_type = codec->type;
> return codec;
> - } else
> + } else {
> + if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
> + hwaccel_id == HWACCEL_GENERIC &&
> + hwaccel_device_type != AV_HWDEVICE_TYPE_NONE) {
> + const AVCodec *c;
> + void *i = NULL;
> +
> + while ((c = av_codec_iterate(&i))) {
> + const AVCodecHWConfig *config;
> +
> + if (c->id != st->codecpar->codec_id ||
> + !av_codec_is_decoder(c))
> + continue;
> +
> + for (int j = 0; config = avcodec_get_hw_config(c, j); j++) {
> + if (config->device_type == hwaccel_device_type)
> + return c;
Maybe a verbose-level log message like
"Selecting decoder '%s' because of requested hwaccel method %s\n",
c->name, av_hwdevice_get_type_name(hwaccel_device_type)
would be appropriate. No need to send a new patch, just add it (or not,
as you like) and push.
--
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] 5+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 2/2] ffmpeg_opt: consider HW acceleration method when selecting decoder
2022-08-02 11:29 ` Anton Khirnov
@ 2022-08-03 3:20 ` Xiang, Haihao
0 siblings, 0 replies; 5+ messages in thread
From: Xiang, Haihao @ 2022-08-03 3:20 UTC (permalink / raw)
To: anton, ffmpeg-devel
On Tue, 2022-08-02 at 13:29 +0200, Anton Khirnov wrote:
> Quoting Xiang, Haihao (2022-08-02 09:56:01)
> > From: Haihao Xiang <haihao.xiang@intel.com>
> >
> > Usually a HW decoder is expected when user specifies a HW acceleration
> > method via -hwaccel option, however the current implementation doesn't
> > take HW acceleration method into account, it is possible to select a SW
> > decoder.
> >
> > For example:
> > $ ffmpeg -hwaccel vaapi -i av1.mp4 -f null -
> > $ ffmpeg -hwaccel nvdec -i av1.mp4 -f null -
> > $ ffmpeg -hwaccel vdpau -i av1.mp4 -f null -
> > [...]
> > Stream #0:0 -> #0:0 (av1 (libdav1d) -> wrapped_avframe (native))
> >
> > libdav1d is selected in this case even if vaapi, nvdec or vdpau is
> > specified.
> >
> > After applying this patch, the native av1 decoder (with vaapi, nvdec or
> > vdpau support) is selected for decoding(libdav1d is still used for
> > probing format).
> > $ ffmpeg -hwaccel vaapi -i av1.mp4 -f null -
> > $ ffmpeg -hwaccel nvdec -i av1.mp4 -f null -
> > $ ffmpeg -hwaccel vdpau -i av1.mp4 -f null -
> > [...]
> > Stream #0:0 -> #0:0 (av1 (native) -> wrapped_avframe (native))
> >
> > Tested-by: Mario Roy <marioeroy@gmail.com>
> > Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
> > ---
> > fftools/ffmpeg_opt.c | 31 +++++++++++++++++++++++++++----
> > 1 file changed, 27 insertions(+), 4 deletions(-)
> >
> > diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
> > index cf0c31bdc2..db51cca66d 100644
> > --- a/fftools/ffmpeg_opt.c
> > +++ b/fftools/ffmpeg_opt.c
> > @@ -857,7 +857,9 @@ static const AVCodec *find_codec_or_die(const char
> > *name, enum AVMediaType type,
> > return codec;
> > }
> >
> > -static const AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s,
> > AVStream *st)
> > +static const AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s,
> > AVStream *st,
> > + enum HWAccelID hwaccel_id, enum
> > AVHWDeviceType hwaccel_device_type)
> > +
> > {
> > char *codec_name = NULL;
> >
> > @@ -868,8 +870,29 @@ static const AVCodec *choose_decoder(OptionsContext *o,
> > AVFormatContext *s, AVSt
> > if (recast_media && st->codecpar->codec_type != codec->type)
> > st->codecpar->codec_type = codec->type;
> > return codec;
> > - } else
> > + } else {
> > + if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
> > + hwaccel_id == HWACCEL_GENERIC &&
> > + hwaccel_device_type != AV_HWDEVICE_TYPE_NONE) {
> > + const AVCodec *c;
> > + void *i = NULL;
> > +
> > + while ((c = av_codec_iterate(&i))) {
> > + const AVCodecHWConfig *config;
> > +
> > + if (c->id != st->codecpar->codec_id ||
> > + !av_codec_is_decoder(c))
> > + continue;
> > +
> > + for (int j = 0; config = avcodec_get_hw_config(c, j); j++)
> > {
> > + if (config->device_type == hwaccel_device_type)
> > + return c;
>
> Maybe a verbose-level log message like
>
> "Selecting decoder '%s' because of requested hwaccel method %s\n",
> c->name, av_hwdevice_get_type_name(hwaccel_device_type)
>
> would be appropriate. No need to send a new patch, just add it (or not,
> as you like) and push.
Added log and applied patches, thx
-Haihao
>
_______________________________________________
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] 5+ messages in thread
end of thread, other threads:[~2022-08-03 3:20 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-02 7:56 [FFmpeg-devel] [PATCH v4 1/2] ffmpeg_opt: select a decoder after getting values for per-stream hwdec options Xiang, Haihao
2022-08-02 7:56 ` [FFmpeg-devel] [PATCH v4 2/2] ffmpeg_opt: consider HW acceleration method when selecting decoder Xiang, Haihao
2022-08-02 9:11 ` Anton Khirnov
2022-08-02 11:29 ` Anton Khirnov
2022-08-03 3:20 ` Xiang, Haihao
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