--- a/gst/videoconvert/gstvideoconvertorc.orc
+++ b/gst/videoconvert/gstvideoconvertorc.orc
@@ -150,6 +150,14 @@ avgub d, t1, t2
 avgub d, s1, s2
 
 
+.function video_convert_orc_merge_uv
+.flags 2d
+.dest 2 d guint8
+.source 1 s1 guint8
+.source 1 s2 guint8
+
+mergebw d, s1, s2
+
 .function video_convert_orc_convert_YUY2_AYUV
 .flags 2d
 .dest 8 ayuv guint8
--- a/gst/videoconvert/videoconvert.c
+++ b/gst/videoconvert/videoconvert.c
@@ -494,6 +494,23 @@ convert_I420_YUY2 (VideoConvert * convert, GstVideoFrame * dest,
 }
 
 static void
+convert_I420_NV12 (VideoConvert * convert, GstVideoFrame * dest,
+    const GstVideoFrame * src)
+{
+  gint width = convert->width;
+  gint height = convert->height;
+
+  video_convert_orc_memcpy_2d (FRAME_GET_Y_LINE (dest, 0),
+      FRAME_GET_Y_STRIDE (dest), FRAME_GET_Y_LINE (src, 0),
+      FRAME_GET_Y_STRIDE (src), width, height);
+
+  video_convert_orc_merge_uv (FRAME_GET_U_LINE (dest, 0),
+      FRAME_GET_U_STRIDE (dest), FRAME_GET_U_LINE (src, 0),
+      FRAME_GET_U_STRIDE (src), FRAME_GET_V_LINE (src, 0),
+      FRAME_GET_V_STRIDE (src), (width + 1) / 2, (height + 1) / 2);
+}
+
+static void
 convert_I420_UYVY (VideoConvert * convert, GstVideoFrame * dest,
     const GstVideoFrame * src)
 {
@@ -1112,6 +1129,8 @@ static const VideoTransform transforms[] = {
       GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, convert_I420_Y42B},
   {GST_VIDEO_FORMAT_I420, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_Y444,
       GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, convert_I420_Y444},
+  {GST_VIDEO_FORMAT_I420, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_NV12,
+      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, convert_I420_NV12},
 
   {GST_VIDEO_FORMAT_YUY2, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_I420,
       GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, convert_YUY2_I420},
