summaryrefslogtreecommitdiffstats
path: root/gst/matroska/matroska-mux.c
diff options
context:
space:
mode:
authorMark Nauwelaerts <manauw@skynet.be>2006-04-25 11:45:00 +0000
committerTim-Philipp Müller <tim@centricular.net>2006-04-25 11:45:00 +0000
commita0b8e8176ac2824d1dda535f97bd52490d75ce2b (patch)
tree5f284a2a4b747be7c0b499234948602b6920d5ff /gst/matroska/matroska-mux.c
parent2e1a9a0472b1ac3edb5873333266a0124a4b5986 (diff)
gst/matroska/matroska-demux.c: Handle codec_data for VfW compatibility codec IDs (#339451)
Original commit message from CVS: Patch by: Mark Nauwelaerts <manauw at skynet dot be> * gst/matroska/matroska-demux.c: (gst_matroska_demux_video_caps): Handle codec_data for VfW compatibility codec IDs (#339451) * gst/matroska/matroska-mux.c: (gst_matroska_mux_video_pad_setcaps): Same here, handle codec_data and add additional caps we can handle now to the pad template (huffyuv, dv and h263 video) (#339451)
Diffstat (limited to 'gst/matroska/matroska-mux.c')
-rw-r--r--gst/matroska/matroska-mux.c84
1 files changed, 51 insertions, 33 deletions
diff --git a/gst/matroska/matroska-mux.c b/gst/matroska/matroska-mux.c
index 4750172c..7ce6ab5d 100644
--- a/gst/matroska/matroska-mux.c
+++ b/gst/matroska/matroska-mux.c
@@ -72,6 +72,12 @@ static GstStaticPadTemplate videosink_templ =
COMMON_VIDEO_CAPS "; "
"video/x-xvid, "
COMMON_VIDEO_CAPS "; "
+ "video/x-huffyuv, "
+ COMMON_VIDEO_CAPS "; "
+ "video/x-dv, "
+ COMMON_VIDEO_CAPS "; "
+ "video/x-h263, "
+ COMMON_VIDEO_CAPS "; "
"video/x-msmpeg, "
COMMON_VIDEO_CAPS "; "
"image/jpeg, "
@@ -484,12 +490,17 @@ gst_matroska_mux_video_pad_setcaps (GstPad * pad, GstCaps * caps)
context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MJPEG);
return TRUE;
- } else if (!strcmp (mimetype, "video/x-divx")) {
- gint divxversion;
+ } else if (!strcmp (mimetype, "video/x-xvid") /* MS/VfW compatibility cases */
+ ||!strcmp (mimetype, "video/x-huffyuv")
+ || !strcmp (mimetype, "video/x-divx")
+ || !strcmp (mimetype, "video/x-dv")
+ || !strcmp (mimetype, "video/x-h263")) {
BITMAPINFOHEADER *bih;
+ const GValue *codec_data;
+ gint size = sizeof (BITMAPINFOHEADER);
- bih = (BITMAPINFOHEADER *) g_malloc0 (sizeof (BITMAPINFOHEADER));
- GST_WRITE_UINT32_LE (&bih->bi_size, sizeof (BITMAPINFOHEADER));
+ bih = g_new0 (BITMAPINFOHEADER, 1);
+ GST_WRITE_UINT32_LE (&bih->bi_size, size);
GST_WRITE_UINT32_LE (&bih->bi_width, videocontext->pixel_width);
GST_WRITE_UINT32_LE (&bih->bi_height, videocontext->pixel_height);
GST_WRITE_UINT16_LE (&bih->bi_planes, (guint16) 1);
@@ -497,40 +508,47 @@ gst_matroska_mux_video_pad_setcaps (GstPad * pad, GstCaps * caps)
GST_WRITE_UINT32_LE (&bih->bi_size_image, videocontext->pixel_width *
videocontext->pixel_height * 3);
- gst_structure_get_int (structure, "divxversion", &divxversion);
- switch (divxversion) {
- case 3:
- GST_WRITE_UINT32_LE (&bih->bi_compression, GST_STR_FOURCC ("DIV3"));
- break;
- case 4:
- GST_WRITE_UINT32_LE (&bih->bi_compression, GST_STR_FOURCC ("DIVX"));
- break;
- case 5:
- GST_WRITE_UINT32_LE (&bih->bi_compression, GST_STR_FOURCC ("DX50"));
- break;
+ if (!strcmp (mimetype, "video/x-xvid"))
+ GST_WRITE_UINT32_LE (&bih->bi_compression, GST_STR_FOURCC ("XVID"));
+ else if (!strcmp (mimetype, "video/x-huffyuv"))
+ GST_WRITE_UINT32_LE (&bih->bi_compression, GST_STR_FOURCC ("HFYU"));
+ else if (!strcmp (mimetype, "video/x-dv"))
+ GST_WRITE_UINT32_LE (&bih->bi_compression, GST_STR_FOURCC ("DVSD"));
+ else if (!strcmp (mimetype, "video/x-h263"))
+ GST_WRITE_UINT32_LE (&bih->bi_compression, GST_STR_FOURCC ("H263"));
+ else if (!strcmp (mimetype, "video/x-divx")) {
+ gint divxversion;
+
+ gst_structure_get_int (structure, "divxversion", &divxversion);
+ switch (divxversion) {
+ case 3:
+ GST_WRITE_UINT32_LE (&bih->bi_compression, GST_STR_FOURCC ("DIV3"));
+ break;
+ case 4:
+ GST_WRITE_UINT32_LE (&bih->bi_compression, GST_STR_FOURCC ("DIVX"));
+ break;
+ case 5:
+ GST_WRITE_UINT32_LE (&bih->bi_compression, GST_STR_FOURCC ("DX50"));
+ break;
+ }
}
- context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC);
- context->codec_priv = (gpointer) bih;
- context->codec_priv_size = sizeof (BITMAPINFOHEADER);
-
- return TRUE;
- } else if (!strcmp (mimetype, "video/x-xvid")) {
- BITMAPINFOHEADER *bih;
-
- bih = (BITMAPINFOHEADER *) g_malloc0 (sizeof (BITMAPINFOHEADER));
- GST_WRITE_UINT32_LE (&bih->bi_size, sizeof (BITMAPINFOHEADER));
- GST_WRITE_UINT32_LE (&bih->bi_width, videocontext->pixel_width);
- GST_WRITE_UINT32_LE (&bih->bi_height, videocontext->pixel_height);
- GST_WRITE_UINT16_LE (&bih->bi_planes, (guint16) 1);
- GST_WRITE_UINT16_LE (&bih->bi_bit_count, (guint16) 24);
- GST_WRITE_UINT32_LE (&bih->bi_compression, GST_STR_FOURCC ("XVID"));
- GST_WRITE_UINT32_LE (&bih->bi_size_image, videocontext->pixel_width *
- videocontext->pixel_height * 3);
+ /* process codec private/initialization data, if any */
+ codec_data = gst_structure_get_value (structure, "codec_data");
+ if (codec_data) {
+ GstBuffer *codec_data_buf;
+
+ codec_data_buf = g_value_peek_pointer (codec_data);
+ size += GST_BUFFER_SIZE (codec_data_buf);
+ bih = g_realloc (bih, size);
+ GST_WRITE_UINT32_LE (&bih->bi_size, size);
+ memcpy ((guint8 *) bih + sizeof (BITMAPINFOHEADER),
+ GST_BUFFER_DATA (codec_data_buf), GST_BUFFER_SIZE (codec_data_buf));
+ }
context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC);
context->codec_priv = (gpointer) bih;
- context->codec_priv_size = sizeof (BITMAPINFOHEADER);
+ context->codec_priv_size = size;
return TRUE;
} else if (!strcmp (mimetype, "video/x-h264")) {