Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH 1/6] libavcodec/qsvenc: Add max_frame_size reset support to qsv
@ 2022-08-18  6:59 Wenbin Chen
  2022-08-18  6:59 ` [FFmpeg-devel] [PATCH 2/6] libavcodec/qsvenc: Add gop_size reset support to qsvenc Wenbin Chen
                   ` (4 more replies)
  0 siblings, 5 replies; 8+ messages in thread
From: Wenbin Chen @ 2022-08-18  6:59 UTC (permalink / raw)
  To: ffmpeg-devel

Signed-off-by: Wenbin Chen <wenbin.chen@intel.com>
---
 doc/encoders.texi   |  4 ++++
 libavcodec/qsvenc.c | 20 ++++++++++++++++++++
 libavcodec/qsvenc.h |  2 ++
 3 files changed, 26 insertions(+)

diff --git a/doc/encoders.texi b/doc/encoders.texi
index 6d73f74196..69fa46f3ea 100644
--- a/doc/encoders.texi
+++ b/doc/encoders.texi
@@ -3344,6 +3344,10 @@ Following options can be used durning qsv encoding.
 @item @var{b_quant_offset}
 Supported in h264_qsv and hevc_qsv.
 Change these value to reset qsv codec's qp configuration.
+
+@item @var{max_frame_size}
+Supported in h264_qsv and hevc_qsv.
+Change this value to reset qsv codec's MaxFrameSize configuration.
 @end table
 
 @subsection H264 options
diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index 4831640868..c911b81e7d 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -828,6 +828,7 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q)
                 q->extco2.ExtBRC = q->extbrc ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
             if (q->max_frame_size >= 0)
                 q->extco2.MaxFrameSize = q->max_frame_size;
+            q->old_max_frame_size = q->max_frame_size;
             if (q->int_ref_type >= 0)
                 q->extco2.IntRefType = q->int_ref_type;
             if (q->int_ref_cycle_size >= 0)
@@ -1673,6 +1674,24 @@ static int update_qp(AVCodecContext *avctx, QSVEncContext *q)
     return updated;
 }
 
+static int update_max_frame_size(AVCodecContext *avctx, QSVEncContext *q)
+{
+    int updated = 0;
+
+    if (avctx->codec_id != AV_CODEC_ID_H264 && avctx->codec_id != AV_CODEC_ID_HEVC)
+        return 0;
+
+    UPDATE_PARAM(q->old_max_frame_size, q->max_frame_size);
+    if (!updated)
+        return 0;
+
+    q->extco2.MaxFrameSize  = FFMAX(0, q->max_frame_size);
+    av_log(avctx, AV_LOG_DEBUG,
+           "Reset MaxFrameSize: %d;\n", q->extco2.MaxFrameSize);
+
+    return updated;
+}
+
 static int update_parameters(AVCodecContext *avctx, QSVEncContext *q,
                              const AVFrame *frame)
 {
@@ -1682,6 +1701,7 @@ static int update_parameters(AVCodecContext *avctx, QSVEncContext *q,
         return 0;
 
     needReset = update_qp(avctx, q);
+    needReset |= update_max_frame_size(avctx, q);
     if (!needReset)
         return 0;
 
diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h
index d35a1318f2..c452c5b806 100644
--- a/libavcodec/qsvenc.h
+++ b/libavcodec/qsvenc.h
@@ -235,6 +235,8 @@ typedef struct QSVEncContext {
     float old_i_quant_offset;
     float old_b_quant_factor;
     float old_b_quant_offset;
+    // This is used for max_frame_size reset
+    int old_max_frame_size;
 } QSVEncContext;
 
 int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q);
-- 
2.32.0

_______________________________________________
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] 8+ messages in thread

* [FFmpeg-devel] [PATCH 2/6] libavcodec/qsvenc: Add gop_size reset support to qsvenc
  2022-08-18  6:59 [FFmpeg-devel] [PATCH 1/6] libavcodec/qsvenc: Add max_frame_size reset support to qsv Wenbin Chen
