interlace: Add more formats

This commit is contained in:
David Schleef 2010-09-05 21:34:30 -07:00
parent 3168bd0a22
commit 5db2beeb49

View file

@ -79,7 +79,8 @@ static GstStaticPadTemplate gst_interlace_src_template =
GST_STATIC_PAD_TEMPLATE ("src", GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC, GST_PAD_SRC,
GST_PAD_ALWAYS, GST_PAD_ALWAYS,
GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{YUY2,UYVY,I420,YV12}") GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV
("{AYUV,YUY2,UYVY,I420,YV12,Y42B,Y444,NV12,NV21}")
",interlaced=TRUE") ",interlaced=TRUE")
); );
@ -87,7 +88,8 @@ static GstStaticPadTemplate gst_interlace_sink_template =
GST_STATIC_PAD_TEMPLATE ("sink", GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK, GST_PAD_SINK,
GST_PAD_ALWAYS, GST_PAD_ALWAYS,
GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{YUY2,UYVY,I420,YV12}") GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV
("{AYUV,YUY2,UYVY,I420,YV12,Y42B,Y444,NV12,NV21}")
",interlaced=FALSE") ",interlaced=FALSE")
); );
@ -318,13 +320,74 @@ copy_field (GstInterlace * interlace, GstBuffer * d, GstBuffer * s,
j * width / 2; j * width / 2;
memcpy (dest, src, width / 2); memcpy (dest, src, width / 2);
} }
} else { } else if (interlace->format == GST_VIDEO_FORMAT_UYVY ||
interlace->format == GST_VIDEO_FORMAT_YUY2) {
/* packed 4:2:2 */ /* packed 4:2:2 */
for (j = field_index; j < height; j += 2) { for (j = field_index; j < height; j += 2) {
dest = GST_BUFFER_DATA (d) + j * width * 2; dest = GST_BUFFER_DATA (d) + j * width * 2;
src = GST_BUFFER_DATA (s) + j * width * 2; src = GST_BUFFER_DATA (s) + j * width * 2;
memcpy (dest, src, width * 2); memcpy (dest, src, width * 2);
} }
} else if (interlace->format == GST_VIDEO_FORMAT_AYUV) {
/* packed 4:4:4 */
for (j = field_index; j < height; j += 2) {
dest = GST_BUFFER_DATA (d) + j * width * 4;
src = GST_BUFFER_DATA (s) + j * width * 4;
memcpy (dest, src, width * 4);
}
} else if (interlace->format == GST_VIDEO_FORMAT_Y42B) {
/* planar 4:2:2 */
for (j = field_index; j < height; j += 2) {
dest = GST_BUFFER_DATA (d) + j * width;
src = GST_BUFFER_DATA (s) + j * width;
memcpy (dest, src, width);
}
for (j = field_index; j < height; j += 2) {
dest = GST_BUFFER_DATA (d) + width * height + j * width / 2;
src = GST_BUFFER_DATA (s) + width * height + j * width / 2;
memcpy (dest, src, width / 2);
}
for (j = field_index; j < height; j += 2) {
dest =
GST_BUFFER_DATA (d) + width * height + width / 2 * height +
j * width / 2;
src =
GST_BUFFER_DATA (s) + width * height + width / 2 * height +
j * width / 2;
memcpy (dest, src, width / 2);
}
} else if (interlace->format == GST_VIDEO_FORMAT_Y444) {
/* planar 4:4:4 */
for (j = field_index; j < height; j += 2) {
dest = GST_BUFFER_DATA (d) + j * width;
src = GST_BUFFER_DATA (s) + j * width;
memcpy (dest, src, width);
}
for (j = field_index; j < height; j += 2) {
dest = GST_BUFFER_DATA (d) + width * height + j * width;
src = GST_BUFFER_DATA (s) + width * height + j * width;
memcpy (dest, src, width);
}
for (j = field_index; j < height; j += 2) {
dest = GST_BUFFER_DATA (d) + width * height + width * height + j * width;
src = GST_BUFFER_DATA (s) + width * height + width * height + j * width;
memcpy (dest, src, width);
}
} else if (interlace->format == GST_VIDEO_FORMAT_NV12 ||
interlace->format == GST_VIDEO_FORMAT_NV21) {
/* planar/packed 4:2:0 */
for (j = field_index; j < height; j += 2) {
dest = GST_BUFFER_DATA (d) + j * width;
src = GST_BUFFER_DATA (s) + j * width;
memcpy (dest, src, width);
}
for (j = field_index; j < height / 2; j += 2) {
dest = GST_BUFFER_DATA (d) + width * height + j * width;
src = GST_BUFFER_DATA (s) + width * height + j * width;
memcpy (dest, src, width);
}
} else {
g_assert_not_reached ();
} }
} }
@ -350,7 +413,7 @@ gst_interlace_chain (GstPad * pad, GstBuffer * buffer)
""); "");
if (GST_BUFFER_FLAGS (buffer) & GST_BUFFER_FLAG_DISCONT) { if (GST_BUFFER_FLAGS (buffer) & GST_BUFFER_FLAG_DISCONT) {
GST_ERROR ("discont"); GST_DEBUG ("discont");
} }