lavc/ffv1: always use the main context values of plane_count/transparency

They cannot change between slices.
release/7.1
Anton Khirnov 6 months ago
parent 492df65201
commit 39486a2b29
  1. 2
      libavcodec/ffv1.c
  2. 5
      libavcodec/ffv1dec.c
  3. 2
      libavcodec/ffv1dec_template.c
  4. 2
      libavcodec/ffv1enc.c
  5. 2
      libavcodec/ffv1enc_template.c

@ -56,8 +56,6 @@ av_cold int ff_ffv1_init_slice_state(const FFV1Context *f, FFV1Context *fs)
{ {
int j, i; int j, i;
fs->plane_count = f->plane_count;
fs->transparency = f->transparency;
for (j = 0; j < f->plane_count; j++) { for (j = 0; j < f->plane_count; j++) {
PlaneContext *const p = &fs->plane[j]; PlaneContext *const p = &fs->plane[j];

@ -270,7 +270,6 @@ static int decode_slice(AVCodecContext *c, void *arg)
if(f->fsrc && !(p->flags & AV_FRAME_FLAG_KEY)) { if(f->fsrc && !(p->flags & AV_FRAME_FLAG_KEY)) {
FFV1Context *fssrc = f->fsrc->slice_context[si]; FFV1Context *fssrc = f->fsrc->slice_context[si];
av_assert1(fs->plane_count == fssrc->plane_count);
if (!(p->flags & AV_FRAME_FLAG_KEY)) if (!(p->flags & AV_FRAME_FLAG_KEY))
fs->slice_damaged |= fssrc->slice_damaged; fs->slice_damaged |= fssrc->slice_damaged;
@ -330,7 +329,7 @@ static int decode_slice(AVCodecContext *c, void *arg)
} }
av_assert1(width && height); av_assert1(width && height);
if (f->colorspace == 0 && (f->chroma_planes || !fs->transparency)) { if (f->colorspace == 0 && (f->chroma_planes || !f->transparency)) {
const int chroma_width = AV_CEIL_RSHIFT(width, f->chroma_h_shift); const int chroma_width = AV_CEIL_RSHIFT(width, f->chroma_h_shift);
const int chroma_height = AV_CEIL_RSHIFT(height, f->chroma_v_shift); const int chroma_height = AV_CEIL_RSHIFT(height, f->chroma_v_shift);
const int cx = x >> f->chroma_h_shift; const int cx = x >> f->chroma_h_shift;
@ -341,7 +340,7 @@ static int decode_slice(AVCodecContext *c, void *arg)
decode_plane(f, fs, sc, &gb, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1, 1); decode_plane(f, fs, sc, &gb, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1, 1);
decode_plane(f, fs, sc, &gb, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1, 1); decode_plane(f, fs, sc, &gb, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1, 1);
} }
if (fs->transparency) if (f->transparency)
decode_plane(f, fs, sc, &gb, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], (f->version >= 4 && !f->chroma_planes) ? 1 : 2, 1); decode_plane(f, fs, sc, &gb, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], (f->version >= 4 && !f->chroma_planes) ? 1 : 2, 1);
} else if (f->colorspace == 0) { } else if (f->colorspace == 0) {
decode_plane(f, fs, sc, &gb, p->data[0] + ps*x + y*p->linesize[0] , width, height, p->linesize[0], 0, 2); decode_plane(f, fs, sc, &gb, p->data[0] + ps*x + y*p->linesize[0] , width, height, p->linesize[0], 0, 2);

@ -141,7 +141,7 @@ static int RENAME(decode_rgb_frame)(FFV1Context *f,
int lbd = s->avctx->bits_per_raw_sample <= 8; int lbd = s->avctx->bits_per_raw_sample <= 8;
int bits = s->avctx->bits_per_raw_sample > 0 ? s->avctx->bits_per_raw_sample : 8; int bits = s->avctx->bits_per_raw_sample > 0 ? s->avctx->bits_per_raw_sample : 8;
int offset = 1 << bits; int offset = 1 << bits;
int transparency = s->transparency; int transparency = f->transparency;
for (x = 0; x < 4; x++) { for (x = 0; x < 4; x++) {
sample[x][0] = RENAME(sc->sample_buffer) + x * 2 * (w + 6) + 3; sample[x][0] = RENAME(sc->sample_buffer) + x * 2 * (w + 6) + 3;

@ -1072,7 +1072,7 @@ retry:
ret |= encode_plane(f, fs, sc, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1, 1); ret |= encode_plane(f, fs, sc, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1, 1);
ret |= encode_plane(f, fs, sc, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1, 1); ret |= encode_plane(f, fs, sc, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1, 1);
} }
if (fs->transparency) if (f->transparency)
ret |= encode_plane(f, fs, sc, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2, 1); ret |= encode_plane(f, fs, sc, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2, 1);
} else if (c->pix_fmt == AV_PIX_FMT_YA8) { } else if (c->pix_fmt == AV_PIX_FMT_YA8) {
ret = encode_plane(f, fs, sc, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 2); ret = encode_plane(f, fs, sc, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 2);

@ -138,7 +138,7 @@ static int RENAME(encode_rgb_frame)(FFV1Context *f,
int packed = !src[1]; int packed = !src[1];
int bits = s->bits_per_raw_sample > 0 ? s->bits_per_raw_sample : 8; int bits = s->bits_per_raw_sample > 0 ? s->bits_per_raw_sample : 8;
int offset = 1 << bits; int offset = 1 << bits;
int transparency = s->transparency; int transparency = f->transparency;
int packed_size = (3 + transparency)*2; int packed_size = (3 + transparency)*2;
sc->run_index = 0; sc->run_index = 0;

Loading…
Cancel
Save