@ 2022-08-18  6:59 ` Wenbin Chen
  2022-09-06  1:53   ` Xiang, Haihao
  2022-08-18  6:59 ` [FFmpeg-devel] [PATCH 3/6] libavcodec/qsvenc: Add "slice" intra refresh type " Wenbin Chen
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 8+ messages in thread
From: Wenbin Chen @ 2022-08-18  6:59 UTC (permalink / raw)
  To: ffmpeg-devel

Signed-off-by: Wenbin Chen <wenbin.chen@intel.com>
---
 doc/encoders.texi   |  3 +++
 libavcodec/qsvenc.c | 18 +++++++++++++++++-
 libavcodec/qsvenc.h |  2 ++
 3 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/doc/encoders.texi b/doc/encoders.texi
index 69fa46f3ea..9fb63856b1 100644
--- a/doc/encoders.texi
+++ b/doc/encoders.texi
@@ -3348,6 +3348,9 @@ Change these value to reset qsv codec's qp configuration.
 @item @var{max_frame_size}
 Supported in h264_qsv and hevc_qsv.
 Change this value to reset qsv codec's MaxFrameSize configuration.
+
+@item @var{gop_size}
+Change this value to reset qsv codec's gop configuration.
 @end table
 
 @subsection H264 options
diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index c911b81e7d..b3820e4fe0 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -635,6 +635,7 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q)
     q->param.mfx.CodecProfile       = q->profile;
     q->param.mfx.TargetUsage        = avctx->compression_level;
     q->param.mfx.GopPicSize         = FFMAX(0, avctx->gop_size);
+    q->old_gop_size                 = avctx->gop_size;
     q->param.mfx.GopRefDist         = FFMAX(-1, avctx->max_b_frames) + 1;
     q->param.mfx.GopOptFlag         = avctx->flags & AV_CODEC_FLAG_CLOSED_GOP ?
                                       MFX_GOP_CLOSED : MFX_GOP_STRICT;
@@ -1692,16 +1693,31 @@ static int update_max_frame_size(AVCodecContext *avctx, QSVEncContext *q)
     return updated;
 }
 
+static int update_gop_size(AVCodecContext *avctx, QSVEncContext *q)
+{
+    int updated = 0;
+    UPDATE_PARAM(q->old_gop_size, avctx->gop_size);
+    if (!updated)
+        return 0;
+
+    q->param.mfx.GopPicSize = FFMAX(0, avctx->gop_size);
+    av_log(avctx, AV_LOG_DEBUG, "reset GopPicSize to %d\n",
+           q->param.mfx.GopPicSize);
+
+    return updated;
+}
+
 static int update_parameters(AVCodecContext *avctx, QSVEncContext *q,
                              const AVFrame *frame)
 {
     int needReset = 0, ret = 0;
 
-    if (!frame)
+    if (!frame || avctx->codec_id == AV_CODEC_ID_MJPEG)
         return 0;
 
     needReset = update_qp(avctx, q);
     needReset |= update_max_frame_size(avctx, q);
+    needReset |= update_gop_size(avctx, q);
     if (!needReset)
         return 0;
 
diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h
index c452c5b806..fdedae28dd 100644
--- a/libavcodec/qsvenc.h
+++ b/libavcodec/qsvenc.h
@@ -237,6 +237,8 @@ typedef struct QSVEncContext {
     float old_b_quant_offset;
     // This is used for max_frame_size reset
     int old_max_frame_size;
+    // This is used for gop reset
+    int old_gop_size;
 } QSVEncContext;
 
 int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q);
-- 
2.32.0

_______________________________________________
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] 8+ messages in thread

* [FFmpeg-devel] [PATCH 3/6] libavcodec/qsvenc: Add "slice" intra refresh type to qsvenc
  2022-08-18  6:59 [FFmpeg-devel] [PATCH 1/6] libavcodec/qsvenc: Add max_frame_size reset support to qsv Wenbin Chen
  2022-08-18  6:59 ` [FFmpeg-devel] [PATCH 2/6] libavcodec/qsvenc: Add gop_size reset support to qsvenc Wenbin Chen
@ 2022-08-18  6:59 ` Wenbin Chen
  2022-08-18  6:59 ` [FFmpeg-devel] [PATCH 4/6] libavcodec/qsvenc: Add intra refresh reset support " Wenbin Chen
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Wenbin Chen @ 2022-08-18  6:59 UTC (permalink / raw)
  To: ffmpeg-devel

Add "slice" intra refresh type to h264_qsv and hevc_qsv. This type means
horizontal refresh by slices without overlapping. Also update the doc.

Signed-off-by: Wenbin Chen <wenbin.chen@intel.com>
---
 doc/encoders.texi        | 12 ++++++++----
 libavcodec/qsvenc_h264.c |  1 +
 libavcodec/qsvenc_hevc.c |  1 +
 3 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/doc/encoders.texi b/doc/encoders.texi
index 9fb63856b1..48fe73fd33 100644
--- a/doc/encoders.texi
+++ b/doc/encoders.texi
@@ -3454,8 +3454,10 @@ Specifies intra refresh type. The major goal of intra refresh is improvement of
 error resilience without significant impact on encoded bitstream size caused by
 I frames. The SDK encoder achieves this by encoding part of each frame in
 refresh cycle using intra MBs. @var{none} means no refresh. @var{vertical} means
-vertical refresh, by column of MBs. To enable intra refresh, B frame should be
-set to 0.
+vertical refresh, by column of MBs. @var{horizontal} means horizontal refresh,
+by rows of MBs. @var{slice} means horizontal refresh by slices without
+overlapping. In case of @var{slice}, in_ref_cycle_size is ignored. To enable
+intra refresh, B frame should be set to 0.
 
 @item @var{int_ref_cycle_size}
 Specifies number of pictures within refresh cycle starting from 2. 0 and 1 are
@@ -3619,8 +3621,10 @@ Specifies intra refresh type. The major goal of intra refresh is improvement of
 error resilience without significant impact on encoded bitstream size caused by
 I frames. The SDK encoder achieves this by encoding part of each frame in
 refresh cycle using intra MBs. @var{none} means no refresh. @var{vertical} means
-vertical refresh, by column of MBs. To enable intra refresh, B frame should be
-set to 0.
+vertical refresh, by column of MBs. @var{horizontal} means horizontal refresh,
+by rows of MBs. @var{slice} means horizontal refresh by slices without
+overlapping. In case of @var{slice}, in_ref_cycle_size is ignored. To enable
+intra refresh, B frame should be set to 0.
 
 @item @var{int_ref_cycle_size}
 Specifies number of pictures within refresh cycle starting from 2. 0 and 1 are
diff --git a/libavcodec/qsvenc_h264.c b/libavcodec/qsvenc_h264.c
index ad9cf629df..b589fccc89 100644
--- a/libavcodec/qsvenc_h264.c
+++ b/libavcodec/qsvenc_h264.c
@@ -138,6 +138,7 @@ static const AVOption options[] = {
         { "none",     NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, .flags = VE, "int_ref_type" },
         { "vertical", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, .flags = VE, "int_ref_type" },
         { "horizontal", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 2 }, .flags = VE, "int_ref_type" },
