mirror of
https://code.videolan.org/videolan/dav1d
synced 2026-06-11 12:13:03 +00:00
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:
+21
-24
@@ -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];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user