[vlc-devel] [PATCH v3] snapshot: fix snapshots cropping
Romain Vimont
rom at rom1v.com
Mon Nov 6 11:06:20 CET 2017
The snapshot picture was created using picture_Copy(), which does not
handle offsets. As a consequence, snapshots of cropped videos were
broken.
Use picture_Clone() (shallow copy) instead, then copy the crop settings
from the format.
Fixes <https://trac.videolan.org/vlc/ticket/18970>.
Signed-off-by: Romain Vimont <rom at rom1v.com>
---
CHANGES from v2:
- remove 'picture_CloneRegion' implementation, use picture_Clone() instead
- make vout_snapshot_Set() picture parameter a non-const pointer (for cloning)
src/misc/image.c | 5 +++++
src/video_output/snapshot.c | 6 +++---
src/video_output/snapshot.h | 4 ++--
3 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/src/misc/image.c b/src/misc/image.c
index aa5dd43a2d..7c3ad995c8 100644
--- a/src/misc/image.c
+++ b/src/misc/image.c
@@ -778,6 +778,11 @@ static filter_t *CreateFilter( vlc_object_t *p_this, const es_format_t *p_fmt_in
es_format_Copy( &p_filter->fmt_in, p_fmt_in );
es_format_Copy( &p_filter->fmt_out, p_fmt_in );
video_format_Copy( &p_filter->fmt_out.video, p_fmt_out );
+
+ /* whatever the input offset, write at offset 0 in the target image */
+ p_filter->fmt_out.video.i_x_offset = 0;
+ p_filter->fmt_out.video.i_y_offset = 0;
+
p_filter->fmt_out.i_codec = p_fmt_out->i_chroma;
p_filter->p_module = module_need( p_filter, "video converter", NULL, false );
diff --git a/src/video_output/snapshot.c b/src/video_output/snapshot.c
index ceade008cc..f9bc106d73 100644
--- a/src/video_output/snapshot.c
+++ b/src/video_output/snapshot.c
@@ -112,18 +112,18 @@ bool vout_snapshot_IsRequested(vout_snapshot_t *snap)
}
void vout_snapshot_Set(vout_snapshot_t *snap,
const video_format_t *fmt,
- const picture_t *picture)
+ picture_t *picture)
{
if (!fmt)
fmt = &picture->format;
vlc_mutex_lock(&snap->lock);
while (snap->request_count > 0) {
- picture_t *dup = picture_NewFromFormat(fmt);
+ picture_t *dup = picture_Clone(picture);
if (!dup)
break;
- picture_Copy(dup, picture);
+ video_format_CopyCrop( &dup->format, fmt );
dup->p_next = snap->picture;
snap->picture = dup;
diff --git a/src/video_output/snapshot.h b/src/video_output/snapshot.h
index b27a7212e9..3085d5038b 100644
--- a/src/video_output/snapshot.h
+++ b/src/video_output/snapshot.h
@@ -53,11 +53,11 @@ bool vout_snapshot_IsRequested(vout_snapshot_t *);
/**
* It set the picture used to create the snapshots.
*
- * The given picture is only copied and not released.
+ * The given picture is cloned.
* If p_fmt is non NULL it will override the format of the p_picture (mainly
* used because of aspect/crop problems).
*/
-void vout_snapshot_Set(vout_snapshot_t *, const video_format_t *, const picture_t *);
+void vout_snapshot_Set(vout_snapshot_t *, const video_format_t *, picture_t *);
/**
* This function will return the directory used for snapshots
--
2.11.0
More information about the vlc-devel
mailing list