+        { "slice"     , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 3 }, .flags = VE, "int_ref_type" },
     { "int_ref_cycle_size", "Number of frames in the intra refresh cycle",       OFFSET(qsv.int_ref_cycle_size),      AV_OPT_TYPE_INT, { .i64 = -1 },               -1, UINT16_MAX, VE },
     { "int_ref_qp_delta",   "QP difference for the refresh MBs",                 OFFSET(qsv.int_ref_qp_delta),        AV_OPT_TYPE_INT, { .i64 = INT16_MIN }, INT16_MIN,  INT16_MAX, VE },
     { "recovery_point_sei", "Insert recovery point SEI messages",                OFFSET(qsv.recovery_point_sei),      AV_OPT_TYPE_INT, { .i64 = -1 },               -1,          1, VE },
diff --git a/libavcodec/qsvenc_hevc.c b/libavcodec/qsvenc_hevc.c
index e11f5dec4a..8fcf8b2cef 100644
--- a/libavcodec/qsvenc_hevc.c
+++ b/libavcodec/qsvenc_hevc.c
@@ -267,6 +267,7 @@ static const AVOption options[] = {
         { "none",     NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, .flags = VE, "int_ref_type" },
         { "vertical", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, .flags = VE, "int_ref_type" },
         { "horizontal", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 2 }, .flags = VE, "int_ref_type" },
+        { "slice"     , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 3 }, .flags = VE, "int_ref_type" },
     { "int_ref_cycle_size", "Number of frames in the intra refresh cycle",       OFFSET(qsv.int_ref_cycle_size),      AV_OPT_TYPE_INT, { .i64 = -1 },               -1, UINT16_MAX, VE },
     { "int_ref_qp_delta",   "QP difference for the refresh MBs",                 OFFSET(qsv.int_ref_qp_delta),        AV_OPT_TYPE_INT, { .i64 = INT16_MIN }, INT16_MIN,  INT16_MAX, VE },
     { "int_ref_cycle_dist",   "Distance between the beginnings of the intra-refresh cycles in frames",  OFFSET(qsv.int_ref_cycle_dist),      AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT16_MAX, VE },
-- 
2.32.0

_______________________________________________
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] 8+ messages in thread

* [FFmpeg-devel] [PATCH 4/6] libavcodec/qsvenc: Add intra refresh reset support to qsvenc
  2022-08-18  6:59 [FFmpeg-devel] [PATCH 1/6] libavcodec/qsvenc: Add max_frame_size reset support to qsv Wenbin Chen
  2022-08-18  6:59 ` [FFmpeg-devel] [PATCH 2/6] libavcodec/qsvenc: Add gop_size reset support to qsvenc Wenbin Chen
  2022-08-18  6:59 ` [FFmpeg-devel] [PATCH 3/6] libavcodec/qsvenc: Add "slice" intra refresh type " Wenbin Chen
