summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorquietvoid <39477805+quietvoid@users.noreply.github.com>2023-02-13 21:04:04 -0500
committerNiklas Haas <github-daiK1o@haasn.dev>2023-02-19 20:50:37 +0100
commit0d82afbc7f5138735b1010aaa7f050d68537bc86 (patch)
tree45a89fe9b93a4476721dd73fe858c49e36f703f1
parent2955a0759c6d88780407968f78f4236e65bf96d4 (diff)
downloadmpv-0d82afbc7f5138735b1010aaa7f050d68537bc86.tar.bz2
mpv-0d82afbc7f5138735b1010aaa7f050d68537bc86.tar.xz
mp_image: forward AV_FRAME_DATA_DOVI_RPU_BUFFER side data
When available, and ignored if `vf=format:dolbyvision=no`.
-rw-r--r--video/filter/vf_format.c4
-rw-r--r--video/mp_image.c8
-rw-r--r--video/mp_image.h2
3 files changed, 13 insertions, 1 deletions
diff --git a/video/filter/vf_format.c b/video/filter/vf_format.c
index 8fd43450e3..6c3061ce0a 100644
--- a/video/filter/vf_format.c
+++ b/video/filter/vf_format.c
@@ -154,8 +154,10 @@ static void vf_format_process(struct mp_filter *f)
mp_image_params_guess_csp(&img->params);
}
- if (!priv->opts->dovi)
+ if (!priv->opts->dovi) {
av_buffer_unref(&img->dovi);
+ av_buffer_unref(&img->dovi_buf);
+ }
if (!priv->opts->film_grain)
av_buffer_unref(&img->film_grain);
diff --git a/video/mp_image.c b/video/mp_image.c
index 7250a261cf..4296d70d7e 100644
--- a/video/mp_image.c
+++ b/video/mp_image.c
@@ -210,6 +210,7 @@ static void mp_image_destructor(void *ptr)
av_buffer_unref(&mpi->a53_cc);
av_buffer_unref(&mpi->dovi);
av_buffer_unref(&mpi->film_grain);
+ av_buffer_unref(&mpi->dovi_buf);
for (int n = 0; n < mpi->num_ff_side_data; n++)
av_buffer_unref(&mpi->ff_side_data[n].buf);
talloc_free(mpi->ff_side_data);
@@ -346,6 +347,7 @@ struct mp_image *mp_image_new_ref(struct mp_image *img)
ref_buffer(&ok, &new->a53_cc);
ref_buffer(&ok, &new->dovi);
ref_buffer(&ok, &new->film_grain);
+ ref_buffer(&ok, &new->dovi_buf);
new->ff_side_data = talloc_memdup(NULL, new->ff_side_data,
new->num_ff_side_data * sizeof(new->ff_side_data[0]));
@@ -389,6 +391,7 @@ struct mp_image *mp_image_new_dummy_ref(struct mp_image *img)
new->a53_cc = NULL;
new->dovi = NULL;
new->film_grain = NULL;
+ new->dovi_buf = NULL;
new->num_ff_side_data = 0;
new->ff_side_data = NULL;
return new;
@@ -539,6 +542,7 @@ void mp_image_copy_attributes(struct mp_image *dst, struct mp_image *src)
}
assign_bufref(&dst->icc_profile, src->icc_profile);
assign_bufref(&dst->dovi, src->dovi);
+ assign_bufref(&dst->dovi_buf, src->dovi_buf);
assign_bufref(&dst->film_grain, src->film_grain);
assign_bufref(&dst->a53_cc, src->a53_cc);
}
@@ -1024,6 +1028,10 @@ struct mp_image *mp_image_from_av_frame(struct AVFrame *src)
if (rpu->disable_residual_flag)
dst->dovi = sd->buf;
}
+
+ sd = av_frame_get_side_data(src, AV_FRAME_DATA_DOVI_RPU_BUFFER);
+ if (sd)
+ dst->dovi_buf = sd->buf;
#endif
sd = av_frame_get_side_data(src, AV_FRAME_DATA_FILM_GRAIN_PARAMS);
diff --git a/video/mp_image.h b/video/mp_image.h
index ac23252fff..98dd666412 100644
--- a/video/mp_image.h
+++ b/video/mp_image.h
@@ -112,6 +112,8 @@ typedef struct mp_image {
struct AVBufferRef *dovi;
// Film grain data, if any
struct AVBufferRef *film_grain;
+ // Dolby Vision RPU buffer, if any
+ struct AVBufferRef *dovi_buf;
// Other side data we don't care about.
struct mp_ff_side_data *ff_side_data;
int num_ff_side_data;