mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 01:00:37 +00:00
videoscale: Fix interlaced scaling for I420
...and some other minor mistakes in the previous change.
This commit is contained in:
parent
164b90f9d0
commit
c51d2febd3
1 changed files with 23 additions and 17 deletions
|
@ -709,25 +709,28 @@ gst_video_scale_prepare_image (gint format, GstBuffer * buf,
|
|||
{
|
||||
gboolean res = TRUE;
|
||||
|
||||
img->pixels = GST_BUFFER_DATA (buf);
|
||||
|
||||
switch (format) {
|
||||
case GST_VIDEO_SCALE_I420:
|
||||
case GST_VIDEO_SCALE_YV12:
|
||||
img_u->pixels = img->pixels + GST_ROUND_UP_2 (img->height) * img->stride;
|
||||
img_u->pixels =
|
||||
GST_BUFFER_DATA (buf) + GST_ROUND_UP_2 (img->height) * img->stride;
|
||||
img_u->height = GST_ROUND_UP_2 (img->height) / 2;
|
||||
if (interlaced) {
|
||||
img_u->height = (img_u->height / 2) + ((step == 0
|
||||
&& img_u->height % 2 == 1) ? 1 : 0);
|
||||
img_u->stride *= 2;
|
||||
}
|
||||
img_u->width = GST_ROUND_UP_2 (img->width) / 2;
|
||||
img_u->stride = GST_ROUND_UP_4 (img_u->width);
|
||||
if (interlaced) {
|
||||
}
|
||||
memcpy (img_v, img_u, sizeof (*img_v));
|
||||
img_v->pixels = img_u->pixels + img_u->height * img_u->stride;
|
||||
if (interlaced && step == 1) {
|
||||
img_v->pixels += (img_v->stride / 2);
|
||||
img_u->pixels += (img_u->stride / 2);
|
||||
img_v->pixels += img_v->stride;
|
||||
img_u->pixels += img_u->stride;
|
||||
|
||||
img_u->height = (img_u->height / 2) + ((step == 0
|
||||
&& img_u->height % 2 == 1) ? 1 : 0);
|
||||
img_u->stride *= 2;
|
||||
img_v->height = (img_v->height / 2) + ((step == 0
|
||||
&& img_v->height % 2 == 1) ? 1 : 0);
|
||||
img_v->stride *= 2;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -756,23 +759,26 @@ gst_video_scale_transform (GstBaseTransform * trans, GstBuffer * in,
|
|||
method = videoscale->method;
|
||||
GST_OBJECT_UNLOCK (videoscale);
|
||||
|
||||
if (src.height < 4 && method == GST_VIDEO_SCALE_4TAP)
|
||||
method = GST_VIDEO_SCALE_BILINEAR;
|
||||
src.pixels = GST_BUFFER_DATA (in);
|
||||
dest.pixels = GST_BUFFER_DATA (out);
|
||||
|
||||
/* For interlaced content we have to run two times with half height
|
||||
* and doubled stride */
|
||||
if (videoscale->interlaced) {
|
||||
if (interlaced) {
|
||||
dest.height /= 2;
|
||||
src.height /= 2;
|
||||
dest.stride *= 2;
|
||||
src.stride *= 2;
|
||||
}
|
||||
|
||||
if (src.height < 4 && method == GST_VIDEO_SCALE_4TAP)
|
||||
method = GST_VIDEO_SCALE_BILINEAR;
|
||||
|
||||
for (step = 0; step < (interlaced ? 2 : 1); step++) {
|
||||
gst_video_scale_prepare_image (videoscale->format, in, &src, &src_u, &src_v,
|
||||
step, interlaced);
|
||||
gst_video_scale_prepare_image (videoscale->format, out, &dest, &dest_u,
|
||||
&dest_v, step, interlaced);
|
||||
gst_video_scale_prepare_image (videoscale->format, in, &videoscale->src,
|
||||
&src_u, &src_v, step, interlaced);
|
||||
gst_video_scale_prepare_image (videoscale->format, out, &videoscale->dest,
|
||||
&dest_u, &dest_v, step, interlaced);
|
||||
|
||||
if (step == 0 && interlaced) {
|
||||
if (videoscale->from_height % 2 == 1) {
|
||||
|
|
Loading…
Reference in a new issue