@ 2022-08-18  6:59 ` Wenbin Chen
  2022-08-18  6:59 ` [FFmpeg-devel] [PATCH 5/6] libavcodec/qsvenc: Add max/min qp reset support in qsvenc Wenbin Chen
  2022-08-18  6:59 ` [FFmpeg-devel] [PATCH 6/6] libavcodec/qsvenc: Add low_delay_brc reset support to qsvenc Wenbin Chen
  4 siblings, 0 replies; 8+ messages in thread
From: Wenbin Chen @ 2022-08-18  6:59 UTC (permalink / raw)
  To: ffmpeg-devel

Signed-off-by: Wenbin Chen <wenbin.chen@intel.com>
---
 doc/encoders.texi   |  7 +++++++
 libavcodec/qsvenc.c | 33 +++++++++++++++++++++++++++++++++
 libavcodec/qsvenc.h |  5 +++++
 3 files changed, 45 insertions(+)

diff --git a/doc/encoders.texi b/doc/encoders.texi
index 48fe73fd33..b28b1f7f0b 100644
--- a/doc/encoders.texi
+++ b/doc/encoders.texi
@@ -3351,6 +3351,13 @@ Change this value to reset qsv codec's MaxFrameSize configuration.
 
 @item @var{gop_size}
 Change this value to reset qsv codec's gop configuration.
+
+@item @var{int_ref_type}
+@item @var{int_ref_cycle_size}
+@item @var{int_ref_qp_delta}
+@item @var{int_ref_cycle_dist}
+Supported in h264_qsv and hevc_qsv.
+Change these value to reset qsv codec's Intra Refresh configuration.
 @end table
 
 @subsection H264 options
diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index b3820e4fe0..dbb1f49101 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -832,10 +832,13 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q)
             q->old_max_frame_size = q->max_frame_size;
             if (q->int_ref_type >= 0)
                 q->extco2.IntRefType = q->int_ref_type;
+            q->old_int_ref_type = q->int_ref_type;
             if (q->int_ref_cycle_size >= 0)
                 q->extco2.IntRefCycleSize = q->int_ref_cycle_size;
+            q->old_int_ref_cycle_size = q->int_ref_cycle_size;
             if (q->int_ref_qp_delta != INT16_MIN)
                 q->extco2.IntRefQPDelta = q->int_ref_qp_delta;
+            q->old_int_ref_qp_delta = q->int_ref_qp_delta;
             if (q->max_slice_size >= 0)
                 q->extco2.MaxSliceSize = q->max_slice_size;
             q->extco2.DisableDeblockingIdc = q->dblk_idc;
@@ -920,6 +923,7 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q)
             }
             if (q->int_ref_cycle_dist >= 0)
                 q->extco3.IntRefCycleDist = q->int_ref_cycle_dist;
+            q->old_int_ref_cycle_dist = q->int_ref_cycle_dist;
             if (q->low_delay_brc >= 0)
                 q->extco3.LowDelayBRC = q->low_delay_brc ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
             if (q->max_frame_size_i >= 0)
@@ -1707,6 +1711,34 @@ static int update_gop_size(AVCodecContext *avctx, QSVEncContext *q)
     return updated;
 }
 
+static int update_rir(AVCodecContext *avctx, QSVEncContext *q)
+{
+    int updated = 0;
+
+    if (avctx->codec_id != AV_CODEC_ID_H264 && avctx->codec_id != AV_CODEC_ID_HEVC)
+        return 0;
+
+    UPDATE_PARAM(q->old_int_ref_type, q->int_ref_type);
+    UPDATE_PARAM(q->old_int_ref_cycle_size, q->int_ref_cycle_size);
+    UPDATE_PARAM(q->old_int_ref_qp_delta, q->int_ref_qp_delta);
+    UPDATE_PARAM(q->old_int_ref_cycle_dist, q->int_ref_cycle_dist);
+    if (!updated)
+        return 0;
+
+    q->extco2.IntRefType      = FFMAX(0, q->int_ref_type);
+    q->extco2.IntRefCycleSize = FFMAX(0, q->int_ref_cycle_size);
+    q->extco2.IntRefQPDelta   =
+        q->int_ref_qp_delta != INT16_MIN ? q->int_ref_qp_delta : 0;
+    q->extco3.IntRefCycleDist = FFMAX(0, q->int_ref_cycle_dist);
+    av_log(avctx, AV_LOG_DEBUG,
+           "Reset IntRefType: %d; IntRefCycleSize: %d; "
+           "IntRefQPDelta: %d; IntRefCycleDist: %d\n",
+           q->extco2.IntRefType, q->extco2.IntRefCycleSize,
+           q->extco2.IntRefQPDelta, q->extco3.IntRefCycleDist);
+
+    return updated;
+}
+
 static int update_parameters(AVCodecContext *avctx, QSVEncContext *q,
                              const AVFrame *frame)
 {
@@ -1718,6 +1750,7 @@ static int update_parameters(AVCodecContext *avctx, QSVEncContext *q,
     needReset = update_qp(avctx, q);
     needReset |= update_max_frame_size(avctx, q);
     needReset |= update_gop_size(avctx, q);
+    needReset |= update_rir(avctx, q);
     if (!needReset)
         return 0;
 
diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h
index fdedae28dd..5a395d422e 100644
--- a/libavcodec/qsvenc.h
+++ b/libavcodec/qsvenc.h
@@ -239,6 +239,11 @@ typedef struct QSVEncContext {
     int old_max_frame_size;
     // This is used for gop reset
     int old_gop_size;
+    // These are used for intra refresh reset
+    int old_int_ref_type;
+    int old_int_ref_cycle_size;
+    int old_int_ref_qp_delta;
+    int old_int_ref_cycle_dist;
 } QSVEncContext;
 
 int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q);
-- 
2.32.0

_______________________________________________
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] 8+ messages in thread

* [FFmpeg-devel] [PATCH 5/6] libavcodec/qsvenc: Add max/min qp reset support in qsvenc
  2022-08-18  6:59 [FFmpeg-devel] [PATCH 1/6] libavcodec/qsvenc: Add max_frame_size reset support to qsv Wenbin Chen
                   ` (2 preceding siblings ...)
  2022-08-18  6:59 ` [FFmpeg-devel] [PATCH 4/6] libavcodec/qsvenc: Add intra refresh reset support " Wenbin Chen
@ 2022-08-18  6:59 ` Wenbin Chen
  2022-08-18  6:59 ` [FFmpeg-devel] [PATCH 6/6] libavcodec/qsvenc: Add low_delay_brc reset support to qsvenc Wenbin Chen
  4 siblings, 0 replies; 8+ messages in thread
From: Wenbin Chen @ 2022-08-18  6:59 UTC (permalink / raw)
  To: ffmpeg-devel

Signed-off-by: Wenbin Chen <wenbin.chen@intel.com>
---
 doc/encoders.texi   | 11 +++++++
 libavcodec/qsvenc.c | 78 +++++++++++++++++++++++++++++++++++++++++++++
 libavcodec/qsvenc.h |  9 ++++++
 3 files changed, 98 insertions(+)

diff --git a/doc/encoders.texi b/doc/encoders.texi
index b28b1f7f0b..fad3cad30b 100644
--- a/doc/encoders.texi
+++ b/doc/encoders.texi
@@ -3358,6 +3358,17 @@ Change this value to reset qsv codec's gop configuration.
 @item @var{int_ref_cycle_dist}
 Supported in h264_qsv and hevc_qsv.
 Change these value to reset qsv codec's Intra Refresh configuration.
+
+@item @var{qmax}
+@item @var{qmin}
+@item @var{max_qp_i}
+@item @var{min_qp_i}
+@item @var{max_qp_p}
+@item @var{min_qp_p}
+@item @var{max_qp_b}
+@item @var{min_qp_b}
+Supported in h264_qsv.
+Change these value to reset qsv codec's max/min qp configuration.
 @end table
 
 @subsection H264 options
diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index dbb1f49101..3a3e6ccc9a 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -858,22 +858,30 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q)
                 q->extco2.MinQPI = avctx->qmin > 51 ? 51 : avctx->qmin;
                 q->extco2.MinQPP = q->extco2.MinQPB = q->extco2.MinQPI;
             }
+            q->old_qmin = avctx->qmin;
             if (avctx->qmax >= 0) {
                 q->extco2.MaxQPI = avctx->qmax > 51 ? 51 : avctx->qmax;
                 q->extco2.MaxQPP = q->extco2.MaxQPB = q->extco2.MaxQPI;
             }
+            q->old_qmax = avctx->qmax;
             if (q->min_qp_i >= 0)
                 q->extco2.MinQPI = q->min_qp_i > 51 ? 51 : q->min_qp_i;
+            q->old_min_qp_i = q->min_qp_i;
             if (q->max_qp_i >= 0)
                 q->extco2.MaxQPI = q->max_qp_i > 51 ? 51 : q->max_qp_i;
+            q->old_max_qp_i = q->max_qp_i;
             if (q->min_qp_p >= 0)
                 q->extco2.MinQPP = q->min_qp_p > 51 ? 51 : q->min_qp_p;
+            q->old_min_qp_p = q->min_qp_p;
             if (q->max_qp_p >= 0)
                 q->extco2.MaxQPP = q->max_qp_p > 51 ? 51 : q->max_qp_p;
+            q->old_max_qp_p = q->max_qp_p;
             if (q->min_qp_b >= 0)
                 q->extco2.MinQPB = q->min_qp_b > 51 ? 51 : q->min_qp_b;
+            q->old_min_qp_b = q->min_qp_b;
             if (q->max_qp_b >= 0)
                 q->extco2.MaxQPB = q->max_qp_b > 51 ? 51 : q->max_qp_b;
+            q->old_max_qp_b = q->max_qp_b;
             if (q->mbbrc >= 0)
                 q->extco2.MBBRC = q->mbbrc ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
 
@@ -1739,6 +1747,71 @@ static int update_rir(AVCodecContext *avctx, QSVEncContext *q)
     return updated;
 }
 
+static int update_min_max_qp(AVCodecContext *avctx, QSVEncContext *q)
+{
+    int updated = 0;
+
+    if (avctx->codec_id != AV_CODEC_ID_H264)
+        return 0;
+
+    UPDATE_PARAM(q->old_qmax, avctx->qmin);
+    UPDATE_PARAM(q->old_qmax, avctx->qmin);
+    UPDATE_PARAM(q->old_min_qp_i, q->min_qp_i);
+    UPDATE_PARAM(q->old_max_qp_i, q->max_qp_i);
+    UPDATE_PARAM(q->old_min_qp_p, q->min_qp_p);
+    UPDATE_PARAM(q->old_max_qp_p, q->max_qp_p);
+    UPDATE_PARAM(q->old_min_qp_b, q->min_qp_b);
+    UPDATE_PARAM(q->old_max_qp_b, q->max_qp_b);
+    if (!updated)
+        return 0;
+
+    if ((avctx->qmin >= 0 && avctx->qmax >= 0 && avctx->qmin > avctx->qmax) ||
+        (q->max_qp_i >= 0 && q->min_qp_i >= 0 && q->min_qp_i > q->max_qp_i) ||
+        (q->max_qp_p >= 0 && q->min_qp_p >= 0 && q->min_qp_p > q->max_qp_p) ||
+        (q->max_qp_b >= 0 && q->min_qp_b >= 0 && q->min_qp_b > q->max_qp_b)) {
+        av_log(avctx, AV_LOG_ERROR,
+                "qmin and or qmax are set but invalid,"
+                " please make sure min <= max\n");
+        return AVERROR(EINVAL);
+    }
+
+    q->extco2.MinQPI = 0;
+    q->extco2.MaxQPI = 0;
+    q->extco2.MinQPP = 0;
+    q->extco2.MaxQPP = 0;
+    q->extco2.MinQPB = 0;
+    q->extco2.MaxQPB = 0;
+    if (avctx->qmin >= 0) {
+        q->extco2.MinQPI = avctx->qmin > 51 ? 51 : avctx->qmin;
+        q->extco2.MinQPB = q->extco2.MinQPP = q->extco2.MinQPI;
+    }
+    if (avctx->qmax >= 0) {
+        q->extco2.MaxQPI = avctx->qmax > 51 ? 51 : avctx->qmax;
+        q->extco2.MaxQPB = q->extco2.MaxQPP = q->extco2.MaxQPI;
+    }
+    if (q->min_qp_i >= 0)
+        q->extco2.MinQPI = q->min_qp_i > 51 ? 51 : q->min_qp_i;
+    if (q->max_qp_i >= 0)
+        q->extco2.MaxQPI = q->max_qp_i > 51 ? 51 : q->max_qp_i;
+    if (q->min_qp_p >= 0)
+        q->extco2.MinQPP = q->min_qp_p > 51 ? 51 : q->min_qp_p;
+    if (q->max_qp_p >= 0)
+        q->extco2.MaxQPP = q->max_qp_p > 51 ? 51 : q->max_qp_p;
+    if (q->min_qp_b >= 0)
+        q->extco2.MinQPB = q->min_qp_b > 51 ? 51 : q->min_qp_b;
+    if (q->max_qp_b >= 0)
+        q->extco2.MaxQPB = q->max_qp_b > 51 ? 51 : q->max_qp_b;
+
+    av_log(avctx, AV_LOG_VERBOSE, "Reset MinQPI: %d; MaxQPI: %d; "
+        "MinQPP: %d; MaxQPP: %d; "
+        "MinQPB: %d; MaxQPB: %d\n",
+        q->extco2.MinQPI, q->extco2.MaxQPI,
+        q->extco2.MinQPP, q->extco2.MaxQPP,
+        q->extco2.MinQPB, q->extco2.MaxQPB);
+
+    return updated;
+}
+
 static int update_parameters(AVCodecContext *avctx, QSVEncContext *q,
                              const AVFrame *frame)
 {
@@ -1751,6 +1824,11 @@ static int update_parameters(AVCodecContext *avctx, QSVEncContext *q,
     needReset |= update_max_frame_size(avctx, q);
     needReset |= update_gop_size(avctx, q);
     needReset |= update_rir(avctx, q);
+
+    ret = update_min_max_qp(avctx, q);
+    if (ret < 0)
+        return ret;
+    needReset |= ret;
     if (!needReset)
         return 0;
 
diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h
index 5a395d422e..f48c87fbad 100644
--- a/libavcodec/qsvenc.h
+++ b/libavcodec/qsvenc.h
@@ -244,6 +244,15 @@ typedef struct QSVEncContext {
     int old_int_ref_cycle_size;
     int old_int_ref_qp_delta;
     int old_int_ref_cycle_dist;
+    // These are used for max/min qp reset;
+    int old_qmax;
+    int old_qmin;
+    int old_max_qp_i;
+    int old_min_qp_i;
+    int old_max_qp_p;
+    int old_min_qp_p;
+    int old_max_qp_b;
+    int old_min_qp_b;
 } QSVEncContext;
 
 int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q);
-- 
2.32.0

_______________________________________________
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] 8+ messages in thread

* [FFmpeg-devel] [PATCH 6/6] libavcodec/qsvenc: Add low_delay_brc reset support to qsvenc
  2022-08-18  6:59 [FFmpeg-devel] [PATCH 1/6] libavcodec/qsvenc: Add max_frame_size reset support to qsv Wenbin Chen
                   ` (3 preceding siblings ...)
  2022-08-18  6:59 ` [FFmpeg-devel] [PATCH 5/6] libavcodec/qsvenc: Add max/min qp reset support in qsvenc Wenbin Chen
@ 2022-08-18  6:59 ` Wenbin Chen
  4 siblings, 0 replies; 8+ messages in thread
