You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
vp9: support non-420 chroma subsampling for profile 1 token decoding.
This commit is contained in:
@@ -2337,10 +2337,10 @@ static void decode_coeffs(AVCodecContext *ctx)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DECODE_UV_COEF_LOOP(step) \
|
#define DECODE_UV_COEF_LOOP(step, decode_coeffs_fn) \
|
||||||
for (n = 0, y = 0; y < end_y; y += step) { \
|
for (n = 0, y = 0; y < end_y; y += step) { \
|
||||||
for (x = 0; x < end_x; x += step, n += step * step) { \
|
for (x = 0; x < end_x; x += step, n += step * step) { \
|
||||||
res = decode_coeffs_b(&s->c, s->uvblock[pl] + 16 * n, \
|
res = decode_coeffs_fn(&s->c, s->uvblock[pl] + 16 * n, \
|
||||||
16 * step * step, c, e, p, a[x] + l[y], \
|
16 * step * step, c, e, p, a[x] + l[y], \
|
||||||
uvscan, uvnb, uv_band_counts, qmul[1]); \
|
uvscan, uvnb, uv_band_counts, qmul[1]); \
|
||||||
a[x] = l[y] = !!res; \
|
a[x] = l[y] = !!res; \
|
||||||
@@ -2355,36 +2355,30 @@ static void decode_coeffs(AVCodecContext *ctx)
|
|||||||
p = s->prob.coef[b->uvtx][1 /* uv */][!b->intra];
|
p = s->prob.coef[b->uvtx][1 /* uv */][!b->intra];
|
||||||
c = s->counts.coef[b->uvtx][1 /* uv */][!b->intra];
|
c = s->counts.coef[b->uvtx][1 /* uv */][!b->intra];
|
||||||
e = s->counts.eob[b->uvtx][1 /* uv */][!b->intra];
|
e = s->counts.eob[b->uvtx][1 /* uv */][!b->intra];
|
||||||
w4 >>= 1;
|
w4 >>= s->ss_h;
|
||||||
h4 >>= 1;
|
end_x >>= s->ss_h;
|
||||||
end_x >>= 1;
|
h4 >>= s->ss_v;
|
||||||
end_y >>= 1;
|
end_y >>= s->ss_v;
|
||||||
for (pl = 0; pl < 2; pl++) {
|
for (pl = 0; pl < 2; pl++) {
|
||||||
a = &s->above_uv_nnz_ctx[pl][col];
|
a = &s->above_uv_nnz_ctx[pl][col << !s->ss_h];
|
||||||
l = &s->left_uv_nnz_ctx[pl][row & 7];
|
l = &s->left_uv_nnz_ctx[pl][(row & 7) << !s->ss_v];
|
||||||
switch (b->uvtx) {
|
switch (b->uvtx) {
|
||||||
case TX_4X4:
|
case TX_4X4:
|
||||||
DECODE_UV_COEF_LOOP(1);
|
DECODE_UV_COEF_LOOP(1, decode_coeffs_b);
|
||||||
break;
|
break;
|
||||||
case TX_8X8:
|
case TX_8X8:
|
||||||
MERGE_CTX(2, AV_RN16A);
|
MERGE_CTX(2, AV_RN16A);
|
||||||
DECODE_UV_COEF_LOOP(2);
|
DECODE_UV_COEF_LOOP(2, decode_coeffs_b);
|
||||||
SPLAT_CTX(2);
|
SPLAT_CTX(2);
|
||||||
break;
|
break;
|
||||||
case TX_16X16:
|
case TX_16X16:
|
||||||
MERGE_CTX(4, AV_RN32A);
|
MERGE_CTX(4, AV_RN32A);
|
||||||
DECODE_UV_COEF_LOOP(4);
|
DECODE_UV_COEF_LOOP(4, decode_coeffs_b);
|
||||||
SPLAT_CTX(4);
|
SPLAT_CTX(4);
|
||||||
break;
|
break;
|
||||||
case TX_32X32:
|
case TX_32X32:
|
||||||
MERGE_CTX(8, AV_RN64A);
|
MERGE_CTX(8, AV_RN64A);
|
||||||
// a 64x64 (max) uv block can ever only contain 1 tx32x32 block
|
DECODE_UV_COEF_LOOP(8, decode_coeffs_b32);
|
||||||
// so there is no need to loop
|
|
||||||
res = decode_coeffs_b32(&s->c, s->uvblock[pl],
|
|
||||||
1024, c, e, p, a[0] + l[0],
|
|
||||||
uvscan, uvnb, uv_band_counts, qmul[1]);
|
|
||||||
a[0] = l[0] = !!res;
|
|
||||||
AV_WN16A(&s->uveob[pl][0], res);
|
|
||||||
SPLAT_CTX(8);
|
SPLAT_CTX(8);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -3031,34 +3025,39 @@ static void decode_b(AVCodecContext *ctx, int row, int col,
|
|||||||
case 8: AV_ZERO64(&v); break; \
|
case 8: AV_ZERO64(&v); break; \
|
||||||
case 16: AV_ZERO128(&v); break; \
|
case 16: AV_ZERO128(&v); break; \
|
||||||
}
|
}
|
||||||
#define SPLAT_ZERO_YUV(dir, var, off, n) \
|
#define SPLAT_ZERO_YUV(dir, var, off, n, dir2) \
|
||||||
do { \
|
do { \
|
||||||
SPLAT_ZERO_CTX(s->dir##_y_##var[off * 2], n * 2); \
|
SPLAT_ZERO_CTX(s->dir##_y_##var[off * 2], n * 2); \
|
||||||
|
if (s->ss_##dir2) { \
|
||||||
SPLAT_ZERO_CTX(s->dir##_uv_##var[0][off], n); \
|
SPLAT_ZERO_CTX(s->dir##_uv_##var[0][off], n); \
|
||||||
SPLAT_ZERO_CTX(s->dir##_uv_##var[1][off], n); \
|
SPLAT_ZERO_CTX(s->dir##_uv_##var[1][off], n); \
|
||||||
|
} else { \
|
||||||
|
SPLAT_ZERO_CTX(s->dir##_uv_##var[0][off * 2], n * 2); \
|
||||||
|
SPLAT_ZERO_CTX(s->dir##_uv_##var[1][off * 2], n * 2); \
|
||||||
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
switch (w4) {
|
switch (w4) {
|
||||||
case 1: SPLAT_ZERO_YUV(above, nnz_ctx, col, 1); break;
|
case 1: SPLAT_ZERO_YUV(above, nnz_ctx, col, 1, h); break;
|
||||||
case 2: SPLAT_ZERO_YUV(above, nnz_ctx, col, 2); break;
|
case 2: SPLAT_ZERO_YUV(above, nnz_ctx, col, 2, h); break;
|
||||||
case 4: SPLAT_ZERO_YUV(above, nnz_ctx, col, 4); break;
|
case 4: SPLAT_ZERO_YUV(above, nnz_ctx, col, 4, h); break;
|
||||||
case 8: SPLAT_ZERO_YUV(above, nnz_ctx, col, 8); break;
|
case 8: SPLAT_ZERO_YUV(above, nnz_ctx, col, 8, h); break;
|
||||||
}
|
}
|
||||||
switch (h4) {
|
switch (h4) {
|
||||||
case 1: SPLAT_ZERO_YUV(left, nnz_ctx, row7, 1); break;
|
case 1: SPLAT_ZERO_YUV(left, nnz_ctx, row7, 1, v); break;
|
||||||
case 2: SPLAT_ZERO_YUV(left, nnz_ctx, row7, 2); break;
|
case 2: SPLAT_ZERO_YUV(left, nnz_ctx, row7, 2, v); break;
|
||||||
case 4: SPLAT_ZERO_YUV(left, nnz_ctx, row7, 4); break;
|
case 4: SPLAT_ZERO_YUV(left, nnz_ctx, row7, 4, v); break;
|
||||||
case 8: SPLAT_ZERO_YUV(left, nnz_ctx, row7, 8); break;
|
case 8: SPLAT_ZERO_YUV(left, nnz_ctx, row7, 8, v); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (s->pass == 1) {
|
if (s->pass == 1) {
|
||||||
s->b++;
|
s->b++;
|
||||||
s->block += w4 * h4 * 64;
|
s->block += w4 * h4 * 64;
|
||||||
s->uvblock[0] += w4 * h4 * 16;
|
s->uvblock[0] += w4 * h4 * 64 >> (s->ss_h + s->ss_v);
|
||||||
s->uvblock[1] += w4 * h4 * 16;
|
s->uvblock[1] += w4 * h4 * 64 >> (s->ss_h + s->ss_v);
|
||||||
s->eob += 4 * w4 * h4;
|
s->eob += 4 * w4 * h4;
|
||||||
s->uveob[0] += w4 * h4;
|
s->uveob[0] += 4 * w4 * h4 >> (s->ss_h + s->ss_v);
|
||||||
s->uveob[1] += w4 * h4;
|
s->uveob[1] += 4 * w4 * h4 >> (s->ss_h + s->ss_v);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -3155,11 +3154,11 @@ static void decode_b(AVCodecContext *ctx, int row, int col,
|
|||||||
if (s->pass == 2) {
|
if (s->pass == 2) {
|
||||||
s->b++;
|
s->b++;
|
||||||
s->block += w4 * h4 * 64;
|
s->block += w4 * h4 * 64;
|
||||||
s->uvblock[0] += w4 * h4 * 16;
|
s->uvblock[0] += w4 * h4 * 64 >> (s->ss_v + s->ss_h);
|
||||||
s->uvblock[1] += w4 * h4 * 16;
|
s->uvblock[1] += w4 * h4 * 64 >> (s->ss_v + s->ss_h);
|
||||||
s->eob += 4 * w4 * h4;
|
s->eob += 4 * w4 * h4;
|
||||||
s->uveob[0] += w4 * h4;
|
s->uveob[0] += 4 * w4 * h4 >> (s->ss_v + s->ss_h);
|
||||||
s->uveob[1] += w4 * h4;
|
s->uveob[1] += 4 * w4 * h4 >> (s->ss_v + s->ss_h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user