Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
To: ffmpeg-devel@ffmpeg.org
Cc: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Subject: [FFmpeg-devel] [PATCH 05/41] avcodec/h261: Separate decode and encode contexts
Date: Sun, 30 Jan 2022 07:27:13 +0100
Message-ID: <AM7PR03MB6660357EA22A306F6B207E2A8F249@AM7PR03MB6660.eurprd03.prod.outlook.com> (raw)
In-Reply-To: <AM7PR03MB666068B09E9D0014E1CC65DD8F249@AM7PR03MB6660.eurprd03.prod.outlook.com>

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavcodec/h261.c    |  2 +-
 libavcodec/h261.h    |  8 ------
 libavcodec/h261dec.c | 59 +++++++++++++++++++++++++++-----------------
 libavcodec/h261enc.c | 54 +++++++++++++++++++++++++---------------
 4 files changed, 72 insertions(+), 51 deletions(-)

diff --git a/libavcodec/h261.c b/libavcodec/h261.c
index 1290c040cd..7dfaee7dc4 100644
--- a/libavcodec/h261.c
+++ b/libavcodec/h261.c
@@ -60,7 +60,7 @@ static void h261_loop_filter(uint8_t *src, int stride)
 
 void ff_h261_loop_filter(MpegEncContext *s)
 {
-    H261Context *h       = (H261Context *)s;
+    H261Context *const h = s->private_ctx;
     const int linesize   = s->linesize;
     const int uvlinesize = s->uvlinesize;
     uint8_t *dest_y      = s->dest[0];
diff --git a/libavcodec/h261.h b/libavcodec/h261.h
index 25728a295d..ff1903e508 100644
--- a/libavcodec/h261.h
+++ b/libavcodec/h261.h
@@ -35,15 +35,7 @@
  * H261Context
  */
 typedef struct H261Context {
-    MpegEncContext s;
-
-    int current_mba;
-    int mba_diff;
     int mtype;
-    int current_mv_x;
-    int current_mv_y;
-    int gob_number;
-    int gob_start_code_skipped; // 1 if gob start code is already read before gob header is read
 } H261Context;
 
 #define MB_TYPE_H261_FIL 0x800000
diff --git a/libavcodec/h261dec.c b/libavcodec/h261dec.c
index 2fd8d94df1..17f1067b15 100644
--- a/libavcodec/h261dec.c
+++ b/libavcodec/h261dec.c
@@ -47,6 +47,19 @@ static VLC h261_mtype_vlc;
 static VLC h261_mv_vlc;
 static VLC h261_cbp_vlc;
 
+typedef struct H261DecContext {
+    MpegEncContext s;
+
+    H261Context common;
+
+    int current_mba;
+    int mba_diff;
+    int current_mv_x;
+    int current_mv_y;
+    int gob_number;
+    int gob_start_code_skipped; // 1 if gob start code is already read before gob header is read
+} H261DecContext;
+
 static av_cold void h261_decode_init_static(void)
 {
     INIT_VLC_STATIC(&h261_mba_vlc, H261_MBA_VLC_BITS, 35,
@@ -67,9 +80,10 @@ static av_cold void h261_decode_init_static(void)
 static av_cold int h261_decode_init(AVCodecContext *avctx)
 {
     static AVOnce init_static_once = AV_ONCE_INIT;
-    H261Context *h          = avctx->priv_data;
+    H261DecContext *const h = avctx->priv_data;
     MpegEncContext *const s = &h->s;
 
+    s->private_ctx = &h->common;
     // set defaults
     ff_mpv_decode_init(s, avctx);
 
@@ -89,7 +103,7 @@ static av_cold int h261_decode_init(AVCodecContext *avctx)
  * Decode the group of blocks header or slice header.
  * @return <0 if an error occurred
  */
-static int h261_decode_gob_header(H261Context *h)
+static int h261_decode_gob_header(H261DecContext *h)
 {
     unsigned int val;
     MpegEncContext *const s = &h->s;
@@ -143,7 +157,7 @@ static int h261_decode_gob_header(H261Context *h)
  * Decode the group of blocks / video packet header.
  * @return <0 if no resync found
  */
-static int h261_resync(H261Context *h)
+static int h261_resync(H261DecContext *h)
 {
     MpegEncContext *const s = &h->s;
     int left, ret;
@@ -184,7 +198,7 @@ static int h261_resync(H261Context *h)
  * Decode skipped macroblocks.
  * @return 0
  */
-static int h261_decode_mb_skipped(H261Context *h, int mba1, int mba2)
+static int h261_decode_mb_skipped(H261DecContext *h, int mba1, int mba2)
 {
     MpegEncContext *const s = &h->s;
     int i;
@@ -209,7 +223,7 @@ static int h261_decode_mb_skipped(H261Context *h, int mba1, int mba2)
         s->mv[0][0][0]                 = 0;
         s->mv[0][0][1]                 = 0;
         s->mb_skipped                  = 1;
-        h->mtype                      &= ~MB_TYPE_H261_FIL;
+        h->common.mtype               &= ~MB_TYPE_H261_FIL;
 
         if (s->current_picture.motion_val[0]) {
             int b_stride = 2*s->mb_width + 1;
@@ -254,7 +268,7 @@ static int decode_mv_component(GetBitContext *gb, int v)
  * Decode a macroblock.
  * @return <0 if an error occurred
  */
-static int h261_decode_block(H261Context *h, int16_t *block, int n, int coded)
+static int h261_decode_block(H261DecContext *h, int16_t *block, int n, int coded)
 {
     MpegEncContext *const s = &h->s;
     int level, i, j, run;
@@ -346,9 +360,10 @@ static int h261_decode_block(H261Context *h, int16_t *block, int n, int coded)
     return 0;
 }
 
-static int h261_decode_mb(H261Context *h)
+static int h261_decode_mb(H261DecContext *h)
 {
     MpegEncContext *const s = &h->s;
+    H261Context *const com = &h->common;
     int i, cbp, xy;
 
     cbp = 63;
@@ -386,23 +401,23 @@ static int h261_decode_mb(H261Context *h)
     ff_update_block_index(s);
 
     // Read mtype
-    h->mtype = get_vlc2(&s->gb, h261_mtype_vlc.table, H261_MTYPE_VLC_BITS, 2);
-    if (h->mtype < 0) {
+    com->mtype = get_vlc2(&s->gb, h261_mtype_vlc.table, H261_MTYPE_VLC_BITS, 2);
+    if (com->mtype < 0) {
         av_log(s->avctx, AV_LOG_ERROR, "Invalid mtype index %d\n",
-               h->mtype);
+               com->mtype);
         return SLICE_ERROR;
     }
-    av_assert0(h->mtype < FF_ARRAY_ELEMS(ff_h261_mtype_map));
-    h->mtype = ff_h261_mtype_map[h->mtype];
+    av_assert0(com->mtype < FF_ARRAY_ELEMS(ff_h261_mtype_map));
+    com->mtype = ff_h261_mtype_map[com->mtype];
 
     // Read mquant
-    if (IS_QUANT(h->mtype))
+    if (IS_QUANT(com->mtype))
         ff_set_qscale(s, get_bits(&s->gb, 5));
 
-    s->mb_intra = IS_INTRA4x4(h->mtype);
+    s->mb_intra = IS_INTRA4x4(com->mtype);
 
     // Read mv
-    if (IS_16X16(h->mtype)) {
+    if (IS_16X16(com->mtype)) {
         /* Motion vector data is included for all MC macroblocks. MVD is
          * obtained from the macroblock vector by subtracting the vector
          * of the preceding macroblock. For this calculation the vector
@@ -425,7 +440,7 @@ static int h261_decode_mb(H261Context *h)
     }
 
     // Read cbp
-    if (HAS_CBP(h->mtype))
+    if (HAS_CBP(com->mtype))
         cbp = get_vlc2(&s->gb, h261_cbp_vlc.table, H261_CBP_VLC_BITS, 1) + 1;
 
     if (s->mb_intra) {
@@ -449,7 +464,7 @@ static int h261_decode_mb(H261Context *h)
 
 intra:
     /* decode each block */
-    if (s->mb_intra || HAS_CBP(h->mtype)) {
+    if (s->mb_intra || HAS_CBP(com->mtype)) {
         s->bdsp.clear_blocks(s->block[0]);
         for (i = 0; i < 6; i++) {
             if (h261_decode_block(h, s->block[i], i, cbp & 32) < 0)
@@ -470,7 +485,7 @@ intra:
  * Decode the H.261 picture header.
  * @return <0 if no startcode found
  */
-static int h261_decode_picture_header(H261Context *h)
+static int h261_decode_picture_header(H261DecContext *h)
 {
     MpegEncContext *const s = &h->s;
     int format, i;
@@ -534,7 +549,7 @@ static int h261_decode_picture_header(H261Context *h)
     return 0;
 }
 
-static int h261_decode_gob(H261Context *h)
+static int h261_decode_gob(H261DecContext *h)
 {
     MpegEncContext *const s = &h->s;
 
@@ -580,9 +595,9 @@ static int get_consumed_bytes(MpegEncContext *s, int buf_size)
 static int h261_decode_frame(AVCodecContext *avctx, void *data,
                              int *got_frame, AVPacket *avpkt)
 {
+    H261DecContext *const h = avctx->priv_data;
     const uint8_t *buf = avpkt->data;
     int buf_size       = avpkt->size;
-    H261Context *h     = avctx->priv_data;
     MpegEncContext *s  = &h->s;
     int ret;
     AVFrame *pict = data;
@@ -657,7 +672,7 @@ retry:
 
 static av_cold int h261_decode_end(AVCodecContext *avctx)
 {
-    H261Context *h    = avctx->priv_data;
+    H261DecContext *const h = avctx->priv_data;
     MpegEncContext *s = &h->s;
 
     ff_mpv_common_end(s);
@@ -669,7 +684,7 @@ const AVCodec ff_h261_decoder = {
     .long_name      = NULL_IF_CONFIG_SMALL("H.261"),
     .type           = AVMEDIA_TYPE_VIDEO,
     .id             = AV_CODEC_ID_H261,
-    .priv_data_size = sizeof(H261Context),
+    .priv_data_size = sizeof(H261DecContext),
     .init           = h261_decode_init,
     .close          = h261_decode_end,
     .decode         = h261_decode_frame,
diff --git a/libavcodec/h261enc.c b/libavcodec/h261enc.c
index af65c1f3b1..13fe5bbfb2 100644
--- a/libavcodec/h261enc.c
+++ b/libavcodec/h261enc.c
@@ -37,6 +37,14 @@
 static uint8_t uni_h261_rl_len [64*64*2*2];
 #define UNI_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
 
+typedef struct H261EncContext {
+    MpegEncContext s;
+
+    H261Context common;
+
+    int gob_number;
+} H261EncContext;
+
 int ff_h261_get_picture_format(int width, int height)
 {
     // QCIF
@@ -52,7 +60,7 @@ int ff_h261_get_picture_format(int width, int height)
 
 void ff_h261_encode_picture_header(MpegEncContext *s, int picture_number)
 {
-    H261Context *h = (H261Context *)s;
+    H261EncContext *const h = (H261EncContext *)s;
     int format, temp_ref;
 
     align_put_bits(&s->pb);
@@ -90,7 +98,7 @@ void ff_h261_encode_picture_header(MpegEncContext *s, int picture_number)
  */
 static void h261_encode_gob_header(MpegEncContext *s, int mb_line)
 {
-    H261Context *h = (H261Context *)s;
+    H261EncContext *const h = (H261EncContext *)s;
     if (ff_h261_get_picture_format(s->width, s->height) == 0) {
         h->gob_number += 2; // QCIF
     } else {
@@ -132,7 +140,7 @@ void ff_h261_reorder_mb_index(MpegEncContext *s)
     }
 }
 
-static void h261_encode_motion(H261Context *h, int val)
+static void h261_encode_motion(H261EncContext *h, int val)
 {
     MpegEncContext *const s = &h->s;
     int sign, code;
@@ -166,7 +174,7 @@ static inline int get_cbp(MpegEncContext *s, int16_t block[6][64])
  * @param block the 8x8 block
  * @param n block index (0-3 are luma, 4-5 are chroma)
  */
-static void h261_encode_block(H261Context *h, int16_t *block, int n)
+static void h261_encode_block(H261EncContext *h, int16_t *block, int n)
 {
     MpegEncContext *const s = &h->s;
     int level, run, i, j, last_index, last_non_zero, sign, slevel, code;
@@ -237,12 +245,15 @@ static void h261_encode_block(H261Context *h, int16_t *block, int n)
 void ff_h261_encode_mb(MpegEncContext *s, int16_t block[6][64],
                        int motion_x, int motion_y)
 {
-    H261Context *h = (H261Context *)s;
+    /* The following is only allowed because this encoder
+     * does not use slice threading. */
+    H261EncContext *const h = (H261EncContext *)s;
+    H261Context *const com = &h->common;
     int mvd, mv_diff_x, mv_diff_y, i, cbp;
     cbp = 63; // avoid warning
     mvd = 0;
 
-    h->mtype = 0;
+    com->mtype = 0;
 
     if (!s->mb_intra) {
         /* compute cbp */
@@ -270,34 +281,34 @@ void ff_h261_encode_mb(MpegEncContext *s, int16_t block[6][64],
 
     /* calculate MTYPE */
     if (!s->mb_intra) {
-        h->mtype++;
+        com->mtype++;
 
         if (mvd || s->loop_filter)
-            h->mtype += 3;
+            com->mtype += 3;
         if (s->loop_filter)
-            h->mtype += 3;
+            com->mtype += 3;
         if (cbp)
-            h->mtype++;
-        av_assert1(h->mtype > 1);
+            com->mtype++;
+        av_assert1(com->mtype > 1);
     }
 
     if (s->dquant && cbp) {
-        h->mtype++;
+        com->mtype++;
     } else
         s->qscale -= s->dquant;
 
     put_bits(&s->pb,
-             ff_h261_mtype_bits[h->mtype],
-             ff_h261_mtype_code[h->mtype]);
+             ff_h261_mtype_bits[com->mtype],
+             ff_h261_mtype_code[com->mtype]);
 
-    h->mtype = ff_h261_mtype_map[h->mtype];
+    com->mtype = ff_h261_mtype_map[com->mtype];
 
-    if (IS_QUANT(h->mtype)) {
+    if (IS_QUANT(com->mtype)) {
         ff_set_qscale(s, s->qscale + s->dquant);
         put_bits(&s->pb, 5, s->qscale);
     }
 
-    if (IS_16X16(h->mtype)) {
+    if (IS_16X16(com->mtype)) {
         mv_diff_x       = (motion_x >> 1) - s->last_mv[0][0][0];
         mv_diff_y       = (motion_y >> 1) - s->last_mv[0][0][1];
         s->last_mv[0][0][0] = (motion_x >> 1);
@@ -306,7 +317,7 @@ void ff_h261_encode_mb(MpegEncContext *s, int16_t block[6][64],
         h261_encode_motion(h, mv_diff_y);
     }
 
-    if (HAS_CBP(h->mtype)) {
+    if (HAS_CBP(com->mtype)) {
         av_assert1(cbp > 0);
         put_bits(&s->pb,
                  ff_h261_cbp_tab[cbp - 1][1],
@@ -316,7 +327,7 @@ void ff_h261_encode_mb(MpegEncContext *s, int16_t block[6][64],
         /* encode each block */
         h261_encode_block(h, block[i], i);
 
-    if (!IS_16X16(h->mtype)) {
+    if (!IS_16X16(com->mtype)) {
         s->last_mv[0][0][0] = 0;
         s->last_mv[0][0][1] = 0;
     }
@@ -371,8 +382,11 @@ static av_cold void h261_encode_init_static(void)
 
 av_cold void ff_h261_encode_init(MpegEncContext *s)
 {
+    H261EncContext *const h = (H261EncContext*)s;
     static AVOnce init_static_once = AV_ONCE_INIT;
 
+    s->private_ctx = &h->common;
+
     s->min_qcoeff       = -127;
     s->max_qcoeff       = 127;
     s->y_dc_scale_table =
@@ -390,7 +404,7 @@ const AVCodec ff_h261_encoder = {
     .type           = AVMEDIA_TYPE_VIDEO,
     .id             = AV_CODEC_ID_H261,
     .priv_class     = &ff_mpv_enc_class,
-    .priv_data_size = sizeof(H261Context),
+    .priv_data_size = sizeof(H261EncContext),
     .init           = ff_mpv_encode_init,
     .encode2        = ff_mpv_encode_picture,
     .close          = ff_mpv_encode_end,
-- 
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".

  parent reply	other threads:[~2022-01-30  6:28 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-01-30  6:08 [FFmpeg-devel] [PATCH 01/41] avcodec/mpegvideo_enc: Allow slices only for slice-thread-able codecs Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 02/41] avcodec/mjpegenc: Remove nonsense assert Andreas Rheinhardt
2022-01-30 13:15   ` Michael Niedermayer
2022-01-30 17:07     ` Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 03/41] avcodec/mjpegenc: Fix files with slices > 1, but threads == 1 Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 04/41] avcodec/mpegvideo: Enable private contexts Andreas Rheinhardt
2022-01-30  6:27 ` Andreas Rheinhardt [this message]
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 06/41] avcodec/h261enc: Pass PutBitContext directly in h261_encode_motion() Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 07/41] avcodec/idctdsp: Constify the permutation parameter of ff_init_scantable Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 08/41] avcodec/wmv2: Move initializing abt_scantables to the decoder Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 09/41] avcodec/wmv2: Split Wmv2Context into decoder and encoder context Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 10/41] avcodec/msmpeg4.h: Move encoder-only stuff to a new header Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 11/41] avcodec/msmpegenc: Add MSMPEG4EncContext and move ac_stats to it Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 12/41] avcodec/h263.h: Move encoder-only stuff to a new header h263enc.h Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 13/41] avcodec/mpegvideo: Move encoder-only stuff to a new header Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 14/41] avcodec/avcodec: Avoid MpegEncContext in AVHWAccel.decode_mb Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 15/41] avcodec/speedhqenc: Add SpeedHQEncContext and move slice_start to it Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 16/41] avcodec/mpegvideo: Use typedefs for MPV(Main)?(Dec|Enc)?Context Andreas Rheinhardt
2022-01-30 11:40   ` Michael Niedermayer
2022-01-30 23:05     ` Andreas Rheinhardt
2022-01-31 15:37       ` Michael Niedermayer
2022-01-30 11:43   ` Michael Niedermayer
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 17/41] avcodec/mpegvideo_enc: Don't find encoder by ID Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 18/41] avcodec/mpegvideoenc: Add proper MPVMainEncContext Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 19/41] avcodec/mpegvideoenc: Move tmp bframes to MPVMainEncContext Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 20/41] avcodec/mpegvideoenc: Move ratecontrol " Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 21/41] avcodec/mpegvideo: Move me_pre and me_penalty_compensation to enc-ctx Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 22/41] avcodec/mpegvideo: Move gop_size to MPVMainEncContext Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 23/41] avcodec/mpegvideo_enc: Don't set picture_in_gop_number for slice threads Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 24/41] avcodec/mpegvideo: Move picture_in_gop_number to MPVMainEncContext Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 25/41] avcodec/mpegvideo: Move pts and dts fields " Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 26/41] avcodec/mpegvideo: Move input_picture list " Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 27/41] avcodec/mpegvideo: Remove write-only [fb]_code Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 28/41] avcodec/mpegvideo: Move last-pic information to MPVMainEncContext Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 29/41] avcodec/mpegvideo: Move header_bits " Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 30/41] avcodec/mpegvideo_enc: Remove unused function parameters Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 31/41] avcodec/mpegvideo_enc: Remove unused parameter from encode_mb_hq() Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 32/41] avcodec/mpegvideo: Move vbv_delay to Mpeg1Context Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 33/41] avcodec/mpegvideo: Move brd_scale to MPVMainEncContext Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 34/41] avcodec/mpegvideo: Move ratecontrol parameters " Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 35/41] avcodec/mpegvideo: Allocate encoder-only tables in mpegvideo_enc.c Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 36/41] avcodec/mpegvideo: Move encoder-only base-arrays to MPVMainEncContext Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 37/41] avcodec/mpegvideo_enc: Initialize non-JPEG q-matrices only once Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 38/41] avcodec/mpegvideo_enc: Avoid allocations for q_int(er|ra)_matrix tables Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 39/41] avcodec/mpegvideo: Move scenechange_threshold to MPVMainEncContext Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 40/41] avcodec/mpegvideo: Move dummy dst for depr. opts " Andreas Rheinhardt
2022-01-30  6:27 ` [FFmpeg-devel] [PATCH 41/41] avcodec/mpegvideo: Move frame_skip_(exp|cmp) " Andreas Rheinhardt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=AM7PR03MB6660357EA22A306F6B207E2A8F249@AM7PR03MB6660.eurprd03.prod.outlook.com \
    --to=andreas.rheinhardt@outlook.com \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

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