From: Wenbin Chen @ 2022-08-18  6:59 UTC (permalink / raw)
  To: ffmpeg-devel

Signed-off-by: Wenbin Chen <wenbin.chen@intel.com>
---
 doc/encoders.texi   |  4 ++++
 libavcodec/qsvenc.c | 23 ++++++++++++++++++++++-
 libavcodec/qsvenc.h |  2 ++
 3 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/doc/encoders.texi b/doc/encoders.texi
index fad3cad30b..d8e52006ce 100644
--- a/doc/encoders.texi
+++ b/doc/encoders.texi
@@ -3369,6 +3369,10 @@ Change these value to reset qsv codec's Intra Refresh configuration.
 @item @var{min_qp_b}
 Supported in h264_qsv.
 Change these value to reset qsv codec's max/min qp configuration.
+
+@item @var{low_delay_brc}
+Supported in h264_qsv and hevc_qsv.
+Change this value to reset qsv codec's low_delay_brc configuration.
 @end table
 
 @subsection H264 options
diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index 3a3e6ccc9a..b53c25223a 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -934,6 +934,7 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q)
             q->old_int_ref_cycle_dist = q->int_ref_cycle_dist;
             if (q->low_delay_brc >= 0)
                 q->extco3.LowDelayBRC = q->low_delay_brc ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
