* [FFmpeg-devel] [PATCH 1/3 v3] avformat/vvc: fix writing general_constraint_info bytes
@ 2024-05-17 13:42 James Almer
2024-05-17 13:42 ` [FFmpeg-devel] [PATCH 2/3] avformat/vvc: include additional bits in general_constraint_info James Almer
2024-05-17 13:42 ` [FFmpeg-devel] [PATCH 3/3] configure: split ISOBMFF writer helpers into a separate component James Almer
0 siblings, 2 replies; 3+ messages in thread
From: James Almer @ 2024-05-17 13:42 UTC (permalink / raw)
To: ffmpeg-devel
The existing implementation was completely broken.
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavformat/Makefile | 2 +-
libavformat/bitstream.c | 1 +
libavformat/vvc.c | 38 ++++++++++++++++++++------------------
tests/ref/fate/source | 1 +
4 files changed, 23 insertions(+), 19 deletions(-)
create mode 100644 libavformat/bitstream.c
diff --git a/libavformat/Makefile b/libavformat/Makefile
index 2d4e0e0c95..211ccf45e5 100644
--- a/libavformat/Makefile
+++ b/libavformat/Makefile
@@ -727,7 +727,7 @@ OBJS-$(CONFIG_LIBSSH_PROTOCOL) += libssh.o
OBJS-$(CONFIG_LIBZMQ_PROTOCOL) += libzmq.o
# Objects duplicated from other libraries for shared builds
-SHLIBOBJS += log2_tab.o to_upper4.o
+SHLIBOBJS += log2_tab.o to_upper4.o bitstream.o
SHLIBOBJS-$(CONFIG_ISO_MEDIA) += mpegaudiotabs.o
SHLIBOBJS-$(CONFIG_FLV_MUXER) += mpeg4audio_sample_rates.o
SHLIBOBJS-$(CONFIG_HLS_DEMUXER) += ac3_channel_layout_tab.o
diff --git a/libavformat/bitstream.c b/libavformat/bitstream.c
new file mode 100644
index 0000000000..2afda37c30
--- /dev/null
+++ b/libavformat/bitstream.c
@@ -0,0 +1 @@
+#include "libavcodec/bitstream.c"
diff --git a/libavformat/vvc.c b/libavformat/vvc.c
index 3123cd8d83..98177a7ad8 100644
--- a/libavformat/vvc.c
+++ b/libavformat/vvc.c
@@ -21,6 +21,7 @@
*/
#include "libavcodec/get_bits.h"
+#include "libavcodec/put_bits.h"
#include "libavcodec/golomb.h"
#include "libavcodec/vvc.h"
#include "libavutil/intreadwrite.h"
@@ -138,9 +139,8 @@ static void vvcc_update_ptl(VVCDecoderConfigurationRecord *vvcc,
vvcc->ptl.num_bytes_constraint_info = 9;
memcpy(&vvcc->ptl.general_constraint_info[0],
&ptl->gci_general_constraints[0], sizeof(uint8_t) * 9);
-
} else {
- vvcc->ptl.num_bytes_constraint_info = 1;
+ vvcc->ptl.num_bytes_constraint_info = 0;
memset(&vvcc->ptl.general_constraint_info[0], 0, sizeof(uint8_t) * 9);
}
@@ -185,7 +185,7 @@ static void vvcc_parse_ptl(GetBitContext *gb,
unsigned int profileTierPresentFlag,
unsigned int max_sub_layers_minus1)
{
- VVCCProfileTierLevel general_ptl;
+ VVCCProfileTierLevel general_ptl = { 0 };
int j;
if (profileTierPresentFlag) {
@@ -326,6 +326,7 @@ static int vvcc_parse_vps(GetBitContext *gb,
for (int i = 0; i <= vps_num_ptls_minus1; i++)
vvcc_parse_ptl(gb, vvcc, vps_pt_present_flag[i], vps_ptl_max_tid[i]);
+ vvcc->ptl_present_flag = 1;
/* nothing useful for vvcc past this point */
return 0;
@@ -356,8 +357,10 @@ static int vvcc_parse_sps(GetBitContext *gb,
vvcc->chroma_format_idc = get_bits(gb, 2);
sps_log2_ctu_size_minus5 = get_bits(gb, 2);
- if (get_bits1(gb)) // sps_ptl_dpb_hrd_params_present_flag
+ if (get_bits1(gb)) { // sps_ptl_dpb_hrd_params_present_flag
+ vvcc->ptl_present_flag = 1;
vvcc_parse_ptl(gb, vvcc, 1, sps_max_sublayers_minus1);
+ }
skip_bits1(gb); // sps_gdr_enabled_flag
if (get_bits(gb, 1)) // sps_ref_pic_resampling_enabled_flag
@@ -579,10 +582,6 @@ static void vvcc_init(VVCDecoderConfigurationRecord *vvcc)
{
memset(vvcc, 0, sizeof(VVCDecoderConfigurationRecord));
vvcc->lengthSizeMinusOne = 3; // 4 bytes
-
- vvcc->ptl.num_bytes_constraint_info = 1;
-
- vvcc->ptl_present_flag = 1;
}
static void vvcc_close(VVCDecoderConfigurationRecord *vvcc)
@@ -603,7 +602,6 @@ static int vvcc_write(AVIOContext *pb, VVCDecoderConfigurationRecord *vvcc)
{
uint8_t i;
uint16_t j, vps_count = 0, sps_count = 0, pps_count = 0;
- unsigned char *buf = NULL;
/*
* It's unclear how to properly compute these fields, so
* let's always set them to values meaning 'unspecified'.
@@ -735,6 +733,10 @@ static int vvcc_write(AVIOContext *pb, VVCDecoderConfigurationRecord *vvcc)
avio_w8(pb, vvcc->lengthSizeMinusOne << 1 | vvcc->ptl_present_flag | 0xf8);
if (vvcc->ptl_present_flag) {
+ uint8_t buf[64];
+ PutBitContext pbc;
+
+ init_put_bits(&pbc, buf, sizeof(buf));
/*
* unsigned int(9) ols_idx;
* unsigned int(3) num_sublayers;
@@ -766,15 +768,15 @@ static int vvcc_write(AVIOContext *pb, VVCDecoderConfigurationRecord *vvcc)
* unsigned int (1) ptl_frame_only_constraint_flag
* unsigned int (1) ptl_multilayer_enabled_flag
* unsigned int (8*num_bytes_constraint_info -2) general_constraint_info */
- buf =
- (unsigned char *) malloc(sizeof(unsigned char) *
- vvcc->ptl.num_bytes_constraint_info);
- *buf = vvcc->ptl.ptl_frame_only_constraint_flag << vvcc->ptl.
- num_bytes_constraint_info * 8 - 1 | vvcc->ptl.
- ptl_multilayer_enabled_flag << vvcc->ptl.num_bytes_constraint_info *
- 8 - 2 | *vvcc->ptl.general_constraint_info >> 2;
- avio_write(pb, buf, vvcc->ptl.num_bytes_constraint_info);
- free(buf);
+ put_bits(&pbc, 1, vvcc->ptl.ptl_frame_only_constraint_flag);
+ put_bits(&pbc, 1, vvcc->ptl.ptl_multilayer_enabled_flag);
+ if (vvcc->ptl.num_bytes_constraint_info) {
+ ff_copy_bits(&pbc, vvcc->ptl.general_constraint_info, (vvcc->ptl.num_bytes_constraint_info - 1) * 8);
+ put_bits(&pbc, 6, vvcc->ptl.general_constraint_info[vvcc->ptl.num_bytes_constraint_info - 1] & 0x3f);
+ } else
+ put_bits(&pbc, 6, 0);
+ flush_put_bits(&pbc);
+ avio_write(pb, buf, put_bytes_count(&pbc, 1));
if (vvcc->num_sublayers > 1) {
uint8_t ptl_sublayer_level_present_flags = 0;
diff --git a/tests/ref/fate/source b/tests/ref/fate/source
index 7b5f14b4f0..d8d4224145 100644
--- a/tests/ref/fate/source
+++ b/tests/ref/fate/source
@@ -10,6 +10,7 @@ libavdevice/reverse.c
libavfilter/af_arnndn.c
libavfilter/file_open.c
libavfilter/log2_tab.c
+libavformat/bitstream.c
libavformat/file_open.c
libavformat/golomb_tab.c
libavformat/log2_tab.c
--
2.45.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] 3+ messages in thread
* [FFmpeg-devel] [PATCH 2/3] avformat/vvc: include additional bits in general_constraint_info
2024-05-17 13:42 [FFmpeg-devel] [PATCH 1/3 v3] avformat/vvc: fix writing general_constraint_info bytes James Almer
@ 2024-05-17 13:42 ` James Almer
2024-05-17 13:42 ` [FFmpeg-devel] [PATCH 3/3] configure: split ISOBMFF writer helpers into a separate component James Almer
1 sibling, 0 replies; 3+ messages in thread
From: James Almer @ 2024-05-17 13:42 UTC (permalink / raw)
To: ffmpeg-devel
Based on code from cbs_h266.
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavformat/vvc.c | 30 ++++++++++++++++++------------
1 file changed, 18 insertions(+), 12 deletions(-)
diff --git a/libavformat/vvc.c b/libavformat/vvc.c
index 98177a7ad8..e8301d4247 100644
--- a/libavformat/vvc.c
+++ b/libavformat/vvc.c
@@ -46,7 +46,7 @@ typedef struct VVCPTLRecord {
uint8_t general_level_idc;
uint8_t ptl_frame_only_constraint_flag;
uint8_t ptl_multilayer_enabled_flag;
- uint8_t general_constraint_info[9];
+ uint8_t general_constraint_info[10];
uint8_t ptl_sublayer_level_present_flag[VVC_MAX_SUBLAYERS - 1];
uint8_t sublayer_level_idc[VVC_MAX_SUBLAYERS - 1];
uint8_t ptl_num_sub_profiles;
@@ -77,8 +77,8 @@ typedef struct VVCCProfileTierLevel {
uint8_t ptl_multilayer_enabled_flag;
// general_constraint_info
uint8_t gci_present_flag;
- uint8_t gci_general_constraints[9];
- uint8_t gci_num_reserved_bits;
+ uint8_t gci_general_constraints[10];
+ uint8_t num_bytes_constraint_info;
// end general_constraint_info
uint8_t ptl_sublayer_level_present_flag[VVC_MAX_SUBLAYERS - 1];
uint8_t sublayer_level_idc[VVC_MAX_SUBLAYERS - 1];
@@ -135,13 +135,12 @@ static void vvcc_update_ptl(VVCDecoderConfigurationRecord *vvcc,
/*
* Constraints Info
*/
+ vvcc->ptl.num_bytes_constraint_info = ptl->num_bytes_constraint_info;
if (ptl->gci_present_flag) {
- vvcc->ptl.num_bytes_constraint_info = 9;
memcpy(&vvcc->ptl.general_constraint_info[0],
- &ptl->gci_general_constraints[0], sizeof(uint8_t) * 9);
+ &ptl->gci_general_constraints[0], ptl->num_bytes_constraint_info);
} else {
- vvcc->ptl.num_bytes_constraint_info = 0;
- memset(&vvcc->ptl.general_constraint_info[0], 0, sizeof(uint8_t) * 9);
+ memset(&vvcc->ptl.general_constraint_info[0], 0, sizeof(vvcc->ptl.general_constraint_info));
}
/*
@@ -186,7 +185,6 @@ static void vvcc_parse_ptl(GetBitContext *gb,
unsigned int max_sub_layers_minus1)
{
VVCCProfileTierLevel general_ptl = { 0 };
- int j;
if (profileTierPresentFlag) {
general_ptl.profile_idc = get_bits(gb, 7);
@@ -199,12 +197,20 @@ static void vvcc_parse_ptl(GetBitContext *gb,
if (profileTierPresentFlag) { // parse constraint info
general_ptl.gci_present_flag = get_bits1(gb);
if (general_ptl.gci_present_flag) {
+ int gci_num_reserved_bits, j;
for (j = 0; j < 8; j++)
general_ptl.gci_general_constraints[j] = get_bits(gb, 8);
- general_ptl.gci_general_constraints[8] = get_bits(gb, 7);
-
- general_ptl.gci_num_reserved_bits = get_bits(gb, 8);
- skip_bits(gb, general_ptl.gci_num_reserved_bits);
+ general_ptl.gci_general_constraints[j++] = get_bits(gb, 7);
+
+ gci_num_reserved_bits = get_bits(gb, 8);
+ if (gci_num_reserved_bits > 5) {
+ general_ptl.gci_general_constraints[8] =
+ (general_ptl.gci_general_constraints[8] << 1) | get_bits1(gb);
+ general_ptl.gci_general_constraints[j++] = get_bits(gb, 5);
+ gci_num_reserved_bits -= 6;
+ }
+ general_ptl.num_bytes_constraint_info = j;
+ skip_bits(gb, gci_num_reserved_bits);
}
while (gb->index % 8 != 0)
skip_bits1(gb);
--
2.45.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] 3+ messages in thread
* [FFmpeg-devel] [PATCH 3/3] configure: split ISOBMFF writer helpers into a separate component
2024-05-17 13:42 [FFmpeg-devel] [PATCH 1/3 v3] avformat/vvc: fix writing general_constraint_info bytes James Almer
2024-05-17 13:42 ` [FFmpeg-devel] [PATCH 2/3] avformat/vvc: include additional bits in general_constraint_info James Almer
@ 2024-05-17 13:42 ` James Almer
1 sibling, 0 replies; 3+ messages in thread
From: James Almer @ 2024-05-17 13:42 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
configure | 10 ++++++----
libavformat/Makefile | 16 ++++++++--------
2 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/configure b/configure
index 275fa59bfd..b16722d83d 100755
--- a/configure
+++ b/configure
@@ -2587,6 +2587,7 @@ CONFIG_EXTRA="
inflate_wrapper
intrax8
iso_media
+ iso_writer
ividsp
jpegtables
lgplv3
@@ -3611,7 +3612,7 @@ evc_demuxer_select="evc_frame_merge_bsf evc_parser"
f4v_muxer_select="mov_muxer"
fifo_muxer_deps="threads"
flac_demuxer_select="flac_parser"
-flv_muxer_select="aac_adtstoasc_bsf"
+flv_muxer_select="aac_adtstoasc_bsf iso_writer"
gxf_muxer_select="pcm_rechunk_bsf"
hds_muxer_select="flv_muxer"
hls_demuxer_select="aac_demuxer ac3_demuxer adts_header ac3_parser eac3_demuxer mov_demuxer mpegts_demuxer"
@@ -3629,12 +3630,12 @@ latm_muxer_select="aac_adtstoasc_bsf mpeg4audio"
matroska_audio_muxer_select="matroska_muxer"
matroska_demuxer_select="riffdec"
matroska_demuxer_suggest="bzlib zlib"
-matroska_muxer_select="mpeg4audio riffenc aac_adtstoasc_bsf pgs_frame_merge_bsf vp9_superframe_bsf"
+matroska_muxer_select="iso_writer mpeg4audio riffenc aac_adtstoasc_bsf pgs_frame_merge_bsf vp9_superframe_bsf"
mlp_demuxer_select="mlp_parser"
mmf_muxer_select="riffenc"
mov_demuxer_select="iso_media riffdec"
mov_demuxer_suggest="iamfdec zlib"
-mov_muxer_select="iso_media riffenc rtpenc_chain vp9_superframe_bsf aac_adtstoasc_bsf ac3_parser"
+mov_muxer_select="iso_media iso_writer riffenc rtpenc_chain vp9_superframe_bsf aac_adtstoasc_bsf ac3_parser"
mov_muxer_suggest="iamfenc"
mp3_demuxer_select="mpegaudio_parser"
mp3_muxer_select="mpegaudioheader"
@@ -3642,7 +3643,7 @@ mp4_muxer_select="mov_muxer"
mpegts_demuxer_select="iso_media"
mpegts_muxer_select="ac3_parser adts_muxer latm_muxer h264_mp4toannexb_bsf hevc_mp4toannexb_bsf vvc_mp4toannexb_bsf"
mpegtsraw_demuxer_select="mpegts_demuxer"
-mxf_muxer_select="pcm_rechunk_bsf rangecoder"
+mxf_muxer_select="iso_writer pcm_rechunk_bsf rangecoder"
mxf_d10_muxer_select="mxf_muxer"
mxf_opatom_muxer_select="mxf_muxer"
nut_muxer_select="riffenc"
@@ -3655,6 +3656,7 @@ ogv_muxer_select="ogg_muxer"
opus_muxer_select="ogg_muxer"
psp_muxer_select="mov_muxer"
rtp_demuxer_select="sdp_demuxer"
+rtp_muxer_select="iso_writer"
rtp_mpegts_muxer_select="mpegts_muxer rtp_muxer"
rtpdec_select="asf_demuxer mov_demuxer mpegts_demuxer rm_demuxer rtp_protocol srtp"
rtsp_demuxer_select="http_protocol rtpdec"
diff --git a/libavformat/Makefile b/libavformat/Makefile
index 211ccf45e5..1c4d9deccd 100644
--- a/libavformat/Makefile
+++ b/libavformat/Makefile
@@ -35,6 +35,7 @@ OBJS-$(HAVE_LIBC_MSVCRT) += file_open.o
# subsystems
OBJS-$(CONFIG_ISO_MEDIA) += isom.o
+OBJS-$(CONFIG_ISO_WRITER) += av1.o avc.o hevc.o vvc.o vpcc.o
OBJS-$(CONFIG_IAMFDEC) += iamf_reader.o iamf_parse.o iamf.o
OBJS-$(CONFIG_IAMFENC) += iamf_writer.o iamf.o
OBJS-$(CONFIG_NETWORK) += network.o
@@ -220,7 +221,7 @@ OBJS-$(CONFIG_FLAC_MUXER) += flacenc.o flacenc_header.o \
OBJS-$(CONFIG_FLIC_DEMUXER) += flic.o
OBJS-$(CONFIG_FLV_DEMUXER) += flvdec.o
OBJS-$(CONFIG_LIVE_FLV_DEMUXER) += flvdec.o
-OBJS-$(CONFIG_FLV_MUXER) += flvenc.o avc.o hevc.o av1.o vpcc.o
+OBJS-$(CONFIG_FLV_MUXER) += flvenc.o
OBJS-$(CONFIG_FOURXM_DEMUXER) += 4xm.o
OBJS-$(CONFIG_FRAMECRC_MUXER) += framecrcenc.o framehash.o
OBJS-$(CONFIG_FRAMEHASH_MUXER) += hashenc.o framehash.o
@@ -260,7 +261,7 @@ OBJS-$(CONFIG_HEVC_MUXER) += rawenc.o
OBJS-$(CONFIG_EVC_DEMUXER) += evcdec.o rawdec.o
OBJS-$(CONFIG_EVC_MUXER) += rawenc.o
OBJS-$(CONFIG_HLS_DEMUXER) += hls.o hls_sample_encryption.o
-OBJS-$(CONFIG_HLS_MUXER) += hlsenc.o hlsplaylist.o avc.o
+OBJS-$(CONFIG_HLS_MUXER) += hlsenc.o hlsplaylist.o
OBJS-$(CONFIG_HNM_DEMUXER) += hnm.o
OBJS-$(CONFIG_IAMF_DEMUXER) += iamfdec.o
OBJS-$(CONFIG_IAMF_MUXER) += iamfenc.o
@@ -349,7 +350,6 @@ OBJS-$(CONFIG_MATROSKA_DEMUXER) += matroskadec.o matroska.o \
oggparsevorbis.o vorbiscomment.o \
qtpalette.o replaygain.o dovi_isom.o
OBJS-$(CONFIG_MATROSKA_MUXER) += matroskaenc.o matroska.o \
- av1.o avc.o hevc.o vvc.o\
flacenc_header.o avlanguage.o \
vorbiscomment.o wv.o dovi_isom.o
OBJS-$(CONFIG_MCA_DEMUXER) += mca.o
@@ -371,7 +371,7 @@ OBJS-$(CONFIG_MODS_DEMUXER) += mods.o
OBJS-$(CONFIG_MOFLEX_DEMUXER) += moflex.o
OBJS-$(CONFIG_MOV_DEMUXER) += mov.o mov_chan.o mov_esds.o \
qtpalette.o replaygain.o dovi_isom.o
-OBJS-$(CONFIG_MOV_MUXER) += movenc.o av1.o avc.o hevc.o vvc.o vpcc.o \
+OBJS-$(CONFIG_MOV_MUXER) += movenc.o \
movenchint.o mov_chan.o rtp.o \
movenccenc.o movenc_ttml.o rawutils.o \
dovi_isom.o evc.o
@@ -404,7 +404,7 @@ OBJS-$(CONFIG_MUSX_DEMUXER) += musx.o
OBJS-$(CONFIG_MV_DEMUXER) += mvdec.o
OBJS-$(CONFIG_MVI_DEMUXER) += mvi.o
OBJS-$(CONFIG_MXF_DEMUXER) += mxfdec.o mxf.o avlanguage.o
-OBJS-$(CONFIG_MXF_MUXER) += mxfenc.o mxf.o avc.o
+OBJS-$(CONFIG_MXF_MUXER) += mxfenc.o mxf.o
OBJS-$(CONFIG_MXG_DEMUXER) += mxg.o
OBJS-$(CONFIG_NC_DEMUXER) += ncdec.o
OBJS-$(CONFIG_NISTSPHERE_DEMUXER) += nistspheredec.o pcm.o
@@ -526,8 +526,7 @@ OBJS-$(CONFIG_RTP_MUXER) += rtp.o \
rtpenc_vc2hq.o \
rtpenc_vp8.o \
rtpenc_vp9.o \
- rtpenc_xiph.o \
- avc.o hevc.o vvc.o
+ rtpenc_xiph.o
OBJS-$(CONFIG_RTSP_DEMUXER) += rtsp.o rtspdec.o httpauth.o \
urldecode.o
OBJS-$(CONFIG_RTSP_MUXER) += rtsp.o rtspenc.o httpauth.o \
@@ -727,8 +726,9 @@ OBJS-$(CONFIG_LIBSSH_PROTOCOL) += libssh.o
OBJS-$(CONFIG_LIBZMQ_PROTOCOL) += libzmq.o
# Objects duplicated from other libraries for shared builds
-SHLIBOBJS += log2_tab.o to_upper4.o bitstream.o
+SHLIBOBJS += log2_tab.o to_upper4.o
SHLIBOBJS-$(CONFIG_ISO_MEDIA) += mpegaudiotabs.o
+SHLIBOBJS-$(CONFIG_ISO_WRITER) += bitstream.o
SHLIBOBJS-$(CONFIG_FLV_MUXER) += mpeg4audio_sample_rates.o
SHLIBOBJS-$(CONFIG_HLS_DEMUXER) += ac3_channel_layout_tab.o
SHLIBOBJS-$(CONFIG_IMAGE_JPEGXL_PIPE_DEMUXER) += jpegxl_parse.o
--
2.45.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] 3+ messages in thread
end of thread, other threads:[~2024-05-17 13:43 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-05-17 13:42 [FFmpeg-devel] [PATCH 1/3 v3] avformat/vvc: fix writing general_constraint_info bytes James Almer
2024-05-17 13:42 ` [FFmpeg-devel] [PATCH 2/3] avformat/vvc: include additional bits in general_constraint_info James Almer
2024-05-17 13:42 ` [FFmpeg-devel] [PATCH 3/3] configure: split ISOBMFF writer helpers into a separate component James Almer
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