dnl *** schroedinger ***
translit(dnm, m, l) AM_CONDITIONAL(USE_SCHRO, true)
AG_GST_CHECK_FEATURE(SCHRO, [Schroedinger video codec], schro, [
- AG_GST_PKG_CHECK_MODULES(SCHRO, schroedinger-1.0 >= 1.0.7)
+ AG_GST_PKG_CHECK_MODULES(SCHRO, schroedinger-1.0 >= 1.0.10)
])
dnl *** zbar ***
GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
- GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{ I420, YUY2, AYUV }"))
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV (GST_SCHRO_YUV_LIST))
);
GST_BOILERPLATE (GstSchroDec, gst_schro_dec, GstBaseVideoDecoder,
ret = schro_parse_decode_sequence_header (data + 13, size - 13,
&video_format);
if (ret) {
- if (video_format.chroma_format == SCHRO_CHROMA_444) {
- state->format = GST_VIDEO_FORMAT_AYUV;
- } else if (video_format.chroma_format == SCHRO_CHROMA_422) {
- state->format = GST_VIDEO_FORMAT_YUY2;
- } else if (video_format.chroma_format == SCHRO_CHROMA_420) {
- state->format = GST_VIDEO_FORMAT_I420;
+ int bit_depth;
+
+ bit_depth = schro_video_format_get_bit_depth (&video_format);
+
+ if (bit_depth == 8) {
+ if (video_format.chroma_format == SCHRO_CHROMA_444) {
+ state->format = GST_VIDEO_FORMAT_AYUV;
+ } else if (video_format.chroma_format == SCHRO_CHROMA_422) {
+ state->format = GST_VIDEO_FORMAT_UYVY;
+ } else if (video_format.chroma_format == SCHRO_CHROMA_420) {
+ state->format = GST_VIDEO_FORMAT_I420;
+ }
+ } else if (bit_depth <= 10) {
+ state->format = GST_VIDEO_FORMAT_v210;
+ } else if (bit_depth <= 16) {
+ state->format = GST_VIDEO_FORMAT_AYUV64;
+ } else {
+ GST_ERROR ("bit depth too large (%d > 16)", bit_depth);
+ state->format = GST_VIDEO_FORMAT_AYUV64;
}
state->fps_n = video_format.frame_rate_numerator;
state->fps_d = video_format.frame_rate_denominator;
GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
- GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{ I420, YV12, YUY2, UYVY, AYUV }"))
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV (GST_SCHRO_YUV_LIST))
);
static GstStaticPadTemplate gst_schro_enc_src_template =
switch (state->format) {
case GST_VIDEO_FORMAT_I420:
case GST_VIDEO_FORMAT_YV12:
+ case GST_VIDEO_FORMAT_Y42B:
schro_enc->video_format->chroma_format = SCHRO_CHROMA_420;
break;
case GST_VIDEO_FORMAT_YUY2:
case GST_VIDEO_FORMAT_UYVY:
+ case GST_VIDEO_FORMAT_v216:
+ case GST_VIDEO_FORMAT_v210:
schro_enc->video_format->chroma_format = SCHRO_CHROMA_422;
break;
case GST_VIDEO_FORMAT_AYUV:
+ case GST_VIDEO_FORMAT_Y444:
+ case GST_VIDEO_FORMAT_AYUV64:
schro_enc->video_format->chroma_format = SCHRO_CHROMA_444;
break;
case GST_VIDEO_FORMAT_ARGB:
schro_enc->video_format->aspect_ratio_numerator = state->par_n;
schro_enc->video_format->aspect_ratio_denominator = state->par_d;
- schro_video_format_set_std_signal_range (schro_enc->video_format,
- SCHRO_SIGNAL_RANGE_8BIT_VIDEO);
+ switch (state->format) {
+ default:
+ schro_video_format_set_std_signal_range (schro_enc->video_format,
+ SCHRO_SIGNAL_RANGE_8BIT_VIDEO);
+ break;
+ case GST_VIDEO_FORMAT_v210:
+ schro_video_format_set_std_signal_range (schro_enc->video_format,
+ SCHRO_SIGNAL_RANGE_10BIT_VIDEO);
+ break;
+ case GST_VIDEO_FORMAT_v216:
+ case GST_VIDEO_FORMAT_AYUV64:
+ schro_enc->video_format->luma_offset = 64 << 8;
+ schro_enc->video_format->luma_excursion = 219 << 8;
+ schro_enc->video_format->chroma_offset = 128 << 8;
+ schro_enc->video_format->chroma_excursion = 224 << 8;
+ break;
+ }
+
schro_video_format_set_std_colour_spec (schro_enc->video_format,
SCHRO_COLOUR_SPEC_HDTV);
frame =
schro_frame_new_from_data_AYUV (GST_BUFFER_DATA (buf), width, height);
break;
+ case GST_VIDEO_FORMAT_Y42B:
+ frame =
+ schro_frame_new_from_data_Y42B (GST_BUFFER_DATA (buf), width, height);
+ break;
+ case GST_VIDEO_FORMAT_Y444:
+ frame =
+ schro_frame_new_from_data_Y444 (GST_BUFFER_DATA (buf), width, height);
+ break;
+ case GST_VIDEO_FORMAT_v210:
+ frame =
+ schro_frame_new_from_data_v210 (GST_BUFFER_DATA (buf), width, height);
+ break;
+ case GST_VIDEO_FORMAT_v216:
+ frame =
+ schro_frame_new_from_data_v216 (GST_BUFFER_DATA (buf), width, height);
+ break;
+#ifdef SCHRO_FRAME_FORMAT_AY64
+ /* Added in 1.0.11 */
+ case GST_VIDEO_FORMAT_AYUV64:
+ frame =
+ schro_frame_new_from_data_AY64 (GST_BUFFER_DATA (buf), width, height);
+ break;
+#endif
#if 0
case GST_VIDEO_FORMAT_ARGB:
{
#include <gst/video/video.h>
#include <schroedinger/schro.h>
+#ifdef SCHRO_FRAME_FORMAT_AY64
+#define GST_SCHRO_YUV_LIST "{ I420, YV12, YUY2, UYVY, AYUV, Y42B, Y444, v216, v210, AY64 }"
+#else
+#define GST_SCHRO_YUV_LIST "{ I420, YV12, YUY2, UYVY, AYUV, Y42B, Y444 }"
+#endif
+
SchroFrame *
gst_schro_buffer_wrap (GstBuffer *buf, GstVideoFormat format, int width,
int height);