+            q->old_low_delay_brc = q->low_delay_brc;
             if (q->max_frame_size_i >= 0)
                 q->extco3.MaxFrameSizeI = q->max_frame_size_i;
             if (q->max_frame_size_p >= 0)
@@ -1812,6 +1813,26 @@ static int update_min_max_qp(AVCodecContext *avctx, QSVEncContext *q)
     return updated;
 }
 
+static int update_low_delay_brc(AVCodecContext *avctx, QSVEncContext *q)
+{
+    int updated = 0;
+
+    if (avctx->codec_id != AV_CODEC_ID_H264 && avctx->codec_id != AV_CODEC_ID_HEVC)
+        return 0;
+
+    UPDATE_PARAM(q->old_low_delay_brc, q->low_delay_brc);
+    if (!updated)
+        return 0;
+
+    q->extco3.LowDelayBRC = MFX_CODINGOPTION_UNKNOWN;
+    if (q->low_delay_brc >= 0)
+        q->extco3.LowDelayBRC = q->low_delay_brc ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
+    av_log(avctx, AV_LOG_DEBUG, "Reset LowDelayBRC: %s\n",
+           print_threestate(q->extco3.LowDelayBRC));
+
+    return updated;
+}
+
 static int update_parameters(AVCodecContext *avctx, QSVEncContext *q,
                              const AVFrame *frame)
 {
@@ -1824,7 +1845,7 @@ static int update_parameters(AVCodecContext *avctx, QSVEncContext *q,
     needReset |= update_max_frame_size(avctx, q);
     needReset |= update_gop_size(avctx, q);
     needReset |= update_rir(avctx, q);
-
+    needReset |= update_low_delay_brc(avctx, q);
     ret = update_min_max_qp(avctx, q);
     if (ret < 0)
         return ret;
diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h
index f48c87fbad..30db9dc94d 100644
--- a/libavcodec/qsvenc.h
+++ b/libavcodec/qsvenc.h
@@ -253,6 +253,8 @@ typedef struct QSVEncContext {
     int old_min_qp_p;
     int old_max_qp_b;
     int old_min_qp_b;
+    // This is used for low_delay_brc reset
+    int old_low_delay_brc;
 } QSVEncContext;
 
 int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q);
-- 
2.32.0

_______________________________________________
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] 8+ messages in thread

