x264enc: Add support for 10-bit color formats
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Thu, 15 Nov 2012 15:42:09 +0000 (16:42 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Thu, 15 Nov 2012 15:42:09 +0000 (16:42 +0100)
Requires x264 to be built with 10-bit support, which disables
9-bit support. Also only advertise the color formats that were
compiled into x264.

ext/x264/gstx264enc.c

index 6924caa7b5e2d91fe63992742c7efa51d3cea9b1..f657d84067a73d825195780491e4f59a26565bf6 100644 (file)
@@ -389,11 +389,53 @@ gst_x264_enc_build_tunings_string (GstX264Enc * x264enc)
         x264enc->tunings->str);
 }
 
+#if X264_BIT_DEPTH == 8
+# if X264_CHROMA_FORMAT == 0
+#  define COLOR_FORMATS "I420, YV12, Y42B, Y444, NV12"
+# elif X264_CHROMA_FORMAT == X264_CSP_I420
+#  define COLOR_FORMATS "I420, YV12, NV12"
+# elif X264_CHROMA_FORMAT == X264_CSP_I422
+#  define COLOR_FORMATS "Y42B"
+# elif X264_CHROMA_FORMAT == X264_CSP_I444
+#  define COLOR_FORMATS "Y444"
+# else
+#  error "Unsupported chroma format"
+# endif
+#elif X264_BIT_DEPTH == 10
+# if G_BYTE_ORDER == G_LITTLE_ENDIAN
+#  if X264_CHROMA_FORMAT == 0
+#   define COLOR_FORMATS "I420_10LE, I422_10LE, Y444_10LE"
+#  elif X264_CHROMA_FORMAT == X264_CSP_I420
+#   define COLOR_FORMATS "I420_10LE"
+#  elif X264_CHROMA_FORMAT == X264_CSP_I422
+#   define COLOR_FORMATS "I422_10LE"
+#  elif X264_CHROMA_FORMAT == X264_CSP_I444
+#   define COLOR_FORMATS "Y444_10LE"
+#  else
+#   error "Unsupported chroma format"
+#  endif
+# else
+#  if X264_CHROMA_FORMAT == 0
+#   define COLOR_FORMATS "I420_10BE, I422_10BE, Y444_10BE"
+#  elif X264_CHROMA_FORMAT == X264_CSP_I420
+#   define COLOR_FORMATS "I420_10BE"
+#  elif X264_CHROMA_FORMAT == X264_CSP_I422
+#   define COLOR_FORMATS "I422_10BE"
+#  elif X264_CHROMA_FORMAT == X264_CSP_I444
+#   define COLOR_FORMATS "Y444_10BE"
+#  else
+#   error "Unsupported chroma format"
+#  endif
+# endif
+#else
+# error "Only 8-bit and 10-bit supported"
+#endif
+
 static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
     GST_PAD_SINK,
     GST_PAD_ALWAYS,
     GST_STATIC_CAPS ("video/x-raw, "
-        "format = (string) { I420, YV12, Y42B, Y444, NV12 }, "
+        "format = (string) { " COLOR_FORMATS " }, "
         "framerate = (fraction) [0, MAX], "
         "width = (int) [ 16, MAX ], " "height = (int) [ 16, MAX ]")
     );
@@ -984,16 +1026,34 @@ gst_x264_enc_gst_to_x264_video_format (GstVideoFormat format, gint * nplanes)
         *nplanes = 3;
       return X264_CSP_I420;
       break;
+    case GST_VIDEO_FORMAT_I420_10BE:
+    case GST_VIDEO_FORMAT_I420_10LE:
+      if (nplanes)
+        *nplanes = 3;
+      return X264_CSP_I420 | X264_CSP_HIGH_DEPTH;
+      break;
     case GST_VIDEO_FORMAT_Y42B:
       if (nplanes)
         *nplanes = 3;
       return X264_CSP_I422;
       break;
+    case GST_VIDEO_FORMAT_I422_10BE:
+    case GST_VIDEO_FORMAT_I422_10LE:
+      if (nplanes)
+        *nplanes = 3;
+      return X264_CSP_I422 | X264_CSP_HIGH_DEPTH;
+      break;
     case GST_VIDEO_FORMAT_Y444:
       if (nplanes)
         *nplanes = 3;
       return X264_CSP_I444;
       break;
+    case GST_VIDEO_FORMAT_Y444_10BE:
+    case GST_VIDEO_FORMAT_Y444_10LE:
+      if (nplanes)
+        *nplanes = 3;
+      return X264_CSP_I444 | X264_CSP_HIGH_DEPTH;
+      break;
     case GST_VIDEO_FORMAT_NV12:
       if (nplanes)
         *nplanes = 2;