From bcb74c4d07cec192cbae007f463ba6bc80cca342 Mon Sep 17 00:00:00 2001 From: "Matthew.Spencer@eu.sony.com" Date: Wed, 31 Mar 2004 06:31:47 +0000 Subject: [PATCH] ext/mpeg2dec/gstmpeg2dec.c: Handle Y42B-format MPEG video, patch from Matthew.Spencer@eu.sony.com (Matthew Spencer) (... Original commit message from CVS: * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_alloc_buffer), (gst_mpeg2dec_negotiate_format): Handle Y42B-format MPEG video, patch from Matthew.Spencer@eu.sony.com (Matthew Spencer) (bug #137504) * ext/mpeg2dec/gstmpeg2dec.h: --- ChangeLog | 8 +++++++ ext/mpeg2dec/gstmpeg2dec.c | 53 ++++++++++++++++++++++++++++++++++++---------- ext/mpeg2dec/gstmpeg2dec.h | 5 +++-- 3 files changed, 53 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index d367d05..8fa511f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2004-03-30 David Schleef + * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_alloc_buffer), + (gst_mpeg2dec_negotiate_format): Handle Y42B-format MPEG + video, patch from Matthew.Spencer@eu.sony.com (Matthew Spencer) + (bug #137504) + * ext/mpeg2dec/gstmpeg2dec.h: + +2004-03-30 David Schleef + * ext/gdk_pixbuf/Makefile.am: Remove spurious rules. (bug #136527) 2004-03-30 David Schleef diff --git a/ext/mpeg2dec/gstmpeg2dec.c b/ext/mpeg2dec/gstmpeg2dec.c index d3f0dc3..baa60fd 100644 --- a/ext/mpeg2dec/gstmpeg2dec.c +++ b/ext/mpeg2dec/gstmpeg2dec.c @@ -67,7 +67,7 @@ GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-raw-yuv, " - "format = (fourcc) { YV12, I420 }, " + "format = (fourcc) { YV12, I420, Y42B }, " "width = (int) [ 16, 4096 ], " "height = (int) [ 16, 4096 ], " "pixel_width = (int) [ 1, 255 ], " @@ -291,17 +291,30 @@ gst_mpeg2dec_alloc_buffer (GstMpeg2dec * mpeg2dec, const mpeg2_info_t * info, guint8 *buf[3], *out; const mpeg2_picture_t *picture; - outbuf = gst_buffer_new_and_alloc ((size * 3) / 2); + if (mpeg2dec->format == MPEG2DEC_FORMAT_I422) { + outbuf = gst_buffer_new_and_alloc (size * 2); - out = GST_BUFFER_DATA (outbuf); + out = GST_BUFFER_DATA (outbuf); - buf[0] = out; - if (mpeg2dec->format == MPEG2DEC_FORMAT_I420) { + buf[0] = out; buf[1] = buf[0] + size; - buf[2] = buf[1] + size / 4; + buf[2] = buf[1] + size / 2; + } else { - buf[2] = buf[0] + size; - buf[1] = buf[2] + size / 4; + outbuf = gst_buffer_new_and_alloc ((size * 3) / 2); + + out = GST_BUFFER_DATA (outbuf); + + buf[0] = out; + if (mpeg2dec->format == MPEG2DEC_FORMAT_I420) { + buf[0] = out; + buf[1] = buf[0] + size; + buf[2] = buf[1] + size / 4; + } else { + buf[0] = out; + buf[2] = buf[0] + size; + buf[1] = buf[2] + size / 4; + } } gst_buffer_ref (outbuf); @@ -326,16 +339,32 @@ static gboolean gst_mpeg2dec_negotiate_format (GstMpeg2dec * mpeg2dec) { GstCaps *caps; - guint32 fourcc; + guint32 fourcc, myFourcc; gboolean ret; + const mpeg2_info_t *info; + const mpeg2_sequence_t *sequence; if (!GST_PAD_IS_LINKED (mpeg2dec->srcpad)) { mpeg2dec->format = MPEG2DEC_FORMAT_I420; return TRUE; } + info = mpeg2_info (mpeg2dec->decoder); + sequence = info->sequence; + + if (sequence->width != sequence->chroma_width && + sequence->height != sequence->chroma_height) + myFourcc = GST_STR_FOURCC ("I420"); + else if (sequence->width == sequence->chroma_width || + sequence->height == sequence->chroma_height) + myFourcc = GST_STR_FOURCC ("Y42B"); + else { + g_warning ("mpeg2dec: 4:4:4 format not yet supported"); + return (FALSE); + } + caps = gst_caps_new_simple ("video/x-raw-yuv", - "format", GST_TYPE_FOURCC, GST_STR_FOURCC ("I420"), + "format", GST_TYPE_FOURCC, myFourcc, "width", G_TYPE_INT, mpeg2dec->width, "height", G_TYPE_INT, mpeg2dec->height, "pixel_width", G_TYPE_INT, mpeg2dec->pixel_width, @@ -351,7 +380,9 @@ gst_mpeg2dec_negotiate_format (GstMpeg2dec * mpeg2dec) gst_structure_get_fourcc (gst_caps_get_structure (caps, 0), "format", &fourcc); - if (fourcc == GST_STR_FOURCC ("I420")) { + if (fourcc == GST_STR_FOURCC ("Y42B")) { + mpeg2dec->format = MPEG2DEC_FORMAT_I422; + } else if (fourcc == GST_STR_FOURCC ("I420")) { mpeg2dec->format = MPEG2DEC_FORMAT_I420; } else { mpeg2dec->format = MPEG2DEC_FORMAT_YV12; diff --git a/ext/mpeg2dec/gstmpeg2dec.h b/ext/mpeg2dec/gstmpeg2dec.h index f72cd24..ab9ff55 100644 --- a/ext/mpeg2dec/gstmpeg2dec.h +++ b/ext/mpeg2dec/gstmpeg2dec.h @@ -47,15 +47,16 @@ typedef struct _GstMpeg2decClass GstMpeg2decClass; typedef enum { MPEG2DEC_FORMAT_NONE, + MPEG2DEC_FORMAT_I422, MPEG2DEC_FORMAT_I420, - MPEG2DEC_FORMAT_YV12, + MPEG2DEC_FORMAT_YV12 } Mpeg2decFormat; typedef enum { MPEG2DEC_DISC_NONE = 0, MPEG2DEC_DISC_NEW_PICTURE, - MPEG2DEC_DISC_NEW_KEYFRAME, + MPEG2DEC_DISC_NEW_KEYFRAME } DiscontState; struct _GstMpeg2dec { -- 2.7.4