* Re: [FFmpeg-devel] [PATCH 2/6] libavcodec/qsvenc: Add gop_size reset support to qsvenc
  2022-08-18  6:59 ` [FFmpeg-devel] [PATCH 2/6] libavcodec/qsvenc: Add gop_size reset support to qsvenc Wenbin Chen
@ 2022-09-06  1:53   ` Xiang, Haihao
  2022-09-06  8:44     ` Chen, Wenbin
  0 siblings, 1 reply; 8+ messages in thread
From: Xiang, Haihao @ 2022-09-06  1:53 UTC (permalink / raw)
  To: ffmpeg-devel

On Thu, 2022-08-18 at 14:59 +0800, Wenbin Chen wrote:
> Signed-off-by: Wenbin Chen <wenbin.chen@intel.com>
> ---
>  doc/encoders.texi   |  3 +++
>  libavcodec/qsvenc.c | 18 +++++++++++++++++-
>  libavcodec/qsvenc.h |  2 ++
>  3 files changed, 22 insertions(+), 1 deletion(-)
> 
> diff --git a/doc/encoders.texi b/doc/encoders.texi
> index 69fa46f3ea..9fb63856b1 100644
> --- a/doc/encoders.texi
> +++ b/doc/encoders.texi
> @@ -3348,6 +3348,9 @@ Change these value to reset qsv codec's qp
> configuration.
>  @item @var{max_frame_size}
>  Supported in h264_qsv and hevc_qsv.
>  Change this value to reset qsv codec's MaxFrameSize configuration.
> +
> +@item @var{gop_size}
> +Change this value to reset qsv codec's gop configuration.
>  @end table
>  
>  @subsection H264 options
> diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
> index c911b81e7d..b3820e4fe0 100644
> --- a/libavcodec/qsvenc.c
> +++ b/libavcodec/qsvenc.c
> @@ -635,6 +635,7 @@ static int init_video_param(AVCodecContext *avctx,
> QSVEncContext *q)
>      q->param.mfx.CodecProfile       = q->profile;
>      q->param.mfx.TargetUsage        = avctx->compression_level;
>      q->param.mfx.GopPicSize         = FFMAX(0, avctx->gop_size);
> +    q->old_gop_size                 = avctx->gop_size;
>      q->param.mfx.GopRefDist         = FFMAX(-1, avctx->max_b_frames) + 1;
>      q->param.mfx.GopOptFlag         = avctx->flags & AV_CODEC_FLAG_CLOSED_GOP
> ?
>                                        MFX_GOP_CLOSED : MFX_GOP_STRICT;
> @@ -1692,16 +1693,31 @@ static int update_max_frame_size(AVCodecContext
> *avctx, QSVEncContext *q)
>      return updated;
>  }
>  
> +static int update_gop_size(AVCodecContext *avctx, QSVEncContext *q)
> +{
> +    int updated = 0;
> +    UPDATE_PARAM(q->old_gop_size, avctx->gop_size);
> +    if (!updated)
> +        return 0;
> +
> +    q->param.mfx.GopPicSize = FFMAX(0, avctx->gop_size);
> +    av_log(avctx, AV_LOG_DEBUG, "reset GopPicSize to %d\n",
> +           q->param.mfx.GopPicSize);
> +
> +    return updated;
> +}
> +
>  static int update_parameters(AVCodecContext *avctx, QSVEncContext *q,
>                               const AVFrame *frame)
>  {
>      int needReset = 0, ret = 0;
>  
> -    if (!frame)
> +    if (!frame || avctx->codec_id == AV_CODEC_ID_MJPEG)
>          return 0;

Better to fix mjpeg_qsv in a separate patch if mjpeg_qsv is not able to resetany parameter. 

Thanks
Haihao

>  
>      needReset = update_qp(avctx, q);
>      needReset |= update_max_frame_size(avctx, q);
> +    needReset |= update_gop_size(avctx, q);
>      if (!needReset)
>          return 0;
>  
> diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h
> index c452c5b806..fdedae28dd 100644
> --- a/libavcodec/qsvenc.h
> +++ b/libavcodec/qsvenc.h
> @@ -237,6 +237,8 @@ typedef struct QSVEncContext {
>      float old_b_quant_offset;
>      // This is used for max_frame_size reset
>      int old_max_frame_size;
> +    // This is used for gop reset
> +    int old_gop_size;
>  } QSVEncContext;
>  
>  int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q);
_______________________________________________
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] 8+ messages in thread

* Re: [FFmpeg-devel] [PATCH 2/6] libavcodec/qsvenc: Add gop_size reset support to qsvenc
  2022-09-06  1:53   ` Xiang, Haihao
