avcodec/h261: Remove H261Context

It only contains a single field, so add this directly to MPVContext
and remove private_ctx. This avoids an indirection in
ff_h261_loop_filter().

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt
2025-12-30 13:26:33 +01:00
parent 3946e57797
commit 0d2ab41ec8
5 changed files with 26 additions and 42 deletions

View File

@@ -60,14 +60,13 @@ static void h261_loop_filter(uint8_t *src, ptrdiff_t stride)
void ff_h261_loop_filter(MpegEncContext *s)
{
H261Context *const h = s->private_ctx;
const ptrdiff_t linesize = s->linesize;
const ptrdiff_t uvlinesize = s->uvlinesize;
uint8_t *dest_y = s->dest[0];
uint8_t *dest_cb = s->dest[1];
uint8_t *dest_cr = s->dest[2];
if (!(IS_FIL(h->mtype)))
if (!(IS_FIL(s->mtype)))
return;
h261_loop_filter(dest_y, linesize);

View File

@@ -31,13 +31,6 @@
#include "mpegutils.h"
#include "rl.h"
/**
* H261Context
*/
typedef struct H261Context {
int mtype;
} H261Context;
#define MB_TYPE_H261_FIL MB_TYPE_CODEC_SPECIFIC
extern const uint8_t ff_h261_mba_code[35];

View File

@@ -59,8 +59,6 @@ typedef struct H261DecContext {
GetBitContext gb;
H261Context common;
int current_mba;
int mba_diff;
int current_mv_x;
@@ -104,7 +102,6 @@ static av_cold int h261_decode_init(AVCodecContext *avctx)
* for all frames and override it after having decoded the frame. */
s->pict_type = AV_PICTURE_TYPE_P;
s->private_ctx = &h->common;
// set defaults
ret = ff_mpv_decode_init(s, avctx);
if (ret < 0)
@@ -211,7 +208,7 @@ static int h261_decode_mb_skipped(H261DecContext *h, int mba1, int mba2)
s->mv[0][0][0] = 0;
s->mv[0][0][1] = 0;
s->mb_skipped = 1;
h->common.mtype &= ~MB_TYPE_H261_FIL;
s->mtype &= ~MB_TYPE_H261_FIL;
if (s->cur_pic.motion_val[0]) {
int b_stride = 2*s->mb_width + 1;
@@ -352,7 +349,6 @@ static int h261_decode_block(H261DecContext *h, int16_t *block, int n, int coded
static int h261_decode_mb(H261DecContext *h)
{
MpegEncContext *const s = &h->s;
H261Context *const com = &h->common;
int i, cbp, xy;
cbp = 63;
@@ -389,23 +385,23 @@ static int h261_decode_mb(H261DecContext *h)
h261_init_dest(s);
// Read mtype
com->mtype = get_vlc2(&h->gb, h261_mtype_vlc, H261_MTYPE_VLC_BITS, 2);
if (com->mtype < 0) {
s->mtype = get_vlc2(&h->gb, h261_mtype_vlc, H261_MTYPE_VLC_BITS, 2);
if (s->mtype < 0) {
av_log(s->avctx, AV_LOG_ERROR, "Invalid mtype index\n");
return SLICE_ERROR;
}
// Read mquant
if (IS_QUANT(com->mtype)) {
if (IS_QUANT(s->mtype)) {
s->qscale = get_bits(&h->gb, 5);
if (!s->qscale)
s->qscale = 1;
}
s->mb_intra = IS_INTRA4x4(com->mtype);
s->mb_intra = IS_INTRA4x4(s->mtype);
// Read mv
if (IS_16X16(com->mtype)) {
if (IS_16X16(s->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
@@ -428,7 +424,7 @@ static int h261_decode_mb(H261DecContext *h)
}
// Read cbp
if (HAS_CBP(com->mtype))
if (HAS_CBP(s->mtype))
cbp = get_vlc2(&h->gb, h261_cbp_vlc, H261_CBP_VLC_BITS, 1) + 1;
if (s->mb_intra) {
@@ -452,7 +448,7 @@ static int h261_decode_mb(H261DecContext *h)
intra:
/* decode each block */
if (s->mb_intra || HAS_CBP(com->mtype)) {
if (s->mb_intra || HAS_CBP(s->mtype)) {
s->bdsp.clear_blocks(h->block[0]);
for (i = 0; i < 6; i++) {
if (h261_decode_block(h, h->block[i], i, cbp & 32) < 0)

View File

@@ -58,8 +58,6 @@ static uint8_t h261_mv_codes[64][2];
typedef struct H261EncContext {
MPVMainEncContext s;
H261Context common;
int gob_number;
enum {
H261_QCIF = 0,
@@ -232,12 +230,11 @@ static void h261_encode_mb(MPVEncContext *const s, int16_t block[6][64],
/* 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;
com->mtype = 0;
s->c.mtype = 0;
if (!s->c.mb_intra) {
/* compute cbp */
@@ -264,34 +261,34 @@ static void h261_encode_mb(MPVEncContext *const s, int16_t block[6][64],
/* calculate MTYPE */
if (!s->c.mb_intra) {
com->mtype++;
s->c.mtype++;
if (mvd || s->loop_filter)
com->mtype += 3;
s->c.mtype += 3;
if (s->loop_filter)
com->mtype += 3;
s->c.mtype += 3;
if (cbp)
com->mtype++;
av_assert1(com->mtype > 1);
s->c.mtype++;
av_assert1(s->c.mtype > 1);
}
if (s->dquant && cbp) {
com->mtype++;
s->c.mtype++;
} else
s->c.qscale -= s->dquant;
put_bits(&s->pb,
ff_h261_mtype_bits[com->mtype],
ff_h261_mtype_code[com->mtype]);
ff_h261_mtype_bits[s->c.mtype],
ff_h261_mtype_code[s->c.mtype]);
com->mtype = ff_h261_mtype_map[com->mtype];
s->c.mtype = ff_h261_mtype_map[s->c.mtype];
if (IS_QUANT(com->mtype)) {
if (IS_QUANT(s->c.mtype)) {
ff_set_qscale(&s->c, s->c.qscale + s->dquant);
put_bits(&s->pb, 5, s->c.qscale);
}
if (IS_16X16(com->mtype)) {
if (IS_16X16(s->c.mtype)) {
mv_diff_x = (motion_x >> 1) - s->c.last_mv[0][0][0];
mv_diff_y = (motion_y >> 1) - s->c.last_mv[0][0][1];
s->c.last_mv[0][0][0] = (motion_x >> 1);
@@ -300,7 +297,7 @@ static void h261_encode_mb(MPVEncContext *const s, int16_t block[6][64],
h261_encode_motion(&s->pb, mv_diff_y);
}
if (HAS_CBP(com->mtype)) {
if (HAS_CBP(s->c.mtype)) {
av_assert1(cbp > 0);
put_bits(&s->pb,
ff_h261_cbp_tab[cbp - 1][1],
@@ -310,7 +307,7 @@ static void h261_encode_mb(MPVEncContext *const s, int16_t block[6][64],
/* encode each block */
h261_encode_block(h, block[i], i);
if (!IS_16X16(com->mtype)) {
if (!IS_16X16(s->c.mtype)) {
s->c.last_mv[0][0][0] = 0;
s->c.last_mv[0][0][1] = 0;
}
@@ -370,7 +367,6 @@ static av_cold int h261_encode_init(AVCodecContext *avctx)
avctx->width, avctx->height);
return AVERROR(EINVAL);
}
s->c.private_ctx = &h->common;
h->s.encode_picture_header = h261_encode_picture_header;
s->encode_mb = h261_encode_mb;

View File

@@ -80,9 +80,6 @@ typedef struct MpegEncContext {
* offsets used in ASM. */
struct AVCodecContext *avctx;
/* The following pointer is intended for codecs sharing code
* between decoder and encoder and in need of a common context to do so. */
void *private_ctx;
/* the following parameters must be initialized before encoding */
int width, height;///< picture size. must be a multiple of 16
enum OutputFormat out_format; ///< output format
@@ -210,6 +207,9 @@ typedef struct MpegEncContext {
int resync_mb_x; ///< x position of last resync marker
int resync_mb_y; ///< y position of last resync marker
/* H.261 specific */
int mtype;
/* H.263 specific */
int obmc; ///< overlapped block motion compensation