|
|
@@ -73,6 +73,8 @@ typedef struct Mpeg12SliceContext {
|
|
|
MPVContext c;
|
|
|
GetBitContext gb;
|
|
|
|
|
|
+ int last_dc[3]; ///< last DC values
|
|
|
+
|
|
|
DECLARE_ALIGNED_32(int16_t, block)[12][64];
|
|
|
} Mpeg12SliceContext;
|
|
|
|
|
|
@@ -326,9 +328,9 @@ static inline int mpeg2_decode_block_intra(Mpeg12SliceContext *const s,
|
|
|
component = (n & 1) + 1;
|
|
|
}
|
|
|
diff = decode_dc(&s->gb, component);
|
|
|
- dc = s->c.last_dc[component];
|
|
|
+ dc = s->last_dc[component];
|
|
|
dc += diff;
|
|
|
- s->c.last_dc[component] = dc;
|
|
|
+ s->last_dc[component] = dc;
|
|
|
block[0] = dc * (1 << (3 - s->c.intra_dc_precision));
|
|
|
ff_tlog(s->c.avctx, "dc=%d\n", block[0]);
|
|
|
mismatch = block[0] ^ 1;
|
|
|
@@ -517,7 +519,7 @@ static int mpeg_decode_mb(Mpeg12SliceContext *const s, int *mb_skip_run)
|
|
|
ret = ff_mpeg1_decode_block_intra(&s->gb,
|
|
|
s->c.intra_matrix,
|
|
|
s->c.intra_scantable.permutated,
|
|
|
- s->c.last_dc, s->block[i],
|
|
|
+ s->last_dc, s->block[i],
|
|
|
i, s->c.qscale);
|
|
|
if (ret < 0) {
|
|
|
av_log(s->c.avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n",
|
|
|
@@ -713,7 +715,7 @@ static int mpeg_decode_mb(Mpeg12SliceContext *const s, int *mb_skip_run)
|
|
|
}
|
|
|
|
|
|
s->c.mb_intra = 0;
|
|
|
- s->c.last_dc[0] = s->c.last_dc[1] = s->c.last_dc[2] = 128 << s->c.intra_dc_precision;
|
|
|
+ s->last_dc[0] = s->last_dc[1] = s->last_dc[2] = 128 << s->c.intra_dc_precision;
|
|
|
if (HAS_CBP(mb_type)) {
|
|
|
s->c.bdsp.clear_blocks(s->block[0]);
|
|
|
|
|
|
@@ -1453,9 +1455,9 @@ static int mpeg_decode_slice(Mpeg12SliceContext *const s, int mb_y,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- s->c.last_dc[0] = 128 << s->c.intra_dc_precision;
|
|
|
- s->c.last_dc[1] = s->c.last_dc[0];
|
|
|
- s->c.last_dc[2] = s->c.last_dc[0];
|
|
|
+ s->last_dc[0] = 128 << s->c.intra_dc_precision;
|
|
|
+ s->last_dc[1] = s->last_dc[0];
|
|
|
+ s->last_dc[2] = s->last_dc[0];
|
|
|
memset(s->c.last_mv, 0, sizeof(s->c.last_mv));
|
|
|
|
|
|
for (int mb_skip_run = 0;;) {
|
|
|
@@ -1600,7 +1602,7 @@ static int mpeg_decode_slice(Mpeg12SliceContext *const s, int mb_y,
|
|
|
s->c.mb_intra = 0;
|
|
|
for (i = 0; i < 12; i++)
|
|
|
s->c.block_last_index[i] = -1;
|
|
|
- s->c.last_dc[0] = s->c.last_dc[1] = s->c.last_dc[2] = 128 << s->c.intra_dc_precision;
|
|
|
+ s->last_dc[0] = s->last_dc[1] = s->last_dc[2] = 128 << s->c.intra_dc_precision;
|
|
|
if (s->c.picture_structure == PICT_FRAME)
|
|
|
s->c.mv_type = MV_TYPE_16X16;
|
|
|
else
|
|
|
@@ -2793,7 +2795,7 @@ static int ipu_decode_frame(AVCodecContext *avctx, AVFrame *frame,
|
|
|
s->flags & 0x10 ? ff_alternate_vertical_scan : ff_zigzag_direct,
|
|
|
m->idsp.idct_permutation);
|
|
|
|
|
|
- m->last_dc[0] = m->last_dc[1] = m->last_dc[2] = 1 << (7 + (s->flags & 3));
|
|
|
+ s->m.last_dc[0] = s->m.last_dc[1] = s->m.last_dc[2] = 128 << (s->flags & 3);
|
|
|
m->qscale = 1;
|
|
|
|
|
|
for (int y = 0; y < avctx->height; y += 16) {
|
|
|
@@ -2825,7 +2827,7 @@ static int ipu_decode_frame(AVCodecContext *avctx, AVFrame *frame,
|
|
|
ret = ff_mpeg1_decode_block_intra(gb,
|
|
|
m->intra_matrix,
|
|
|
m->intra_scantable.permutated,
|
|
|
- m->last_dc, block[n],
|
|
|
+ s->m.last_dc, block[n],
|
|
|
n, m->qscale);
|
|
|
} else {
|
|
|
ret = mpeg2_decode_block_intra(&s->m, block[n], n);
|