diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2016-02-28 10:12:01 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2016-02-28 11:10:39 +0200 |
commit | 476d5b6940e275a1dbc536aa66ba102534a77d18 (patch) | |
tree | 0bc0295cf0394aa74c60948e3f1de5803de2f41e /sys | |
parent | c65b0e3a574d59766b172950eec8ed5edd297a6a (diff) | |
download | gstreamer-plugins-bad-476d5b6940e275a1dbc536aa66ba102534a77d18.tar.gz |
amcvideodec: When outputting on a surface, accept all color formats
We don't have to understand them, we handle them as a GL texture.
https://bugzilla.gnome.org/show_bug.cgi?id=762792
Diffstat (limited to 'sys')
-rw-r--r-- | sys/androidmedia/gstamcvideodec.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/sys/androidmedia/gstamcvideodec.c b/sys/androidmedia/gstamcvideodec.c index f024b4cf1..395fd28dc 100644 --- a/sys/androidmedia/gstamcvideodec.c +++ b/sys/androidmedia/gstamcvideodec.c @@ -805,12 +805,12 @@ gst_amc_video_dec_set_src_caps (GstAmcVideoDec * self, GstAmcFormat * format) return FALSE; } - gst_format = - gst_amc_color_format_to_video_format (klass->codec_info, mime, - color_format); - if (self->codec_config == AMC_CODEC_CONFIG_WITH_SURFACE) { gst_format = GST_VIDEO_FORMAT_RGBA; + } else { + gst_format = + gst_amc_color_format_to_video_format (klass->codec_info, mime, + color_format); } if (gst_format == GST_VIDEO_FORMAT_UNKNOWN) { @@ -827,6 +827,7 @@ gst_amc_video_dec_set_src_caps (GstAmcVideoDec * self, GstAmcFormat * format) GST_VIDEO_MULTIVIEW_MODE_TOP_BOTTOM, GST_VIDEO_MULTIVIEW_FLAGS_NONE); } + memset (&self->color_format_info, 0, sizeof (self->color_format_info)); if (self->codec_config == AMC_CODEC_CONFIG_WITH_SURFACE) { if (output_state->caps) gst_caps_unref (output_state->caps); @@ -835,6 +836,21 @@ gst_amc_video_dec_set_src_caps (GstAmcVideoDec * self, GstAmcFormat * format) gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, NULL)); gst_caps_set_simple (output_state->caps, "texture-target", G_TYPE_STRING, "external-oes", NULL); + GST_DEBUG_OBJECT (self, "Configuring for Surface output"); + + /* The width/height values are used in other places for + * checking if the resolution changed. Set everything + * that makes sense here + */ + self->color_format_info.color_format = COLOR_FormatAndroidOpaque; + self->color_format_info.width = width; + self->color_format_info.height = height; + self->color_format_info.crop_left = crop_left; + self->color_format_info.crop_right = crop_right; + self->color_format_info.crop_top = crop_top; + self->color_format_info.crop_bottom = crop_bottom; + + goto out; } self->format = gst_format; @@ -858,6 +874,7 @@ gst_amc_video_dec_set_src_caps (GstAmcVideoDec * self, GstAmcFormat * format) self->color_format_info.crop_top, self->color_format_info.crop_right, self->color_format_info.crop_bottom, self->color_format_info.frame_size); +out: ret = gst_video_decoder_negotiate (GST_VIDEO_DECODER (self)); gst_video_codec_state_unref (output_state); @@ -875,6 +892,9 @@ gst_amc_video_dec_fill_buffer (GstAmcVideoDec * self, GstAmcBuffer * buf, GstVideoInfo *info = &state->info; gboolean ret = FALSE; + if (self->color_format_info.color_format == COLOR_FormatAndroidOpaque) + return FALSE; + ret = gst_amc_color_format_copy (&self->color_format_info, buf, buffer_info, info, outbuf, COLOR_FORMAT_COPY_OUT); |