mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 09:10:36 +00:00
add _get_size function with stride, fixes YUV conversions
Original commit message from CVS: add _get_size function with stride, fixes YUV conversions
This commit is contained in:
parent
a0221bacaf
commit
04bdbe5b8b
4 changed files with 76 additions and 21 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
|||
2004-07-27 Thomas Vander Stichele <thomas at apestaart dot org>
|
||||
|
||||
* gst/videoscale/README:
|
||||
add testing examples
|
||||
* gst/videoscale/gstvideoscale.c: (gst_videoscale_link),
|
||||
(gst_videoscale_chain):
|
||||
* gst/videoscale/videoscale.c: (gst_videoscale_setup),
|
||||
(gst_videoscale_get_size):
|
||||
add get_size function that handles stride like videotestsrc.
|
||||
fixes conversion for YUV formats for as much as I can test them.
|
||||
|
||||
2004-07-27 Thomas Vander Stichele <thomas at apestaart dot org>
|
||||
|
||||
* sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls),
|
||||
|
|
5
gst/videoscale/README
Normal file
5
gst/videoscale/README
Normal file
|
@ -0,0 +1,5 @@
|
|||
- test different strides using
|
||||
gst-launch -v videotestsrc ! video/x-raw-yuv,width=320,height=240,format=\(fourcc\)UYVY ! videoscale ! video/x-raw-yuv,width=328,height=240 ! xvimagesink
|
||||
gst-launch -v videotestsrc ! video/x-raw-yuv,width=320,height=240,format=\(fourcc\)UYVY ! videoscale ! video/x-raw-yuv,width=324,height=240 ! xvimagesink
|
||||
gst-launch -v videotestsrc ! video/x-raw-yuv,width=320,height=240,format=\(fourcc\)UYVY ! videoscale ! video/x-raw-yuv,width=322,height=240 ! xvimagesink
|
||||
gst-launch -v videotestsrc ! video/x-raw-yuv,width=320,height=240,format=\(fourcc\)UYVY ! videoscale ! video/x-raw-yuv,width=321,height=240 ! xvimagesink
|
|
@ -214,7 +214,7 @@ gst_videoscale_link (GstPad * pad, const GstCaps * caps)
|
|||
struct videoscale_format_struct *format;
|
||||
int height, width;
|
||||
|
||||
GST_DEBUG ("gst_videoscale_link %s\n", gst_caps_to_string (caps));
|
||||
GST_DEBUG_OBJECT (pad, "_link with caps %" GST_PTR_FORMAT, caps);
|
||||
videoscale = GST_VIDEOSCALE (gst_pad_get_parent (pad));
|
||||
|
||||
otherpad = (pad == videoscale->srcpad) ? videoscale->sinkpad :
|
||||
|
@ -366,18 +366,15 @@ gst_videoscale_chain (GstPad * pad, GstData * _data)
|
|||
size = GST_BUFFER_SIZE (buf);
|
||||
|
||||
if (videoscale->passthru) {
|
||||
GST_LOG_OBJECT (videoscale, "passing through buffer of %ld bytes in '%s'",
|
||||
size, GST_OBJECT_NAME (videoscale));
|
||||
GST_LOG_OBJECT (videoscale, "passing through buffer of %ld bytes", size);
|
||||
gst_pad_push (videoscale->srcpad, GST_DATA (buf));
|
||||
return;
|
||||
}
|
||||
|
||||
GST_LOG_OBJECT (videoscale, "got buffer of %ld bytes in '%s'", size,
|
||||
GST_OBJECT_NAME (videoscale));
|
||||
GST_LOG_OBJECT (videoscale,
|
||||
"size=%ld from=%dx%d to=%dx%d fromsize=%ld (should be %d) tosize=%d",
|
||||
"buffersize=%ld from=%dx%d to=%dx%d fromsize=%ld tosize=%ld",
|
||||
size, videoscale->from_width, videoscale->from_height,
|
||||
videoscale->to_width, videoscale->to_height, size,
|
||||
videoscale->to_width, videoscale->to_height,
|
||||
videoscale->from_buf_size, videoscale->to_buf_size);
|
||||
|
||||
g_return_if_fail (size == videoscale->from_buf_size);
|
||||
|
@ -394,8 +391,8 @@ gst_videoscale_chain (GstPad * pad, GstData * _data)
|
|||
|
||||
videoscale->format->scale (videoscale, GST_BUFFER_DATA (outbuf), data);
|
||||
|
||||
GST_LOG_OBJECT (videoscale, "pushing buffer of %d bytes in '%s'",
|
||||
GST_BUFFER_SIZE (outbuf), GST_OBJECT_NAME (videoscale));
|
||||
GST_LOG_OBJECT (videoscale, "pushing buffer of %d bytes",
|
||||
GST_BUFFER_SIZE (outbuf));
|
||||
|
||||
gst_pad_push (videoscale->srcpad, GST_DATA (outbuf));
|
||||
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include "videoscale_x86.h"
|
||||
#endif
|
||||
|
||||
#define ROUND_UP_2(x) (((x) + 1) & ~1)
|
||||
#define ROUND_UP_4(x) (((x) + 3) & ~3)
|
||||
#define ROUND_UP_8(x) (((x) + 7) & ~7)
|
||||
|
||||
|
@ -50,6 +51,9 @@ static unsigned char gst_videoscale_bilinear (unsigned char *src, double x,
|
|||
static unsigned char gst_videoscale_bicubic (unsigned char *src, double x,
|
||||
double y, int sw, int sh);
|
||||
#endif
|
||||
static int
|
||||
gst_videoscale_get_size (struct videoscale_format_struct *format, int width,
|
||||
int height);
|
||||
|
||||
static void gst_videoscale_planar411 (GstVideoscale * scale,
|
||||
unsigned char *dest, unsigned char *src);
|
||||
|
@ -211,7 +215,6 @@ gst_videoscale_setup (GstVideoscale * videoscale)
|
|||
{
|
||||
g_return_if_fail (GST_IS_VIDEOSCALE (videoscale));
|
||||
g_return_if_fail (videoscale->format != NULL);
|
||||
gint from_stride, to_stride;
|
||||
|
||||
GST_DEBUG_OBJECT (videoscale, "format=%p " GST_FOURCC_FORMAT
|
||||
" from %dx%d to %dx%d, %d bpp",
|
||||
|
@ -238,17 +241,10 @@ gst_videoscale_setup (GstVideoscale * videoscale)
|
|||
|
||||
GST_DEBUG_OBJECT (videoscale, "scaling method POINT_SAMPLE");
|
||||
|
||||
/* FIXME: we should get from and to strides from caps. For now we conform
|
||||
* to videotestsrc's idea of it, which is to round w * bytespp to nearest
|
||||
* multiple of 4 */
|
||||
from_stride = ROUND_UP_4 ((videoscale->from_width *
|
||||
ROUND_UP_4 (videoscale->format->bpp)) / 8);
|
||||
to_stride = ROUND_UP_4 ((videoscale->to_width *
|
||||
ROUND_UP_4 (videoscale->format->bpp)) / 8);
|
||||
GST_DEBUG_OBJECT (videoscale, "from_stride %d to_stride %d",
|
||||
from_stride, to_stride);
|
||||
videoscale->from_buf_size = from_stride * videoscale->from_height;
|
||||
videoscale->to_buf_size = to_stride * videoscale->to_height;
|
||||
videoscale->from_buf_size = gst_videoscale_get_size (videoscale->format,
|
||||
videoscale->from_width, videoscale->from_height);
|
||||
videoscale->to_buf_size = gst_videoscale_get_size (videoscale->format,
|
||||
videoscale->to_width, videoscale->to_height);
|
||||
|
||||
videoscale->passthru = FALSE;
|
||||
videoscale->inited = TRUE;
|
||||
|
@ -283,6 +279,52 @@ gst_videoscale_scale_rgb (GstVideoscale * scale, unsigned char *dest,
|
|||
//scale->scaler(scale, src, dest, sw, sh, dw, dh);
|
||||
}
|
||||
#endif
|
||||
/* calculate the total size needed for an image in the given format
|
||||
* of the given width and height, taking stride into account */
|
||||
static int
|
||||
gst_videoscale_get_size (struct videoscale_format_struct *format, int width,
|
||||
int height)
|
||||
{
|
||||
int stride = 0;
|
||||
int ustride = 0, vstride = 0;
|
||||
int size = 0;
|
||||
|
||||
/* FIXME: we should get from and to strides from caps. For now we conform
|
||||
* to videotestsrc's idea of it, which is to round w * bytespp to nearest
|
||||
* multiple of 4 */
|
||||
|
||||
switch (format->fourcc) {
|
||||
case fourcc_RGB_:
|
||||
stride = ROUND_UP_4 (width * ROUND_UP_4 (format->bpp)) / 8;
|
||||
size = stride * height;
|
||||
break;
|
||||
case fourcc_YUY2:
|
||||
case fourcc_UYVY:
|
||||
case fourcc_YVYU:
|
||||
stride = ROUND_UP_2 (width) * 2;
|
||||
size = stride * height;
|
||||
break;
|
||||
case fourcc_I420:
|
||||
case fourcc_YV12:
|
||||
stride = ROUND_UP_4 (width);
|
||||
ustride = ROUND_UP_8 (width) / 2;
|
||||
vstride = ROUND_UP_8 (stride) / 2;
|
||||
size = stride * ROUND_UP_2 (height) + ustride * ROUND_UP_2 (height) / 2 +
|
||||
vstride * ROUND_UP_2 (height) / 2;
|
||||
break;
|
||||
case fourcc_Y422:
|
||||
case fourcc_UYNV:
|
||||
case fourcc_Y800:
|
||||
g_warning ("unhandled known YUV fourcc");
|
||||
break;
|
||||
default:
|
||||
g_warning ("unhandled unknown fourcc");
|
||||
break;
|
||||
}
|
||||
GST_LOG ("image size for %dx%d in " GST_FOURCC_FORMAT " is %d bytes",
|
||||
width, height, GST_FOURCC_ARGS (format->fourcc), size);
|
||||
return size;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_videoscale_planar411 (GstVideoscale * scale, unsigned char *dest,
|
||||
|
|
Loading…
Reference in a new issue