@ 2022-09-06  8:44     ` Chen, Wenbin
  0 siblings, 0 replies; 8+ messages in thread
From: Chen, Wenbin @ 2022-09-06  8:44 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

> On Thu, 2022-08-18 at 14:59 +0800, Wenbin Chen wrote:
> > Signed-off-by: Wenbin Chen <wenbin.chen@intel.com>
> > ---
> >  doc/encoders.texi   |  3 +++
> >  libavcodec/qsvenc.c | 18 +++++++++++++++++-
> >  libavcodec/qsvenc.h |  2 ++
> >  3 files changed, 22 insertions(+), 1 deletion(-)
> >
> > diff --git a/doc/encoders.texi b/doc/encoders.texi
> > index 69fa46f3ea..9fb63856b1 100644
> > --- a/doc/encoders.texi
> > +++ b/doc/encoders.texi
> > @@ -3348,6 +3348,9 @@ Change these value to reset qsv codec's qp
> > configuration.
> >  @item @var{max_frame_size}
> >  Supported in h264_qsv and hevc_qsv.
> >  Change this value to reset qsv codec's MaxFrameSize configuration.
> > +
> > +@item @var{gop_size}
> > +Change this value to reset qsv codec's gop configuration.
> >  @end table
> >
> >  @subsection H264 options
> > diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
> > index c911b81e7d..b3820e4fe0 100644
> > --- a/libavcodec/qsvenc.c
> > +++ b/libavcodec/qsvenc.c
> > @@ -635,6 +635,7 @@ static int init_video_param(AVCodecContext *avctx,
> > QSVEncContext *q)
> >      q->param.mfx.CodecProfile       = q->profile;
> >      q->param.mfx.TargetUsage        = avctx->compression_level;
> >      q->param.mfx.GopPicSize         = FFMAX(0, avctx->gop_size);
> > +    q->old_gop_size                 = avctx->gop_size;
> >      q->param.mfx.GopRefDist         = FFMAX(-1, avctx->max_b_frames) + 1;
> >      q->param.mfx.GopOptFlag         = avctx->flags &
> AV_CODEC_FLAG_CLOSED_GOP
> > ?
> >                                        MFX_GOP_CLOSED : MFX_GOP_STRICT;
> > @@ -1692,16 +1693,31 @@ static int
> update_max_frame_size(AVCodecContext
> > *avctx, QSVEncContext *q)
> >      return updated;
> >  }
> >
> > +static int update_gop_size(AVCodecContext *avctx, QSVEncContext *q)
> > +{
> > +    int updated = 0;
> > +    UPDATE_PARAM(q->old_gop_size, avctx->gop_size);
> > +    if (!updated)
> > +        return 0;
> > +
> > +    q->param.mfx.GopPicSize = FFMAX(0, avctx->gop_size);
> > +    av_log(avctx, AV_LOG_DEBUG, "reset GopPicSize to %d\n",
> > +           q->param.mfx.GopPicSize);
> > +
> > +    return updated;
> > +}
> > +
> >  static int update_parameters(AVCodecContext *avctx, QSVEncContext *q,
> >                               const AVFrame *frame)
> >  {
> >      int needReset = 0, ret = 0;
> >
> > -    if (!frame)
> > +    if (!frame || avctx->codec_id == AV_CODEC_ID_MJPEG)
> >          return 0;
> 
> Better to fix mjpeg_qsv in a separate patch if mjpeg_qsv is not able to
> resetany parameter.
> 
> Thanks
> Haihao

Ok, I will update it in new patchset.

> 
> >
> >      needReset = update_qp(avctx, q);
> >      needReset |= update_max_frame_size(avctx, q);
> > +    needReset |= update_gop_size(avctx, q);
> >      if (!needReset)
> >          return 0;
> >
> > diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h
> > index c452c5b806..fdedae28dd 100644
> > --- a/libavcodec/qsvenc.h
> > +++ b/libavcodec/qsvenc.h
> > @@ -237,6 +237,8 @@ typedef struct QSVEncContext {
> >      float old_b_quant_offset;
> >      // This is used for max_frame_size reset
> >      int old_max_frame_size;
> > +    // This is used for gop reset
> > +    int old_gop_size;
> >  } QSVEncContext;
> >
> >  int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q);
> _______________________________________________
> 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] 8+ messages in thread

end of thread, other threads:[~2022-09-06  8:44 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-18  6:59 [FFmpeg-devel] [PATCH 1/6] libavcodec/qsvenc: Add max_frame_size reset support to qsv Wenbin Chen
2022-08-18  6:59 ` [FFmpeg-devel] [PATCH 2/6] libavcodec/qsvenc: Add gop_size reset support to qsvenc Wenbin Chen
2022-09-06  1:53   ` Xiang, Haihao
2022-09-06  8:44     ` Chen, Wenbin
2022-08-18  6:59 ` [FFmpeg-devel] [PATCH 3/6] libavcodec/qsvenc: Add "slice" intra refresh type " Wenbin Chen
2022-08-18  6:59 ` [FFmpeg-devel] [PATCH 4/6] libavcodec/qsvenc: Add intra refresh reset support " Wenbin Chen
2022-08-18  6:59 ` [FFmpeg-devel] [PATCH 5/6] libavcodec/qsvenc: Add max/min qp reset support in qsvenc Wenbin Chen
2022-08-18  6:59 ` [FFmpeg-devel] [PATCH 6/6] libavcodec/qsvenc: Add low_delay_brc reset support to qsvenc Wenbin Chen

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