Don't copy non modified planes when applying film grain

Create new references instead.

Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
James Almer
2023-02-25 22:33:46 +00:00
parent 92d8b81542
commit 98b0c96d21
+21 -24
View File
@@ -37,6 +37,7 @@
#include "common/bitdepth.h"
#include "src/fg_apply.h"
#include "src/ref.h"
static void generate_scaling(const int bitdepth,
const uint8_t points[][2], const int num,
@@ -125,36 +126,32 @@ void bitfn(dav1d_prep_grain)(const Dav1dFilmGrainDSPContext *const dsp,
if (data->num_uv_points[1])
generate_scaling(in->p.bpc, data->uv_points[1], data->num_uv_points[1], scaling[2]);
// Copy over the non-modified planes
// TODO: eliminate in favor of per-plane refs
// Create new references for the non-modified planes
assert(out->stride[0] == in->stride[0]);
if (!data->num_y_points) {
const ptrdiff_t stride = out->stride[0];
const ptrdiff_t sz = out->p.h * stride;
if (sz < 0)
memcpy((uint8_t*) out->data[0] + sz - stride,
(uint8_t*) in->data[0] + sz - stride, -sz);
else
memcpy(out->data[0], in->data[0], sz);
struct Dav1dRef **out_plane_ref = out->ref->user_data;
struct Dav1dRef **in_plane_ref = in->ref->user_data;
dav1d_ref_dec(&out_plane_ref[0]);
out_plane_ref[0] = in_plane_ref[0];
dav1d_ref_inc(out_plane_ref[0]);
out->data[0] = in->data[0];
}
if (in->p.layout != DAV1D_PIXEL_LAYOUT_I400 && !data->chroma_scaling_from_luma) {
assert(out->stride[1] == in->stride[1]);
const int ss_ver = in->p.layout == DAV1D_PIXEL_LAYOUT_I420;
const ptrdiff_t stride = out->stride[1];
const ptrdiff_t sz = ((out->p.h + ss_ver) >> ss_ver) * stride;
if (sz < 0) {
if (!data->num_uv_points[0])
memcpy((uint8_t*) out->data[1] + sz - stride,
(uint8_t*) in->data[1] + sz - stride, -sz);
if (!data->num_uv_points[1])
memcpy((uint8_t*) out->data[2] + sz - stride,
(uint8_t*) in->data[2] + sz - stride, -sz);
} else {
if (!data->num_uv_points[0])
memcpy(out->data[1], in->data[1], sz);
if (!data->num_uv_points[1])
memcpy(out->data[2], in->data[2], sz);
struct Dav1dRef **out_plane_ref = out->ref->user_data;
struct Dav1dRef **in_plane_ref = in->ref->user_data;
if (!data->num_uv_points[0]) {
dav1d_ref_dec(&out_plane_ref[1]);
out_plane_ref[1] = in_plane_ref[1];
dav1d_ref_inc(out_plane_ref[1]);
out->data[1] = in->data[1];
}
if (!data->num_uv_points[1]) {
dav1d_ref_dec(&out_plane_ref[2]);
out_plane_ref[2] = in_plane_ref[2];
dav1d_ref_inc(out_plane_ref[2]);
out->data[2] = in->data[2];
}
}
}