summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.com>2018-08-23 22:57:35 +0200
committerTim-Philipp Müller <tim@centricular.com>2019-05-01 19:48:36 +0100
commit85e7115615e8133deae0d4898243515ad5883eb2 (patch)
tree38c49d62b9bbb6f426fcac55c3b2fc6d99cd2dcd
parentcec04edb7db09fc77af2b546990c4343b190d7bd (diff)
downloadgstreamer-plugins-good-85e7115615e8133deae0d4898243515ad5883eb2.tar.gz
matroska: fix handling of FlagInterlaced
This is an enum not a boolean, and a value of 2 signals that the video is progressive, but we would mistakenly set interlace-mode=mixed on the output caps. https://bugzilla.gnome.org/show_bug.cgi?id=787206
-rw-r--r--gst/matroska/matroska-demux.c32
-rw-r--r--gst/matroska/matroska-ids.h8
-rw-r--r--gst/matroska/matroska-mux.c23
-rw-r--r--gst/matroska/matroska-parse.c17
4 files changed, 59 insertions, 21 deletions
diff --git a/gst/matroska/matroska-demux.c b/gst/matroska/matroska-demux.c
index 284cb6276..f18e1d537 100644
--- a/gst/matroska/matroska-demux.c
+++ b/gst/matroska/matroska-demux.c
@@ -844,13 +844,18 @@ gst_matroska_demux_parse_stream (GstMatroskaDemux * demux, GstEbmlRead * ebml,
if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
break;
- if (num)
- context->flags |= GST_MATROSKA_VIDEOTRACK_INTERLACED;
+ if (num == 1)
+ videocontext->interlace_mode =
+ GST_MATROSKA_INTERLACE_MODE_INTERLACED;
+ else if (num == 2)
+ videocontext->interlace_mode =
+ GST_MATROSKA_INTERLACE_MODE_PROGRESSIVE;
else
- context->flags &= ~GST_MATROSKA_VIDEOTRACK_INTERLACED;
- GST_DEBUG_OBJECT (demux, "TrackVideoInterlaced: %d",
- (context->flags & GST_MATROSKA_VIDEOTRACK_INTERLACED) ? 1 :
- 0);
+ videocontext->interlace_mode =
+ GST_MATROSKA_INTERLACE_MODE_UNKNOWN;
+
+ GST_DEBUG_OBJECT (demux, "video track interlacing mode: %d",
+ videocontext->interlace_mode);
break;
}
@@ -5868,9 +5873,18 @@ gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *
0, 1, NULL);
}
- if (videocontext->parent.flags & GST_MATROSKA_VIDEOTRACK_INTERLACED)
- gst_structure_set (structure, "interlace-mode", G_TYPE_STRING,
- "mixed", NULL);
+ switch (videocontext->interlace_mode) {
+ case GST_MATROSKA_INTERLACE_MODE_PROGRESSIVE:
+ gst_structure_set (structure,
+ "interlace-mode", G_TYPE_STRING, "progressive", NULL);
+ break;
+ case GST_MATROSKA_INTERLACE_MODE_INTERLACED:
+ gst_structure_set (structure,
+ "interlace-mode", G_TYPE_STRING, "mixed", NULL);
+ break;
+ default:
+ break;
+ }
}
if (videocontext->multiview_mode != GST_VIDEO_MULTIVIEW_MODE_NONE) {
if (gst_video_multiview_guess_half_aspect (videocontext->multiview_mode,
diff --git a/gst/matroska/matroska-ids.h b/gst/matroska/matroska-ids.h
index 9a88010d0..c2e41e549 100644
--- a/gst/matroska/matroska-ids.h
+++ b/gst/matroska/matroska-ids.h
@@ -500,8 +500,10 @@ typedef enum {
} GstMatroskaTrackFlags;
typedef enum {
- GST_MATROSKA_VIDEOTRACK_INTERLACED = (GST_MATROSKA_TRACK_SHIFT<<0)
-} GstMatroskaVideoTrackFlags;
+ GST_MATROSKA_INTERLACE_MODE_UNKNOWN = 0,
+ GST_MATROSKA_INTERLACE_MODE_INTERLACED = 1,
+ GST_MATROSKA_INTERLACE_MODE_PROGRESSIVE = 2,
+} GstMatroskaInterlaceMode;
typedef enum {
GST_MATROSKA_STEREO_MODE_SBS_LR = 0x1,
@@ -596,6 +598,8 @@ typedef struct _GstMatroskaTrackVideoContext {
GstMatroskaAspectRatioMode asr_mode;
guint32 fourcc;
+ GstMatroskaInterlaceMode interlace_mode;
+
GstVideoMultiviewMode multiview_mode;
GstVideoMultiviewFlags multiview_flags;
diff --git a/gst/matroska/matroska-mux.c b/gst/matroska/matroska-mux.c
index 0d129fca4..ea5ad2c72 100644
--- a/gst/matroska/matroska-mux.c
+++ b/gst/matroska/matroska-mux.c
@@ -1004,8 +1004,14 @@ gst_matroska_mux_video_pad_setcaps (GstPad * pad, GstCaps * caps)
mimetype = gst_structure_get_name (structure);
interlace_mode = gst_structure_get_string (structure, "interlace-mode");
- if (interlace_mode != NULL && strcmp (interlace_mode, "progressive") != 0)
- context->flags |= GST_MATROSKA_VIDEOTRACK_INTERLACED;
+ if (interlace_mode != NULL) {
+ if (strcmp (interlace_mode, "progressive") == 0)
+ videocontext->interlace_mode = GST_MATROSKA_INTERLACE_MODE_PROGRESSIVE;
+ else
+ videocontext->interlace_mode = GST_MATROSKA_INTERLACE_MODE_INTERLACED;
+ } else {
+ videocontext->interlace_mode = GST_MATROSKA_INTERLACE_MODE_UNKNOWN;
+ }
if (!strcmp (mimetype, "video/x-theora")) {
/* we'll extract the details later from the theora identification header */
@@ -2558,8 +2564,17 @@ gst_matroska_mux_track_header (GstMatroskaMux * mux,
gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEODISPLAYHEIGHT,
videocontext->display_height);
}
- if (context->flags & GST_MATROSKA_VIDEOTRACK_INTERLACED)
- gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEOFLAGINTERLACED, 1);
+ switch (videocontext->interlace_mode) {
+ case GST_MATROSKA_INTERLACE_MODE_INTERLACED:
+ gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEOFLAGINTERLACED, 1);
+ break;
+ case GST_MATROSKA_INTERLACE_MODE_PROGRESSIVE:
+ gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEOFLAGINTERLACED, 2);
+ break;
+ default:
+ break;
+ }
+
if (videocontext->fourcc) {
guint32 fcc_le = GUINT32_TO_LE (videocontext->fourcc);
diff --git a/gst/matroska/matroska-parse.c b/gst/matroska/matroska-parse.c
index 006a46d29..069f581dd 100644
--- a/gst/matroska/matroska-parse.c
+++ b/gst/matroska/matroska-parse.c
@@ -542,13 +542,18 @@ gst_matroska_parse_add_stream (GstMatroskaParse * parse, GstEbmlRead * ebml)
if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
break;
- if (num)
- context->flags |= GST_MATROSKA_VIDEOTRACK_INTERLACED;
+ if (num == 1)
+ videocontext->interlace_mode =
+ GST_MATROSKA_INTERLACE_MODE_INTERLACED;
+ else if (num == 2)
+ videocontext->interlace_mode =
+ GST_MATROSKA_INTERLACE_MODE_PROGRESSIVE;
else
- context->flags &= ~GST_MATROSKA_VIDEOTRACK_INTERLACED;
- GST_DEBUG_OBJECT (parse, "TrackVideoInterlaced: %d",
- (context->flags & GST_MATROSKA_VIDEOTRACK_INTERLACED) ? 1 :
- 0);
+ videocontext->interlace_mode =
+ GST_MATROSKA_INTERLACE_MODE_UNKNOWN;
+
+ GST_DEBUG_OBJECT (parse, "video track interlacing mode: %d",
+ videocontext->interlace_mode);
break;
}