Merge ~alfonsosanchezbeato/ubuntu/+source/gst-plugins-bad1.0:master into ~ubuntu-desktop/ubuntu/+source/gst-plugins-bad1.0:master
- Git
- lp:~alfonsosanchezbeato/ubuntu/+source/gst-plugins-bad1.0
- master
- Merge into master
Proposed by
Alfonso Sanchez-Beato
on 2015-07-24
| Status: | Merged |
|---|---|
| Merged at revision: | 05a75e4abee4eb258ca0c1baa5bd63c5875fde15 |
| Proposed branch: | ~alfonsosanchezbeato/ubuntu/+source/gst-plugins-bad1.0:master |
| Merge into: | ~ubuntu-desktop/ubuntu/+source/gst-plugins-bad1.0:master |
| Diff against target: |
1395 lines (+305/-220) 1 file modified
debian/patches/adding-mirsink-and-android-media-over-hybris-support.patch (+305/-220) |
| Related bugs: |
| Reviewer | Review Type | Date Requested | Status |
|---|---|---|---|
| Jim Hodapp (community) | code | Approve on 2015-07-24 | |
| Ubuntu Desktop | 2015-07-24 | Pending | |
|
Review via email:
|
|||
Commit Message
Send error messages to the client in amchybris
Send error messages to the gstreamer client when an error happens in
amchybris, so it can react. Based on changes to the androidmedia plugin.
Description of the Change
Send error messages to the client in amchybris
Send error messages to the gstreamer client when an error happens in
amchybris, so it can react. Based on changes to the androidmedia plugin.
To post a comment you must log in.
| Jim Hodapp (jhodapp) wrote : | # |
Seems the macro that prints out the error also prints out the line number and file for each error. My comments no longer apply.
review:
Approve
(code)
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
| 1 | diff --git a/debian/patches/adding-mirsink-and-android-media-over-hybris-support.patch b/debian/patches/adding-mirsink-and-android-media-over-hybris-support.patch |
| 2 | index 87acd10..d574b0d 100644 |
| 3 | --- a/debian/patches/adding-mirsink-and-android-media-over-hybris-support.patch |
| 4 | +++ b/debian/patches/adding-mirsink-and-android-media-over-hybris-support.patch |
| 5 | @@ -14,7 +14,7 @@ Forwarded: no |
| 6 | ext/mir/Makefile.am | 17 + |
| 7 | ext/mir/gstmirsink.c | 848 ++++++++++ |
| 8 | ext/mir/gstmirsink.h | 134 ++ |
| 9 | - ext/mir/mirpool.c | 434 ++++++ |
| 10 | + ext/mir/mirpool.c | 434 +++++ |
| 11 | ext/mir/mirpool.h | 91 ++ |
| 12 | gst-libs/gst/Makefile.am | 8 +- |
| 13 | gst-libs/gst/mir/Makefile.am | 26 + |
| 14 | @@ -25,16 +25,16 @@ Forwarded: no |
| 15 | sys/Makefile.am | 6 + |
| 16 | sys/androidmedia/Makefile.am | 16 +- |
| 17 | sys/androidmedia/gstamc-constants.h | 7 + |
| 18 | - sys/androidmedia/gstamc.h | 162 +- |
| 19 | + sys/androidmedia/gstamc.h | 97 +- |
| 20 | sys/androidmedia/gstamcaudiodec.h | 8 + |
| 21 | - sys/androidmedia/gstamcaudiodechybris.c | 1278 +++++++++++++++ |
| 22 | - sys/androidmedia/gstamchybris.c | 2137 +++++++++++++++++++++++++ |
| 23 | + sys/androidmedia/gstamcaudiodechybris.c | 1291 +++++++++++++++ |
| 24 | + sys/androidmedia/gstamchybris.c | 2182 +++++++++++++++++++++++++ |
| 25 | sys/androidmedia/gstamcvideodec.h | 30 + |
| 26 | - sys/androidmedia/gstamcvideodechybris.c | 2327 ++++++++++++++++++++++++++++ |
| 27 | + sys/androidmedia/gstamcvideodechybris.c | 2399 ++++++++++++++++++++++++++++ |
| 28 | tests/check/Makefile.am | 7 + |
| 29 | tests/check/pipelines/gstamcvideodec.c | 538 +++++++ |
| 30 | tests/check/pipelines/gstamcvideodec_egl.c | 56 + |
| 31 | - 25 files changed, 8656 insertions(+), 36 deletions(-) |
| 32 | + 25 files changed, 8751 insertions(+), 6 deletions(-) |
| 33 | create mode 100644 ext/mir/Makefile.am |
| 34 | create mode 100644 ext/mir/gstmirsink.c |
| 35 | create mode 100644 ext/mir/gstmirsink.h |
| 36 | @@ -2404,10 +2404,10 @@ index ae52464..f5bb86f 100644 |
| 37 | |
| 38 | enum |
| 39 | diff --git a/sys/androidmedia/gstamc.h b/sys/androidmedia/gstamc.h |
| 40 | -index 88d49fb..2fddc05 100644 |
| 41 | +index 88d49fb..567752e 100644 |
| 42 | --- a/sys/androidmedia/gstamc.h |
| 43 | +++ b/sys/androidmedia/gstamc.h |
| 44 | -@@ -24,12 +24,73 @@ |
| 45 | +@@ -24,12 +24,67 @@ |
| 46 | #include <gst/gst.h> |
| 47 | #include <gst/video/video.h> |
| 48 | #include <gst/audio/audio.h> |
| 49 | @@ -2433,12 +2433,6 @@ index 88d49fb..2fddc05 100644 |
| 50 | + gsize size; |
| 51 | +}; |
| 52 | +#endif |
| 53 | -+ |
| 54 | -+#ifndef HAVE_ANDROID_MEDIA_HYBRIS |
| 55 | -+#define MAYBE_GERROR , GError **err |
| 56 | -+#else |
| 57 | -+#define MAYBE_GERROR |
| 58 | -+#endif |
| 59 | |
| 60 | G_BEGIN_DECLS |
| 61 | |
| 62 | @@ -2482,7 +2476,7 @@ index 88d49fb..2fddc05 100644 |
| 63 | typedef struct _GstAmcCodecInfo GstAmcCodecInfo; |
| 64 | typedef struct _GstAmcCodecType GstAmcCodecType; |
| 65 | typedef struct _GstAmcCodec GstAmcCodec; |
| 66 | -@@ -58,16 +119,29 @@ struct _GstAmcCodecInfo { |
| 67 | +@@ -58,16 +113,29 @@ struct _GstAmcCodecInfo { |
| 68 | }; |
| 69 | |
| 70 | struct _GstAmcFormat { |
| 71 | @@ -2512,105 +2506,66 @@ index 88d49fb..2fddc05 100644 |
| 72 | }; |
| 73 | |
| 74 | struct _GstAmcBufferInfo { |
| 75 | -@@ -79,43 +153,67 @@ struct _GstAmcBufferInfo { |
| 76 | - |
| 77 | - extern GQuark gst_amc_codec_info_quark; |
| 78 | - |
| 79 | --GstAmcCodec * gst_amc_codec_new (const gchar *name, GError **err); |
| 80 | -+GstAmcCodec * gst_amc_codec_new (const gchar *name MAYBE_GERROR); |
| 81 | +@@ -82,7 +150,15 @@ extern GQuark gst_amc_codec_info_quark; |
| 82 | + GstAmcCodec * gst_amc_codec_new (const gchar *name, GError **err); |
| 83 | void gst_amc_codec_free (GstAmcCodec * codec); |
| 84 | |
| 85 | --gboolean gst_amc_codec_configure (GstAmcCodec * codec, GstAmcFormat * format, gint flags, GError **err); |
| 86 | --GstAmcFormat * gst_amc_codec_get_output_format (GstAmcCodec * codec, GError **err); |
| 87 | -- |
| 88 | --gboolean gst_amc_codec_start (GstAmcCodec * codec, GError **err); |
| 89 | --gboolean gst_amc_codec_stop (GstAmcCodec * codec, GError **err); |
| 90 | --gboolean gst_amc_codec_flush (GstAmcCodec * codec, GError **err); |
| 91 | --gboolean gst_amc_codec_release (GstAmcCodec * codec, GError **err); |
| 92 | -- |
| 93 | --GstAmcBuffer * gst_amc_codec_get_output_buffer (GstAmcCodec * codec, gint index, GError **err); |
| 94 | --GstAmcBuffer * gst_amc_codec_get_input_buffer (GstAmcCodec * codec, gint index, GError **err); |
| 95 | -- |
| 96 | --gint gst_amc_codec_dequeue_input_buffer (GstAmcCodec * codec, gint64 timeoutUs, GError **err); |
| 97 | --gint gst_amc_codec_dequeue_output_buffer (GstAmcCodec * codec, GstAmcBufferInfo *info, gint64 timeoutUs, GError **err); |
| 98 | -- |
| 99 | --gboolean gst_amc_codec_queue_input_buffer (GstAmcCodec * codec, gint index, const GstAmcBufferInfo *info, GError **err); |
| 100 | --gboolean gst_amc_codec_release_output_buffer (GstAmcCodec * codec, gint index, GError **err); |
| 101 | -- |
| 102 | -- |
| 103 | --GstAmcFormat * gst_amc_format_new_audio (const gchar *mime, gint sample_rate, gint channels, GError **err); |
| 104 | --GstAmcFormat * gst_amc_format_new_video (const gchar *mime, gint width, gint height, GError **err); |
| 105 | +#ifdef HAVE_ANDROID_MEDIA_HYBRIS |
| 106 | -+gboolean gst_amc_codec_configure (GstAmcCodec * codec, GstAmcFormat * format, SurfaceTextureClientHybris stc, gint flags); |
| 107 | ++gboolean gst_amc_codec_configure (GstAmcCodec * codec, GstAmcFormat * format, |
| 108 | ++ SurfaceTextureClientHybris stc, gint flags, GError **err); |
| 109 | +gboolean gst_amc_codec_set_surface_texture_client (GstAmcCodec * codec, SurfaceTextureClientHybris stc); |
| 110 | +SurfaceTextureClientHybris gst_amc_codec_get_surface_texture_client (GstAmcCodec * codec); |
| 111 | +#else |
| 112 | -+gboolean gst_amc_codec_configure (GstAmcCodec * codec, GstAmcFormat * format, gint flags MAYBE_GERROR); |
| 113 | + gboolean gst_amc_codec_configure (GstAmcCodec * codec, GstAmcFormat * format, gint flags, GError **err); |
| 114 | +#endif |
| 115 | +gboolean gst_amc_codec_queue_csd (GstAmcCodec * codec, GstAmcFormat * format); |
| 116 | -+GstAmcFormat * gst_amc_codec_get_output_format (GstAmcCodec * codec MAYBE_GERROR); |
| 117 | -+ |
| 118 | -+gboolean gst_amc_codec_start (GstAmcCodec * codec MAYBE_GERROR); |
| 119 | -+gboolean gst_amc_codec_stop (GstAmcCodec * codec MAYBE_GERROR); |
| 120 | -+gboolean gst_amc_codec_flush (GstAmcCodec * codec MAYBE_GERROR); |
| 121 | -+gboolean gst_amc_codec_release (GstAmcCodec * codec MAYBE_GERROR); |
| 122 | -+ |
| 123 | + GstAmcFormat * gst_amc_codec_get_output_format (GstAmcCodec * codec, GError **err); |
| 124 | + |
| 125 | + gboolean gst_amc_codec_start (GstAmcCodec * codec, GError **err); |
| 126 | +@@ -90,18 +166,31 @@ gboolean gst_amc_codec_stop (GstAmcCodec * codec, GError **err); |
| 127 | + gboolean gst_amc_codec_flush (GstAmcCodec * codec, GError **err); |
| 128 | + gboolean gst_amc_codec_release (GstAmcCodec * codec, GError **err); |
| 129 | + |
| 130 | +#ifdef HAVE_ANDROID_MEDIA_HYBRIS |
| 131 | +GstAmcBuffer * gst_amc_codec_get_output_buffers (GstAmcCodec * codec, gsize * n_buffers); |
| 132 | +GstAmcBuffer * gst_amc_codec_get_input_buffers (GstAmcCodec * codec, gsize * n_buffers); |
| 133 | +#endif |
| 134 | + |
| 135 | -+GstAmcBuffer * gst_amc_codec_get_output_buffer (GstAmcCodec * codec, gint index MAYBE_GERROR); |
| 136 | -+GstAmcBuffer * gst_amc_codec_get_input_buffer (GstAmcCodec * codec, gint index MAYBE_GERROR); |
| 137 | + GstAmcBuffer * gst_amc_codec_get_output_buffer (GstAmcCodec * codec, gint index, GError **err); |
| 138 | + GstAmcBuffer * gst_amc_codec_get_input_buffer (GstAmcCodec * codec, gint index, GError **err); |
| 139 | +void gst_amc_codec_free_buffers (GstAmcBuffer * buffers, gsize n_buffers); |
| 140 | -+ |
| 141 | -+gint gst_amc_codec_dequeue_input_buffer (GstAmcCodec * codec, gint64 timeoutUs MAYBE_GERROR); |
| 142 | -+gint gst_amc_codec_dequeue_output_buffer (GstAmcCodec * codec, GstAmcBufferInfo *info, gint64 timeoutUs MAYBE_GERROR); |
| 143 | -+ |
| 144 | -+gboolean gst_amc_codec_queue_input_buffer (GstAmcCodec * codec, gint index, const GstAmcBufferInfo *info MAYBE_GERROR); |
| 145 | + |
| 146 | + gint gst_amc_codec_dequeue_input_buffer (GstAmcCodec * codec, gint64 timeoutUs, GError **err); |
| 147 | + gint gst_amc_codec_dequeue_output_buffer (GstAmcCodec * codec, GstAmcBufferInfo *info, gint64 timeoutUs, GError **err); |
| 148 | + |
| 149 | + gboolean gst_amc_codec_queue_input_buffer (GstAmcCodec * codec, gint index, const GstAmcBufferInfo *info, GError **err); |
| 150 | +#ifdef HAVE_ANDROID_MEDIA_HYBRIS |
| 151 | -+gboolean gst_amc_codec_release_output_buffer (GstAmcCodec * codec, gint index, gboolean render); |
| 152 | ++gboolean gst_amc_codec_release_output_buffer (GstAmcCodec * codec, gint index, gboolean render, GError **err); |
| 153 | +#else |
| 154 | -+gboolean gst_amc_codec_release_output_buffer (GstAmcCodec * codec, gint index MAYBE_GERROR); |
| 155 | + gboolean gst_amc_codec_release_output_buffer (GstAmcCodec * codec, gint index, GError **err); |
| 156 | +- |
| 157 | +#endif |
| 158 | -+ |
| 159 | -+GstAmcFormat * gst_amc_format_new_audio (const gchar *mime, gint sample_rate, gint channels MAYBE_GERROR); |
| 160 | + |
| 161 | + GstAmcFormat * gst_amc_format_new_audio (const gchar *mime, gint sample_rate, gint channels, GError **err); |
| 162 | +#ifdef HAVE_ANDROID_MEDIA_HYBRIS |
| 163 | -+GstAmcFormat * gst_amc_format_new_video (const gchar *mime, gint width, gint height, gint buffsize); |
| 164 | ++GstAmcFormat * gst_amc_format_new_video (const gchar *mime, gint width, gint height, gint buffsize, GError **err); |
| 165 | +#else |
| 166 | -+GstAmcFormat * gst_amc_format_new_video (const gchar *mime, gint width, gint height MAYBE_GERROR); |
| 167 | + GstAmcFormat * gst_amc_format_new_video (const gchar *mime, gint width, gint height, GError **err); |
| 168 | +#endif |
| 169 | void gst_amc_format_free (GstAmcFormat * format); |
| 170 | |
| 171 | --gchar * gst_amc_format_to_string (GstAmcFormat * format, GError **err); |
| 172 | -+gchar * gst_amc_format_to_string (GstAmcFormat * format MAYBE_GERROR); |
| 173 | -+ |
| 174 | -+gboolean gst_amc_format_contains_key (GstAmcFormat *format, const gchar *key MAYBE_GERROR); |
| 175 | + gchar * gst_amc_format_to_string (GstAmcFormat * format, GError **err); |
| 176 | +@@ -117,6 +206,10 @@ gboolean gst_amc_format_set_string (GstAmcFormat *format, const gchar *key, cons |
| 177 | + gboolean gst_amc_format_get_buffer (GstAmcFormat *format, const gchar *key, guint8 **data, gsize *size, GError **err); |
| 178 | + gboolean gst_amc_format_set_buffer (GstAmcFormat *format, const gchar *key, guint8 *data, gsize size, GError **err); |
| 179 | |
| 180 | --gboolean gst_amc_format_contains_key (GstAmcFormat *format, const gchar *key, GError **err); |
| 181 | -+gboolean gst_amc_format_get_float (GstAmcFormat *format, const gchar *key, gfloat *value MAYBE_GERROR); |
| 182 | -+gboolean gst_amc_format_set_float (GstAmcFormat *format, const gchar *key, gfloat value MAYBE_GERROR); |
| 183 | -+gboolean gst_amc_format_get_int (GstAmcFormat *format, const gchar *key, gint *value MAYBE_GERROR); |
| 184 | -+gboolean gst_amc_format_set_int (GstAmcFormat *format, const gchar *key, gint value MAYBE_GERROR); |
| 185 | -+gboolean gst_amc_format_get_string (GstAmcFormat *format, const gchar *key, gchar **value MAYBE_GERROR); |
| 186 | -+gboolean gst_amc_format_set_string (GstAmcFormat *format, const gchar *key, const gchar *value MAYBE_GERROR); |
| 187 | -+gboolean gst_amc_format_get_buffer (GstAmcFormat *format, const gchar *key, guint8 **data, gsize *size MAYBE_GERROR); |
| 188 | -+gboolean gst_amc_format_set_buffer (GstAmcFormat *format, const gchar *key, guint8 *data, gsize size MAYBE_GERROR); |
| 189 | - |
| 190 | --gboolean gst_amc_format_get_float (GstAmcFormat *format, const gchar *key, gfloat *value, GError **err); |
| 191 | --gboolean gst_amc_format_set_float (GstAmcFormat *format, const gchar *key, gfloat value, GError **err); |
| 192 | --gboolean gst_amc_format_get_int (GstAmcFormat *format, const gchar *key, gint *value, GError **err); |
| 193 | --gboolean gst_amc_format_set_int (GstAmcFormat *format, const gchar *key, gint value, GError **err); |
| 194 | --gboolean gst_amc_format_get_string (GstAmcFormat *format, const gchar *key, gchar **value, GError **err); |
| 195 | --gboolean gst_amc_format_set_string (GstAmcFormat *format, const gchar *key, const gchar *value, GError **err); |
| 196 | --gboolean gst_amc_format_get_buffer (GstAmcFormat *format, const gchar *key, guint8 **data, gsize *size, GError **err); |
| 197 | --gboolean gst_amc_format_set_buffer (GstAmcFormat *format, const gchar *key, guint8 *data, gsize size, GError **err); |
| 198 | +#ifdef HAVE_ANDROID_MEDIA_HYBRIS |
| 199 | +void gst_amc_surface_texture_client_set_hardware_rendering (SurfaceTextureClientHybris stc, gboolean hardware_rendering); |
| 200 | +#endif |
| 201 | - |
| 202 | ++ |
| 203 | GstVideoFormat gst_amc_color_format_to_video_format (const GstAmcCodecInfo * codec_info, const gchar * mime, gint color_format); |
| 204 | gint gst_amc_video_format_to_color_format (const GstAmcCodecInfo * codec_info, const gchar * mime, GstVideoFormat video_format); |
| 205 | + |
| 206 | diff --git a/sys/androidmedia/gstamcaudiodec.h b/sys/androidmedia/gstamcaudiodec.h |
| 207 | index 04e9734..72d68fc 100644 |
| 208 | --- a/sys/androidmedia/gstamcaudiodec.h |
| 209 | @@ -2639,10 +2594,10 @@ index 04e9734..72d68fc 100644 |
| 210 | }; |
| 211 | diff --git a/sys/androidmedia/gstamcaudiodechybris.c b/sys/androidmedia/gstamcaudiodechybris.c |
| 212 | new file mode 100644 |
| 213 | -index 0000000..fae2930 |
| 214 | +index 0000000..f361418 |
| 215 | --- /dev/null |
| 216 | +++ b/sys/androidmedia/gstamcaudiodechybris.c |
| 217 | -@@ -0,0 +1,1278 @@ |
| 218 | +@@ -0,0 +1,1291 @@ |
| 219 | +/* |
| 220 | + * Initially based on gst-omx/omx/gstomxvideodec.c |
| 221 | + * |
| 222 | @@ -3011,10 +2966,11 @@ index 0000000..fae2930 |
| 223 | +{ |
| 224 | + GstAmcAudioDec *self = GST_AMC_AUDIO_DEC (decoder); |
| 225 | + GstAmcAudioDecClass *klass = GST_AMC_AUDIO_DEC_GET_CLASS (self); |
| 226 | ++ GError *err = NULL; |
| 227 | + |
| 228 | + GST_DEBUG_OBJECT (self, "Opening decoder"); |
| 229 | + |
| 230 | -+ self->codec = gst_amc_codec_new (klass->codec_info->name); |
| 231 | ++ self->codec = gst_amc_codec_new (klass->codec_info->name, &err); |
| 232 | + if (!self->codec) |
| 233 | + return FALSE; |
| 234 | + self->started = FALSE; |
| 235 | @@ -3060,6 +3016,7 @@ index 0000000..fae2930 |
| 236 | +{ |
| 237 | + GstAmcAudioDec *self; |
| 238 | + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; |
| 239 | ++ GError *err = NULL; |
| 240 | + |
| 241 | + g_return_val_if_fail (GST_IS_AMC_AUDIO_DEC (element), |
| 242 | + GST_STATE_CHANGE_FAILURE); |
| 243 | @@ -3077,7 +3034,7 @@ index 0000000..fae2930 |
| 244 | + break; |
| 245 | + case GST_STATE_CHANGE_PAUSED_TO_READY: |
| 246 | + self->flushing = TRUE; |
| 247 | -+ gst_amc_codec_flush (self->codec); |
| 248 | ++ gst_amc_codec_flush (self->codec, &err); |
| 249 | + g_mutex_lock (&self->drain_lock); |
| 250 | + self->draining = FALSE; |
| 251 | + g_cond_broadcast (&self->drain_cond); |
| 252 | @@ -3117,9 +3074,10 @@ index 0000000..fae2930 |
| 253 | + gint rate, channels; |
| 254 | + guint32 channel_mask = 0; |
| 255 | + GstAudioChannelPosition to[64]; |
| 256 | ++ GError *err = NULL; |
| 257 | + |
| 258 | -+ if (!gst_amc_format_get_int (format, "sample-rate", &rate) || |
| 259 | -+ !gst_amc_format_get_int (format, "channel-count", &channels)) { |
| 260 | ++ if (!gst_amc_format_get_int (format, "sample-rate", &rate, &err) || |
| 261 | ++ !gst_amc_format_get_int (format, "channel-count", &channels, &err)) { |
| 262 | + GST_ERROR_OBJECT (self, "Failed to get output format metadata"); |
| 263 | + return FALSE; |
| 264 | + } |
| 265 | @@ -3130,8 +3088,9 @@ index 0000000..fae2930 |
| 266 | + } |
| 267 | + |
| 268 | + /* Not always present */ |
| 269 | -+ if (gst_amc_format_contains_key (format, "channel-mask")) |
| 270 | -+ gst_amc_format_get_int (format, "channel-mask", (gint *) & channel_mask); |
| 271 | ++ if (gst_amc_format_contains_key (format, "channel-mask", NULL)) |
| 272 | ++ gst_amc_format_get_int (format, "channel-mask", (gint *) & channel_mask, |
| 273 | ++ NULL); |
| 274 | + |
| 275 | + gst_amc_audio_channel_mask_to_positions (channel_mask, channels, |
| 276 | + self->positions); |
| 277 | @@ -3164,6 +3123,7 @@ index 0000000..fae2930 |
| 278 | + gboolean is_eos; |
| 279 | + GstAmcBufferInfo buffer_info; |
| 280 | + gint idx; |
| 281 | ++ GError *err = NULL; |
| 282 | + |
| 283 | + GST_AUDIO_DECODER_STREAM_LOCK (self); |
| 284 | + |
| 285 | @@ -3175,7 +3135,9 @@ index 0000000..fae2930 |
| 286 | + GST_AUDIO_DECODER_STREAM_UNLOCK (self); |
| 287 | + /* Wait at most 100ms here, some codecs don't fail dequeueing if |
| 288 | + * the codec is flushing, causing deadlocks during shutdown */ |
| 289 | -+ idx = gst_amc_codec_dequeue_output_buffer (self->codec, &buffer_info, 100000); |
| 290 | ++ idx = |
| 291 | ++ gst_amc_codec_dequeue_output_buffer (self->codec, &buffer_info, 100000, |
| 292 | ++ &err); |
| 293 | + GST_AUDIO_DECODER_STREAM_LOCK (self); |
| 294 | + /*} */ |
| 295 | + |
| 296 | @@ -3202,11 +3164,11 @@ index 0000000..fae2930 |
| 297 | + |
| 298 | + GST_DEBUG_OBJECT (self, "Output format has changed"); |
| 299 | + |
| 300 | -+ format = gst_amc_codec_get_output_format (self->codec); |
| 301 | ++ format = gst_amc_codec_get_output_format (self->codec, &err); |
| 302 | + if (!format) |
| 303 | + goto format_error; |
| 304 | + |
| 305 | -+ format_string = gst_amc_format_to_string (format); |
| 306 | ++ format_string = gst_amc_format_to_string (format, &err); |
| 307 | + GST_DEBUG_OBJECT (self, "Got new output format: %s", format_string); |
| 308 | + g_free (format_string); |
| 309 | + |
| 310 | @@ -3299,7 +3261,7 @@ index 0000000..fae2930 |
| 311 | + gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (self), outbuf, 1); |
| 312 | + } |
| 313 | + |
| 314 | -+ if (!gst_amc_codec_release_output_buffer (self->codec, idx, TRUE)) |
| 315 | ++ if (!gst_amc_codec_release_output_buffer (self->codec, idx, TRUE, &err)) |
| 316 | + goto failed_release; |
| 317 | + |
| 318 | + if (is_eos || flow_ret == GST_FLOW_EOS) { |
| 319 | @@ -3440,13 +3402,14 @@ index 0000000..fae2930 |
| 320 | +gst_amc_audio_dec_stop (GstAudioDecoder * decoder) |
| 321 | +{ |
| 322 | + GstAmcAudioDec *self; |
| 323 | ++ GError *err = NULL; |
| 324 | + |
| 325 | + self = GST_AMC_AUDIO_DEC (decoder); |
| 326 | + GST_DEBUG_OBJECT (self, "Stopping decoder"); |
| 327 | + self->flushing = TRUE; |
| 328 | + if (self->started) { |
| 329 | -+ gst_amc_codec_flush (self->codec); |
| 330 | -+ gst_amc_codec_stop (self->codec); |
| 331 | ++ gst_amc_codec_flush (self->codec, &err); |
| 332 | ++ gst_amc_codec_stop (self->codec, &err); |
| 333 | + self->started = FALSE; |
| 334 | + if (self->input_buffers) |
| 335 | + gst_amc_codec_free_buffers (self->input_buffers, self->n_input_buffers); |
| 336 | @@ -3485,6 +3448,7 @@ index 0000000..fae2930 |
| 337 | + gboolean needs_disable = FALSE; |
| 338 | + gchar *format_string; |
| 339 | + gint rate, channels; |
| 340 | ++ GError *err = NULL; |
| 341 | + |
| 342 | + self = GST_AMC_AUDIO_DEC (decoder); |
| 343 | + |
| 344 | @@ -3540,7 +3504,7 @@ index 0000000..fae2930 |
| 345 | + return FALSE; |
| 346 | + } |
| 347 | + |
| 348 | -+ format = gst_amc_format_new_audio (mime, rate, channels); |
| 349 | ++ format = gst_amc_format_new_audio (mime, rate, channels, &err); |
| 350 | + if (!format) { |
| 351 | + GST_ERROR_OBJECT (self, "Failed to create audio format"); |
| 352 | + return FALSE; |
| 353 | @@ -3559,7 +3523,7 @@ index 0000000..fae2930 |
| 354 | + gst_buffer_map (codec_data, &minfo, GST_MAP_READ); |
| 355 | + data = g_memdup (minfo.data, minfo.size); |
| 356 | + self->codec_datas = g_list_prepend (self->codec_datas, data); |
| 357 | -+ gst_amc_format_set_buffer (format, "csd-0", data, minfo.size); |
| 358 | ++ gst_amc_format_set_buffer (format, "csd-0", data, minfo.size, &err); |
| 359 | + gst_buffer_unmap (codec_data, &minfo); |
| 360 | + } else if (gst_structure_has_field (s, "streamheader")) { |
| 361 | + const GValue *sh = gst_structure_get_value (s, "streamheader"); |
| 362 | @@ -3589,25 +3553,25 @@ index 0000000..fae2930 |
| 363 | + gst_buffer_map (buf, &minfo, GST_MAP_READ); |
| 364 | + data = g_memdup (minfo.data, minfo.size); |
| 365 | + self->codec_datas = g_list_prepend (self->codec_datas, data); |
| 366 | -+ gst_amc_format_set_buffer (format, fname, data, minfo.size); |
| 367 | ++ gst_amc_format_set_buffer (format, fname, data, minfo.size, &err); |
| 368 | + gst_buffer_unmap (buf, &minfo); |
| 369 | + g_free (fname); |
| 370 | + j++; |
| 371 | + } |
| 372 | + } |
| 373 | + |
| 374 | -+ format_string = gst_amc_format_to_string (format); |
| 375 | ++ format_string = gst_amc_format_to_string (format, &err); |
| 376 | + GST_DEBUG_OBJECT (self, "Configuring codec with format: %s", format_string); |
| 377 | + g_free (format_string); |
| 378 | + |
| 379 | -+ if (!gst_amc_codec_configure (self->codec, format, NULL, 0)) { |
| 380 | ++ if (!gst_amc_codec_configure (self->codec, format, NULL, 0, &err)) { |
| 381 | + GST_ERROR_OBJECT (self, "Failed to configure codec"); |
| 382 | + return FALSE; |
| 383 | + } |
| 384 | + |
| 385 | + gst_amc_format_free (format); |
| 386 | + |
| 387 | -+ if (!gst_amc_codec_start (self->codec)) { |
| 388 | ++ if (!gst_amc_codec_start (self->codec, &err)) { |
| 389 | + GST_ERROR_OBJECT (self, "Failed to start codec"); |
| 390 | + return FALSE; |
| 391 | + } |
| 392 | @@ -3637,6 +3601,7 @@ index 0000000..fae2930 |
| 393 | +gst_amc_audio_dec_flush (GstAudioDecoder * decoder, gboolean hard) |
| 394 | +{ |
| 395 | + GstAmcAudioDec *self; |
| 396 | ++ GError *err = NULL; |
| 397 | + |
| 398 | + self = GST_AMC_AUDIO_DEC (decoder); |
| 399 | + |
| 400 | @@ -3648,7 +3613,7 @@ index 0000000..fae2930 |
| 401 | + } |
| 402 | + |
| 403 | + self->flushing = TRUE; |
| 404 | -+ gst_amc_codec_flush (self->codec); |
| 405 | ++ gst_amc_codec_flush (self->codec, &err); |
| 406 | + |
| 407 | + /* Wait until the srcpad loop is finished, |
| 408 | + * unlock GST_AUDIO_DECODER_STREAM_LOCK to prevent deadlocks |
| 409 | @@ -3679,6 +3644,7 @@ index 0000000..fae2930 |
| 410 | + guint offset = 0; |
| 411 | + GstClockTime timestamp, duration, timestamp_offset = 0; |
| 412 | + GstMapInfo minfo; |
| 413 | ++ GError *err = NULL; |
| 414 | + |
| 415 | + memset (&minfo, 0, sizeof (minfo)); |
| 416 | + |
| 417 | @@ -3727,7 +3693,7 @@ index 0000000..fae2930 |
| 418 | + GST_AUDIO_DECODER_STREAM_UNLOCK (self); |
| 419 | + /* Wait at most 100ms here, some codecs don't fail dequeueing if |
| 420 | + * the codec is flushing, causing deadlocks during shutdown */ |
| 421 | -+ idx = gst_amc_codec_dequeue_input_buffer (self->codec, 100000); |
| 422 | ++ idx = gst_amc_codec_dequeue_input_buffer (self->codec, 100000, &err); |
| 423 | + GST_AUDIO_DECODER_STREAM_LOCK (self); |
| 424 | + |
| 425 | + if (idx < 0) { |
| 426 | @@ -3757,7 +3723,7 @@ index 0000000..fae2930 |
| 427 | + |
| 428 | + if (self->downstream_flow_ret != GST_FLOW_OK) { |
| 429 | + memset (&buffer_info, 0, sizeof (buffer_info)); |
| 430 | -+ gst_amc_codec_queue_input_buffer (self->codec, idx, &buffer_info); |
| 431 | ++ gst_amc_codec_queue_input_buffer (self->codec, idx, &buffer_info, &err); |
| 432 | + goto downstream_error; |
| 433 | + } |
| 434 | + |
| 435 | @@ -3797,7 +3763,8 @@ index 0000000..fae2930 |
| 436 | + "Queueing buffer %d: size %d time %" G_GINT64_FORMAT " flags 0x%08x", |
| 437 | + idx, buffer_info.size, buffer_info.presentation_time_us, |
| 438 | + buffer_info.flags); |
| 439 | -+ if (!gst_amc_codec_queue_input_buffer (self->codec, idx, &buffer_info)) |
| 440 | ++ if (!gst_amc_codec_queue_input_buffer (self->codec, idx, &buffer_info, |
| 441 | ++ &err)) |
| 442 | + goto queue_error; |
| 443 | + } |
| 444 | + gst_buffer_unmap (inbuf, &minfo); |
| 445 | @@ -3861,6 +3828,7 @@ index 0000000..fae2930 |
| 446 | +{ |
| 447 | + GstFlowReturn ret; |
| 448 | + gint idx; |
| 449 | ++ GError *err = NULL; |
| 450 | + |
| 451 | + GST_DEBUG_OBJECT (self, "Draining codec"); |
| 452 | + if (!self->started) { |
| 453 | @@ -3882,7 +3850,7 @@ index 0000000..fae2930 |
| 454 | + * class drop the EOS event. We will send it later when |
| 455 | + * the EOS buffer arrives on the output port. |
| 456 | + * Wait at most 0.5s here. */ |
| 457 | -+ idx = gst_amc_codec_dequeue_input_buffer (self->codec, 500000); |
| 458 | ++ idx = gst_amc_codec_dequeue_input_buffer (self->codec, 500000, &err); |
| 459 | + GST_AUDIO_DECODER_STREAM_LOCK (self); |
| 460 | + |
| 461 | + if (idx >= 0 && idx < self->n_input_buffers) { |
| 462 | @@ -3898,7 +3866,7 @@ index 0000000..fae2930 |
| 463 | + gst_util_uint64_scale (self->last_upstream_ts, 1, GST_USECOND); |
| 464 | + buffer_info.flags |= BUFFER_FLAG_END_OF_STREAM; |
| 465 | + |
| 466 | -+ if (gst_amc_codec_queue_input_buffer (self->codec, idx, &buffer_info)) { |
| 467 | ++ if (gst_amc_codec_queue_input_buffer (self->codec, idx, &buffer_info, &err)) { |
| 468 | + GST_DEBUG_OBJECT (self, "Waiting until codec is drained"); |
| 469 | + g_cond_wait (&self->drain_cond, &self->drain_lock); |
| 470 | + GST_DEBUG_OBJECT (self, "Drained codec"); |
| 471 | @@ -3923,14 +3891,14 @@ index 0000000..fae2930 |
| 472 | +} |
| 473 | diff --git a/sys/androidmedia/gstamchybris.c b/sys/androidmedia/gstamchybris.c |
| 474 | new file mode 100644 |
| 475 | -index 0000000..16fdacc |
| 476 | +index 0000000..abc6677 |
| 477 | --- /dev/null |
| 478 | +++ b/sys/androidmedia/gstamchybris.c |
| 479 | -@@ -0,0 +1,2137 @@ |
| 480 | +@@ -0,0 +1,2182 @@ |
| 481 | +/* |
| 482 | + * Initially based on gstamc.c |
| 483 | + * |
| 484 | -+ * Copyright (C) 2013, Canonical Ltd. |
| 485 | ++ * Copyright (C) 2013-2015, Canonical Ltd. |
| 486 | + * Author: Jim Hodapp <jim.hodapp@canonical.com> |
| 487 | + * |
| 488 | + * This library is free software; you can redistribute it and/or |
| 489 | @@ -4128,13 +4096,12 @@ index 0000000..16fdacc |
| 490 | +#endif |
| 491 | + |
| 492 | +static gchar * |
| 493 | -+locale_to_utf8 (gchar * str, gssize len) |
| 494 | ++locale_to_utf8 (gchar * str, gssize len, GError ** err) |
| 495 | +{ |
| 496 | -+ GError *error = NULL; |
| 497 | + gsize bytes_read = 0, bytes_written = 0; |
| 498 | + gchar *out = NULL; |
| 499 | + |
| 500 | -+ out = g_locale_to_utf8 (str, len, &bytes_read, &bytes_written, &error); |
| 501 | ++ out = g_locale_to_utf8 (str, len, &bytes_read, &bytes_written, err); |
| 502 | + if (bytes_read == 0) |
| 503 | + GST_WARNING ("Zero bytes read for UTF8 string conversion"); |
| 504 | + if (bytes_written == 0) |
| 505 | @@ -4143,8 +4110,28 @@ index 0000000..16fdacc |
| 506 | + return out; |
| 507 | +} |
| 508 | + |
| 509 | ++G_GNUC_PRINTF (4, 5) |
| 510 | ++ static void |
| 511 | ++ gst_amc_set_error (GQuark domain, gint code, GError ** err, |
| 512 | ++ const gchar * format, ...) |
| 513 | ++{ |
| 514 | ++ gchar *message; |
| 515 | ++ va_list var_args; |
| 516 | ++ |
| 517 | ++ if (!err) |
| 518 | ++ return; |
| 519 | ++ |
| 520 | ++ va_start (var_args, format); |
| 521 | ++ message = g_strdup_vprintf (format, var_args); |
| 522 | ++ va_end (var_args); |
| 523 | ++ |
| 524 | ++ g_set_error (err, domain, code, "%s", message); |
| 525 | ++ |
| 526 | ++ g_free (message); |
| 527 | ++} |
| 528 | ++ |
| 529 | +GstAmcCodec * |
| 530 | -+gst_amc_codec_new (const gchar * name) |
| 531 | ++gst_amc_codec_new (const gchar * name, GError ** err) |
| 532 | +{ |
| 533 | + GstAmcCodec *codec = NULL; |
| 534 | + gchar *name_str = NULL; |
| 535 | @@ -4156,15 +4143,17 @@ index 0000000..16fdacc |
| 536 | + codec = g_slice_new0 (GstAmcCodec); |
| 537 | + |
| 538 | + name_str = g_strdup (name); |
| 539 | -+ name_str = locale_to_utf8 (name_str, strlen (name)); |
| 540 | -+ if (name_str == NULL) |
| 541 | ++ name_str = locale_to_utf8 (name_str, strlen (name), err); |
| 542 | ++ if (name_str == NULL) { |
| 543 | + goto error; |
| 544 | ++ } |
| 545 | + GST_DEBUG ("codec name '%s'", name_str); |
| 546 | + |
| 547 | + codec->surface_texture_client = NULL; |
| 548 | + codec->codec_delegate = media_codec_create_by_codec_name (name_str); |
| 549 | + if (codec->codec_delegate == NULL) { |
| 550 | -+ GST_ERROR ("Failed to create codec '%s'", name_str); |
| 551 | ++ gst_amc_set_error (GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_SETTINGS, err, |
| 552 | ++ "Failed to create codec '%s'", name_str); |
| 553 | + goto error; |
| 554 | + } |
| 555 | + |
| 556 | @@ -4198,10 +4187,10 @@ index 0000000..16fdacc |
| 557 | + |
| 558 | +gboolean |
| 559 | +gst_amc_codec_configure (GstAmcCodec * codec, GstAmcFormat * format, |
| 560 | -+ SurfaceTextureClientHybris stc, gint flags) |
| 561 | ++ SurfaceTextureClientHybris stc, gint flags, GError ** err) |
| 562 | +{ |
| 563 | + gboolean ret = TRUE; |
| 564 | -+ int err = 0; |
| 565 | ++ int res = 0; |
| 566 | + |
| 567 | + GST_DEBUG ("%s", __PRETTY_FUNCTION__); |
| 568 | + |
| 569 | @@ -4221,8 +4210,8 @@ index 0000000..16fdacc |
| 570 | + } |
| 571 | + |
| 572 | + if (i >= MAX_TRIES) { |
| 573 | -+ GST_ERROR |
| 574 | -+ ("Failed to get a valid texture id, cannot configure the codec."); |
| 575 | ++ gst_amc_set_error (GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED, err, |
| 576 | ++ "Failed to get a valid texture id, cannot configure the codec."); |
| 577 | + ret = FALSE; |
| 578 | + goto done; |
| 579 | + } |
| 580 | @@ -4262,9 +4251,10 @@ index 0000000..16fdacc |
| 581 | + } |
| 582 | + } |
| 583 | + |
| 584 | -+ err = media_codec_configure (codec->codec_delegate, format->format, stc, 0); |
| 585 | -+ if (err > 0) { |
| 586 | -+ GST_ERROR ("Failed to configure media codec"); |
| 587 | ++ res = media_codec_configure (codec->codec_delegate, format->format, stc, 0); |
| 588 | ++ if (res > 0) { |
| 589 | ++ gst_amc_set_error (GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_SETTINGS, err, |
| 590 | ++ "Failed to configure media codec"); |
| 591 | + ret = FALSE; |
| 592 | + goto done; |
| 593 | + } |
| 594 | @@ -4321,7 +4311,7 @@ index 0000000..16fdacc |
| 595 | +} |
| 596 | + |
| 597 | +GstAmcFormat * |
| 598 | -+gst_amc_codec_get_output_format (GstAmcCodec * codec) |
| 599 | ++gst_amc_codec_get_output_format (GstAmcCodec * codec, GError ** err) |
| 600 | +{ |
| 601 | + GstAmcFormat *ret = NULL; |
| 602 | + |
| 603 | @@ -4333,7 +4323,8 @@ index 0000000..16fdacc |
| 604 | + |
| 605 | + ret->format = media_codec_get_output_format (codec->codec_delegate); |
| 606 | + if (ret->format == NULL) { |
| 607 | -+ GST_ERROR ("Failed to get output format"); |
| 608 | ++ gst_amc_set_error (GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_SETTINGS, err, |
| 609 | ++ "Failed to get output format"); |
| 610 | + g_slice_free (GstAmcFormat, ret); |
| 611 | + ret = NULL; |
| 612 | + goto done; |
| 613 | @@ -4345,18 +4336,19 @@ index 0000000..16fdacc |
| 614 | +} |
| 615 | + |
| 616 | +gboolean |
| 617 | -+gst_amc_codec_start (GstAmcCodec * codec) |
| 618 | ++gst_amc_codec_start (GstAmcCodec * codec, GError ** err) |
| 619 | +{ |
| 620 | + gboolean ret = TRUE; |
| 621 | -+ int err = 0; |
| 622 | ++ int res = 0; |
| 623 | + |
| 624 | + g_return_val_if_fail (codec != NULL, FALSE); |
| 625 | + |
| 626 | + GST_DEBUG ("%s", __PRETTY_FUNCTION__); |
| 627 | + |
| 628 | -+ err = media_codec_start (codec->codec_delegate); |
| 629 | -+ if (err > 0) { |
| 630 | -+ GST_ERROR ("Failed to start media codec"); |
| 631 | ++ res = media_codec_start (codec->codec_delegate); |
| 632 | ++ if (res > 0) { |
| 633 | ++ gst_amc_set_error (GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED, err, |
| 634 | ++ "Failed to get start media codec"); |
| 635 | + ret = FALSE; |
| 636 | + goto done; |
| 637 | + } |
| 638 | @@ -4366,18 +4358,19 @@ index 0000000..16fdacc |
| 639 | +} |
| 640 | + |
| 641 | +gboolean |
| 642 | -+gst_amc_codec_stop (GstAmcCodec * codec) |
| 643 | ++gst_amc_codec_stop (GstAmcCodec * codec, GError ** err) |
| 644 | +{ |
| 645 | + gboolean ret = TRUE; |
| 646 | -+ int err = 0; |
| 647 | ++ int res = 0; |
| 648 | + |
| 649 | + g_return_val_if_fail (codec != NULL, FALSE); |
| 650 | + |
| 651 | + GST_DEBUG ("%s", __PRETTY_FUNCTION__); |
| 652 | + |
| 653 | -+ err = media_codec_stop (codec->codec_delegate); |
| 654 | -+ if (err > 0) { |
| 655 | -+ GST_ERROR ("Failed to start media codec"); |
| 656 | ++ res = media_codec_stop (codec->codec_delegate); |
| 657 | ++ if (res > 0) { |
| 658 | ++ gst_amc_set_error (GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED, err, |
| 659 | ++ "Failed to stop media codec"); |
| 660 | + ret = FALSE; |
| 661 | + goto done; |
| 662 | + } |
| 663 | @@ -4396,18 +4389,19 @@ index 0000000..16fdacc |
| 664 | +} |
| 665 | + |
| 666 | +gboolean |
| 667 | -+gst_amc_codec_flush (GstAmcCodec * codec) |
| 668 | ++gst_amc_codec_flush (GstAmcCodec * codec, GError ** err) |
| 669 | +{ |
| 670 | + gboolean ret = TRUE; |
| 671 | -+ gint err = 0; |
| 672 | ++ gint res = 0; |
| 673 | + |
| 674 | + g_return_val_if_fail (codec != NULL, FALSE); |
| 675 | + |
| 676 | + GST_DEBUG ("%s", __PRETTY_FUNCTION__); |
| 677 | + |
| 678 | -+ err = media_codec_flush (codec->codec_delegate); |
| 679 | -+ if (err < 0) { |
| 680 | -+ GST_ERROR ("Failed to flush the media codec (err: %d)", err); |
| 681 | ++ res = media_codec_flush (codec->codec_delegate); |
| 682 | ++ if (res < 0) { |
| 683 | ++ gst_amc_set_error (GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED, err, |
| 684 | ++ "Failed to flush the media codec (res: %d)", res); |
| 685 | + ret = FALSE; |
| 686 | + goto done; |
| 687 | + } |
| 688 | @@ -4417,18 +4411,19 @@ index 0000000..16fdacc |
| 689 | +} |
| 690 | + |
| 691 | +gboolean |
| 692 | -+gst_amc_codec_release (GstAmcCodec * codec) |
| 693 | ++gst_amc_codec_release (GstAmcCodec * codec, GError ** err) |
| 694 | +{ |
| 695 | + gboolean ret = TRUE; |
| 696 | -+ gint err = 0; |
| 697 | ++ gint res = 0; |
| 698 | + |
| 699 | + g_return_val_if_fail (codec != NULL, FALSE); |
| 700 | + |
| 701 | + GST_DEBUG ("%s", __PRETTY_FUNCTION__); |
| 702 | + |
| 703 | -+ err = media_codec_release (codec->codec_delegate); |
| 704 | -+ if (err < 0) { |
| 705 | -+ GST_ERROR ("Failed to release media codec (err: %d)", err); |
| 706 | ++ res = media_codec_release (codec->codec_delegate); |
| 707 | ++ if (res < 0) { |
| 708 | ++ gst_amc_set_error (GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED, err, |
| 709 | ++ "Failed to release media codec (res: %d)", res); |
| 710 | + ret = FALSE; |
| 711 | + goto done; |
| 712 | + } |
| 713 | @@ -4487,7 +4482,7 @@ index 0000000..16fdacc |
| 714 | +} |
| 715 | + |
| 716 | +GstAmcBuffer * |
| 717 | -+gst_amc_codec_get_output_buffer (GstAmcCodec * codec, gint index) |
| 718 | ++gst_amc_codec_get_output_buffer (GstAmcCodec * codec, gint index, GError ** err) |
| 719 | +{ |
| 720 | + GstAmcBuffer *ret = NULL; |
| 721 | + |
| 722 | @@ -4555,7 +4550,7 @@ index 0000000..16fdacc |
| 723 | +} |
| 724 | + |
| 725 | +GstAmcBuffer * |
| 726 | -+gst_amc_codec_get_input_buffer (GstAmcCodec * codec, gint index) |
| 727 | ++gst_amc_codec_get_input_buffer (GstAmcCodec * codec, gint index, GError ** err) |
| 728 | +{ |
| 729 | + GstAmcBuffer *ret = NULL; |
| 730 | + |
| 731 | @@ -4566,7 +4561,8 @@ index 0000000..16fdacc |
| 732 | + |
| 733 | + ret->data = media_codec_get_nth_input_buffer (codec->codec_delegate, index); |
| 734 | + if (!ret->data) { |
| 735 | -+ GST_ERROR ("Failed to get input buffer address %d", index); |
| 736 | ++ gst_amc_set_error (GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED, err, |
| 737 | ++ "Failed to get input buffer address %d", index); |
| 738 | + goto error; |
| 739 | + } |
| 740 | + |
| 741 | @@ -4583,7 +4579,8 @@ index 0000000..16fdacc |
| 742 | +} |
| 743 | + |
| 744 | +gint |
| 745 | -+gst_amc_codec_dequeue_input_buffer (GstAmcCodec * codec, gint64 timeoutUs) |
| 746 | ++gst_amc_codec_dequeue_input_buffer (GstAmcCodec * codec, gint64 timeoutUs, |
| 747 | ++ GError ** err) |
| 748 | +{ |
| 749 | + gint ret = G_MININT; |
| 750 | + size_t index = 0; |
| 751 | @@ -4594,11 +4591,17 @@ index 0000000..16fdacc |
| 752 | + |
| 753 | + ret = |
| 754 | + media_codec_dequeue_input_buffer (codec->codec_delegate, &index, |
| 755 | -+ timeoutUs); |
| 756 | ++ timeoutUs); |
| 757 | + if (ret < 0) { |
| 758 | + GST_DEBUG ("Failed to dequeue input buffer (ret: %d)", ret); |
| 759 | -+ if (ret == -11) |
| 760 | ++ if (ret == -11) { |
| 761 | + ret = INFO_TRY_AGAIN_LATER; |
| 762 | ++ } |
| 763 | ++ if (ret != INFO_TRY_AGAIN_LATER) { |
| 764 | ++ gst_amc_set_error (GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED, err, |
| 765 | ++ "Failed to dequeue input buffer (ret: %d)", ret); |
| 766 | ++ ret = G_MININT; |
| 767 | ++ } |
| 768 | + goto done; |
| 769 | + } |
| 770 | + ret = index; |
| 771 | @@ -4611,7 +4614,7 @@ index 0000000..16fdacc |
| 772 | + |
| 773 | +gint |
| 774 | +gst_amc_codec_dequeue_output_buffer (GstAmcCodec * codec, |
| 775 | -+ GstAmcBufferInfo * info, gint64 timeoutUs) |
| 776 | ++ GstAmcBufferInfo * info, gint64 timeoutUs, GError ** err) |
| 777 | +{ |
| 778 | + gint ret = G_MININT; |
| 779 | + MediaCodecBufferInfo priv_info; |
| 780 | @@ -4637,6 +4640,10 @@ index 0000000..16fdacc |
| 781 | + } else if (ret == INFO_OUTPUT_BUFFERS_CHANGED) { |
| 782 | + GST_INFO ("Output buffers have changed"); |
| 783 | + goto done; |
| 784 | ++ } else if (ret < 0) { |
| 785 | ++ gst_amc_set_error (GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED, err, |
| 786 | ++ "Failed to dequeue output buffer (ret: %d)", ret); |
| 787 | ++ ret = G_MININT; |
| 788 | + } |
| 789 | + |
| 790 | + info->flags = priv_info.flags; |
| 791 | @@ -4655,10 +4662,10 @@ index 0000000..16fdacc |
| 792 | + |
| 793 | +gboolean |
| 794 | +gst_amc_codec_queue_input_buffer (GstAmcCodec * codec, gint index, |
| 795 | -+ const GstAmcBufferInfo * info) |
| 796 | ++ const GstAmcBufferInfo * info, GError ** err) |
| 797 | +{ |
| 798 | + gboolean ret = TRUE; |
| 799 | -+ gint err = 0; |
| 800 | ++ gint res = 0; |
| 801 | + MediaCodecBufferInfo buf_info; |
| 802 | + |
| 803 | + g_return_val_if_fail (codec != NULL, FALSE); |
| 804 | @@ -4678,9 +4685,10 @@ index 0000000..16fdacc |
| 805 | + buf_info.presentation_time_us); |
| 806 | + GST_DEBUG ("buf_info.flags %d", buf_info.flags); |
| 807 | + |
| 808 | -+ err = media_codec_queue_input_buffer (codec->codec_delegate, &buf_info); |
| 809 | -+ if (err < 0) { |
| 810 | -+ GST_ERROR ("Failed to queue input buffer (err: %d, index: %d)", err, index); |
| 811 | ++ res = media_codec_queue_input_buffer (codec->codec_delegate, &buf_info); |
| 812 | ++ if (res < 0) { |
| 813 | ++ gst_amc_set_error (GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED, err, |
| 814 | ++ "Failed to queue input buffer (res: %d, index: %d)", res, index); |
| 815 | + ret = FALSE; |
| 816 | + goto done; |
| 817 | + } |
| 818 | @@ -4691,20 +4699,20 @@ index 0000000..16fdacc |
| 819 | + |
| 820 | +gboolean |
| 821 | +gst_amc_codec_release_output_buffer (GstAmcCodec * codec, gint index, |
| 822 | -+ gboolean render) |
| 823 | ++ gboolean render, GError ** err) |
| 824 | +{ |
| 825 | + gboolean ret = TRUE; |
| 826 | -+ gint err = 0; |
| 827 | ++ gint res = 0; |
| 828 | + |
| 829 | + g_return_val_if_fail (codec != NULL, FALSE); |
| 830 | + |
| 831 | + GST_DEBUG ("%s", __PRETTY_FUNCTION__); |
| 832 | + |
| 833 | -+ err = |
| 834 | ++ res = |
| 835 | + media_codec_release_output_buffer (codec->codec_delegate, index, render); |
| 836 | -+ if (err < 0) { |
| 837 | -+ GST_ERROR ("Failed to release output buffer (err: %d, index: %d)", err, |
| 838 | -+ index); |
| 839 | ++ if (res < 0) { |
| 840 | ++ gst_amc_set_error (GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED, err, |
| 841 | ++ "Failed to release output buffer (res: %d, index: %d)", res, index); |
| 842 | + ret = FALSE; |
| 843 | + goto done; |
| 844 | + } |
| 845 | @@ -4714,7 +4722,8 @@ index 0000000..16fdacc |
| 846 | +} |
| 847 | + |
| 848 | +GstAmcFormat * |
| 849 | -+gst_amc_format_new_audio (const gchar * mime, gint sample_rate, gint channels) |
| 850 | ++gst_amc_format_new_audio (const gchar * mime, gint sample_rate, gint channels, |
| 851 | ++ GError ** err) |
| 852 | +{ |
| 853 | +#if 0 |
| 854 | + JNIEnv *env; |
| 855 | @@ -4772,7 +4781,7 @@ index 0000000..16fdacc |
| 856 | + |
| 857 | +GstAmcFormat * |
| 858 | +gst_amc_format_new_video (const gchar * mime, gint width, gint height, |
| 859 | -+ gint buffsize) |
| 860 | ++ gint buffsize, GError ** err) |
| 861 | +{ |
| 862 | + GstAmcFormat *format = NULL; |
| 863 | + gchar *mime_str = NULL; |
| 864 | @@ -4782,7 +4791,7 @@ index 0000000..16fdacc |
| 865 | + GST_DEBUG ("%s", __PRETTY_FUNCTION__); |
| 866 | + |
| 867 | + mime_str = g_strdup (mime); |
| 868 | -+ mime_str = locale_to_utf8 (mime_str, strlen (mime_str)); |
| 869 | ++ mime_str = locale_to_utf8 (mime_str, strlen (mime_str), err); |
| 870 | + if (mime_str == NULL) |
| 871 | + goto error; |
| 872 | + |
| 873 | @@ -4791,7 +4800,8 @@ index 0000000..16fdacc |
| 874 | + format->format = |
| 875 | + media_format_create_video_format (mime_str, width, height, 0, buffsize); |
| 876 | + if (format->format == NULL) { |
| 877 | -+ GST_ERROR ("Failed to create format '%s'", mime); |
| 878 | ++ gst_amc_set_error (GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED, err, |
| 879 | ++ "Failed to create format '%s'", mime); |
| 880 | + goto error; |
| 881 | + } |
| 882 | + |
| 883 | @@ -4821,67 +4831,70 @@ index 0000000..16fdacc |
| 884 | +} |
| 885 | + |
| 886 | +gchar * |
| 887 | -+gst_amc_format_to_string (GstAmcFormat * format) |
| 888 | ++gst_amc_format_to_string (GstAmcFormat * format, GError ** err) |
| 889 | +{ |
| 890 | + return NULL; |
| 891 | +} |
| 892 | + |
| 893 | +gboolean |
| 894 | -+gst_amc_format_contains_key (GstAmcFormat * format, const gchar * key) |
| 895 | ++gst_amc_format_contains_key (GstAmcFormat * format, const gchar * key, |
| 896 | ++ GError ** err) |
| 897 | +{ |
| 898 | + return FALSE; |
| 899 | +} |
| 900 | + |
| 901 | +gboolean |
| 902 | +gst_amc_format_get_float (GstAmcFormat * format, const gchar * key, |
| 903 | -+ gfloat * value) |
| 904 | ++ gfloat * value, GError ** err) |
| 905 | +{ |
| 906 | + return FALSE; |
| 907 | +} |
| 908 | + |
| 909 | +gboolean |
| 910 | +gst_amc_format_set_float (GstAmcFormat * format, const gchar * key, |
| 911 | -+ gfloat value) |
| 912 | ++ gfloat value, GError ** err) |
| 913 | +{ |
| 914 | + return FALSE; |
| 915 | +} |
| 916 | + |
| 917 | +gboolean |
| 918 | -+gst_amc_format_get_int (GstAmcFormat * format, const gchar * key, gint * value) |
| 919 | ++gst_amc_format_get_int (GstAmcFormat * format, const gchar * key, gint * value, |
| 920 | ++ GError ** err) |
| 921 | +{ |
| 922 | + return FALSE; |
| 923 | +} |
| 924 | + |
| 925 | +gboolean |
| 926 | -+gst_amc_format_set_int (GstAmcFormat * format, const gchar * key, gint value) |
| 927 | ++gst_amc_format_set_int (GstAmcFormat * format, const gchar * key, gint value, |
| 928 | ++ GError ** err) |
| 929 | +{ |
| 930 | + return FALSE; |
| 931 | +} |
| 932 | + |
| 933 | +gboolean |
| 934 | +gst_amc_format_get_string (GstAmcFormat * format, const gchar * key, |
| 935 | -+ gchar ** value) |
| 936 | ++ gchar ** value, GError ** err) |
| 937 | +{ |
| 938 | + return FALSE; |
| 939 | +} |
| 940 | + |
| 941 | +gboolean |
| 942 | +gst_amc_format_set_string (GstAmcFormat * format, const gchar * key, |
| 943 | -+ const gchar * value) |
| 944 | ++ const gchar * value, GError ** err) |
| 945 | +{ |
| 946 | + return FALSE; |
| 947 | +} |
| 948 | + |
| 949 | +gboolean |
| 950 | +gst_amc_format_get_buffer (GstAmcFormat * format, const gchar * key, |
| 951 | -+ guint8 ** data, gsize * size) |
| 952 | ++ guint8 ** data, gsize * size, GError ** err) |
| 953 | +{ |
| 954 | + return FALSE; |
| 955 | +} |
| 956 | + |
| 957 | +gboolean |
| 958 | +gst_amc_format_set_buffer (GstAmcFormat * format, const gchar * key, |
| 959 | -+ guint8 * data, gsize size) |
| 960 | ++ guint8 * data, gsize size, GError ** err) |
| 961 | +{ |
| 962 | + gchar *key_str = NULL; |
| 963 | + gboolean ret = FALSE; |
| 964 | @@ -4893,7 +4906,7 @@ index 0000000..16fdacc |
| 965 | + GST_DEBUG ("%s", __PRETTY_FUNCTION__); |
| 966 | + |
| 967 | + key_str = g_strdup (key); |
| 968 | -+ key_str = locale_to_utf8 (key_str, strlen (key)); |
| 969 | ++ key_str = locale_to_utf8 (key_str, strlen (key), err); |
| 970 | + if (!key_str) |
| 971 | + goto done; |
| 972 | + |
| 973 | @@ -5121,7 +5134,7 @@ index 0000000..16fdacc |
| 974 | + } |
| 975 | + |
| 976 | + mime = g_malloc (len); |
| 977 | -+ mime = locale_to_utf8 (supported_type_str, len); |
| 978 | ++ mime = locale_to_utf8 (supported_type_str, len, NULL); |
| 979 | + if (!mime) { |
| 980 | + GST_ERROR ("Failed to convert supported type to UTF8"); |
| 981 | + valid_codec = FALSE; |
| 982 | @@ -6134,10 +6147,10 @@ index c6c2b4f..53fdb27 100644 |
| 983 | struct _GstAmcVideoDecClass |
| 984 | diff --git a/sys/androidmedia/gstamcvideodechybris.c b/sys/androidmedia/gstamcvideodechybris.c |
| 985 | new file mode 100644 |
| 986 | -index 0000000..49a0203 |
| 987 | +index 0000000..cff94c4 |
| 988 | --- /dev/null |
| 989 | +++ b/sys/androidmedia/gstamcvideodechybris.c |
| 990 | -@@ -0,0 +1,2327 @@ |
| 991 | +@@ -0,0 +1,2399 @@ |
| 992 | +/* |
| 993 | + * Initially based on gstamcvideodec.c |
| 994 | + * |
| 995 | @@ -6192,6 +6205,16 @@ index 0000000..49a0203 |
| 996 | +GST_DEBUG_CATEGORY_STATIC (gst_amc_video_dec_debug_category); |
| 997 | +#define GST_CAT_DEFAULT gst_amc_video_dec_debug_category |
| 998 | + |
| 999 | ++#define GST_VIDEO_DECODER_ERROR_FROM_ERROR(el, err) G_STMT_START { \ |
| 1000 | ++ gchar *__dbg = g_strdup (err->message); \ |
| 1001 | ++ GstVideoDecoder *__dec = GST_VIDEO_DECODER (el); \ |
| 1002 | ++ GST_WARNING_OBJECT (el, "error: %s", __dbg); \ |
| 1003 | ++ _gst_video_decoder_error (__dec, 1, \ |
| 1004 | ++ err->domain, err->code, \ |
| 1005 | ++ NULL, __dbg, __FILE__, GST_FUNCTION, __LINE__); \ |
| 1006 | ++ g_clear_error (&err); \ |
| 1007 | ++} G_STMT_END |
| 1008 | ++ |
| 1009 | +#define WAIT_FOR_SRC_CAPS_MS 100 |
| 1010 | +#define DEC_ALIGNMENT_BYTES 4096 |
| 1011 | + |
| 1012 | @@ -6651,12 +6674,13 @@ index 0000000..49a0203 |
| 1013 | +{ |
| 1014 | + GstAmcVideoDec *self = GST_AMC_VIDEO_DEC (decoder); |
| 1015 | + GstAmcVideoDecClass *klass = GST_AMC_VIDEO_DEC_GET_CLASS (self); |
| 1016 | ++ GError *err = NULL; |
| 1017 | + |
| 1018 | + GST_DEBUG_OBJECT (self, "Opening hardware decoder"); |
| 1019 | + |
| 1020 | -+ self->codec = gst_amc_codec_new (klass->codec_info->name); |
| 1021 | ++ self->codec = gst_amc_codec_new (klass->codec_info->name, &err); |
| 1022 | + if (!self->codec) { |
| 1023 | -+ GST_WARNING_OBJECT (self, "Failed to get valid hardware decoder"); |
| 1024 | ++ GST_ELEMENT_ERROR_FROM_ERROR (self, err); |
| 1025 | + return FALSE; |
| 1026 | + } |
| 1027 | + self->started = FALSE; |
| 1028 | @@ -6705,6 +6729,7 @@ index 0000000..49a0203 |
| 1029 | +{ |
| 1030 | + GstAmcVideoDec *self; |
| 1031 | + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; |
| 1032 | ++ GError *err = NULL; |
| 1033 | + |
| 1034 | + g_return_val_if_fail (GST_IS_AMC_VIDEO_DEC (element), |
| 1035 | + GST_STATE_CHANGE_FAILURE); |
| 1036 | @@ -6723,7 +6748,9 @@ index 0000000..49a0203 |
| 1037 | + case GST_STATE_CHANGE_PAUSED_TO_READY: |
| 1038 | + GST_VIDEO_DECODER_STREAM_LOCK(self); |
| 1039 | + self->flushing = TRUE; |
| 1040 | -+ gst_amc_codec_flush (self->codec); |
| 1041 | ++ gst_amc_codec_flush (self->codec, &err); |
| 1042 | ++ if (err) |
| 1043 | ++ GST_ELEMENT_WARNING_FROM_ERROR (self, err); |
| 1044 | + GST_VIDEO_DECODER_STREAM_UNLOCK(self); |
| 1045 | + |
| 1046 | + g_mutex_lock (&self->drain_lock); |
| 1047 | @@ -7445,6 +7472,7 @@ index 0000000..49a0203 |
| 1048 | + SurfaceTextureClientHybris surface_texture_client = NULL; |
| 1049 | + guint8 i = 0; |
| 1050 | + const guint8 MAX_TRIES = 3; |
| 1051 | ++ GError *err = NULL; |
| 1052 | + |
| 1053 | + GST_DEBUG_OBJECT (self, "%s", __PRETTY_FUNCTION__); |
| 1054 | + |
| 1055 | @@ -7475,13 +7503,16 @@ index 0000000..49a0203 |
| 1056 | + GST_INFO_OBJECT (self, "surface_texture_client: %p", surface_texture_client); |
| 1057 | + |
| 1058 | + /* Configure the hardware decoder */ |
| 1059 | -+ if (!gst_amc_codec_configure (self->codec, format, surface_texture_client, 0)) { |
| 1060 | ++ if (!gst_amc_codec_configure (self->codec, format, |
| 1061 | ++ surface_texture_client, 0, &err)) { |
| 1062 | + GST_ERROR_OBJECT (self, "Failed to configure codec"); |
| 1063 | ++ GST_ELEMENT_ERROR_FROM_ERROR (self, err); |
| 1064 | + return FALSE; |
| 1065 | + } |
| 1066 | + |
| 1067 | -+ if (!gst_amc_codec_start (self->codec)) { |
| 1068 | ++ if (!gst_amc_codec_start (self->codec, &err)) { |
| 1069 | + GST_ERROR_OBJECT (self, "Failed to start codec"); |
| 1070 | ++ GST_ELEMENT_ERROR_FROM_ERROR (self, err); |
| 1071 | + return FALSE; |
| 1072 | + } |
| 1073 | + |
| 1074 | @@ -7516,6 +7547,7 @@ index 0000000..49a0203 |
| 1075 | + GstAmcBufferInfo buffer_info; |
| 1076 | + gint idx; |
| 1077 | + GstVideoDecoder *decoder = GST_VIDEO_DECODER (self); |
| 1078 | ++ GError *err = NULL; |
| 1079 | + |
| 1080 | + GST_VIDEO_DECODER_STREAM_LOCK (self); |
| 1081 | + |
| 1082 | @@ -7530,14 +7562,16 @@ index 0000000..49a0203 |
| 1083 | + * the codec is flushing, causing deadlocks during shutdown */ |
| 1084 | + idx = |
| 1085 | + gst_amc_codec_dequeue_output_buffer (self->codec, &buffer_info, |
| 1086 | -+ self->current_timeout); |
| 1087 | ++ self->current_timeout, &err); |
| 1088 | + GST_PAD_STREAM_LOCK (GST_VIDEO_DECODER_SRC_PAD (decoder)); |
| 1089 | + GST_VIDEO_DECODER_STREAM_LOCK (self); |
| 1090 | + |
| 1091 | + GST_DEBUG_OBJECT (self, "Tried to dequeue output buffer (idx: %d)", idx); |
| 1092 | + if (idx < 0) { |
| 1093 | -+ if (self->flushing || self->downstream_flow_ret == GST_FLOW_FLUSHING) |
| 1094 | ++ if (self->flushing || self->downstream_flow_ret == GST_FLOW_FLUSHING) { |
| 1095 | ++ g_clear_error (&err); |
| 1096 | + goto flushing; |
| 1097 | ++ } |
| 1098 | + |
| 1099 | + switch (idx) { |
| 1100 | + case INFO_OUTPUT_BUFFERS_CHANGED:{ |
| 1101 | @@ -7564,7 +7598,7 @@ index 0000000..49a0203 |
| 1102 | + |
| 1103 | + GST_INFO_OBJECT (self, "Output format has changed"); |
| 1104 | + |
| 1105 | -+ format = gst_amc_codec_get_output_format (self->codec); |
| 1106 | ++ format = gst_amc_codec_get_output_format (self->codec, &err); |
| 1107 | + if (!format) |
| 1108 | + goto format_error; |
| 1109 | + |
| 1110 | @@ -7640,8 +7674,13 @@ index 0000000..49a0203 |
| 1111 | + GST_TIME_ARGS (-deadline)); |
| 1112 | + flow_ret = gst_video_decoder_drop_frame (GST_VIDEO_DECODER (self), frame); |
| 1113 | + |
| 1114 | -+ if (!gst_amc_codec_release_output_buffer (self->codec, idx, FALSE)) |
| 1115 | ++ if (!gst_amc_codec_release_output_buffer (self->codec, idx, FALSE, &err)) { |
| 1116 | + GST_ERROR_OBJECT (self, "Failed to release output buffer index %d", idx); |
| 1117 | ++ if (err && !self->flushing) |
| 1118 | ++ GST_ELEMENT_WARNING_FROM_ERROR (self, err); |
| 1119 | ++ g_clear_error (&err); |
| 1120 | ++ } |
| 1121 | ++ |
| 1122 | + } else if (!frame && buffer_info.size > 0) { |
| 1123 | + GstBuffer *outbuf; |
| 1124 | + |
| 1125 | @@ -7656,9 +7695,13 @@ index 0000000..49a0203 |
| 1126 | + |
| 1127 | + if (!gst_amc_video_dec_fill_buffer (self, idx, &buffer_info, outbuf)) { |
| 1128 | + gst_buffer_unref (outbuf); |
| 1129 | -+ if (!gst_amc_codec_release_output_buffer (self->codec, idx, FALSE)) |
| 1130 | ++ if (!gst_amc_codec_release_output_buffer (self->codec, idx, FALSE, &err)) { |
| 1131 | + GST_ERROR_OBJECT (self, "Failed to release output buffer index %d", |
| 1132 | + idx); |
| 1133 | ++ if (err && !self->flushing) |
| 1134 | ++ GST_ELEMENT_WARNING_FROM_ERROR (self, err); |
| 1135 | ++ g_clear_error (&err); |
| 1136 | ++ } |
| 1137 | + goto invalid_buffer; |
| 1138 | + } |
| 1139 | + |
| 1140 | @@ -7682,9 +7725,13 @@ index 0000000..49a0203 |
| 1141 | + GST_ERROR_OBJECT (self, "Cannot fill output buffer index %d", idx); |
| 1142 | + gst_buffer_replace (&frame->output_buffer, NULL); |
| 1143 | + gst_video_decoder_drop_frame (GST_VIDEO_DECODER (self), frame); |
| 1144 | -+ if (!gst_amc_codec_release_output_buffer (self->codec, idx, FALSE)) |
| 1145 | ++ if (!gst_amc_codec_release_output_buffer (self->codec, idx, FALSE, &err)) { |
| 1146 | + GST_ERROR_OBJECT (self, "Failed to release output buffer index %d", |
| 1147 | + idx); |
| 1148 | ++ if (err && !self->flushing) |
| 1149 | ++ GST_ELEMENT_WARNING_FROM_ERROR (self, err); |
| 1150 | ++ g_clear_error (&err); |
| 1151 | ++ } |
| 1152 | + goto invalid_buffer; |
| 1153 | + } |
| 1154 | + |
| 1155 | @@ -7694,8 +7741,12 @@ index 0000000..49a0203 |
| 1156 | + GST_ERROR_OBJECT (self, "Dropping frame"); |
| 1157 | + flow_ret = gst_video_decoder_drop_frame (GST_VIDEO_DECODER (self), frame); |
| 1158 | + |
| 1159 | -+ if (!gst_amc_codec_release_output_buffer (self->codec, idx, FALSE)) |
| 1160 | ++ if (!gst_amc_codec_release_output_buffer (self->codec, idx, FALSE, &err)) { |
| 1161 | + GST_ERROR_OBJECT (self, "Failed to release output buffer index %d", idx); |
| 1162 | ++ if (err && !self->flushing) |
| 1163 | ++ GST_ELEMENT_WARNING_FROM_ERROR (self, err); |
| 1164 | ++ g_clear_error (&err); |
| 1165 | ++ } |
| 1166 | + } else { |
| 1167 | + GST_ERROR_OBJECT (self, "Unexpected condition output buffer index %d", idx); |
| 1168 | + } |
| 1169 | @@ -7730,6 +7781,7 @@ index 0000000..49a0203 |
| 1170 | + |
| 1171 | +dequeue_error: |
| 1172 | + { |
| 1173 | ++ GST_ELEMENT_ERROR_FROM_ERROR (self, err); |
| 1174 | + GST_ERROR_OBJECT (self, "dec_loop, dequeue_error"); |
| 1175 | + GST_ELEMENT_ERROR (self, LIBRARY, FAILED, (NULL), |
| 1176 | + ("Failed to dequeue output buffer")); |
| 1177 | @@ -7752,9 +7804,11 @@ index 0000000..49a0203 |
| 1178 | + } |
| 1179 | +format_error: |
| 1180 | + { |
| 1181 | -+ GST_ERROR_OBJECT (self, "dec_loop, format_error"); |
| 1182 | -+ GST_ELEMENT_ERROR (self, LIBRARY, FAILED, (NULL), |
| 1183 | -+ ("Failed to handle format")); |
| 1184 | ++ if (err) |
| 1185 | ++ GST_ELEMENT_ERROR_FROM_ERROR (self, err); |
| 1186 | ++ else |
| 1187 | ++ GST_ELEMENT_ERROR (self, LIBRARY, FAILED, (NULL), |
| 1188 | ++ ("Failed to handle format")); |
| 1189 | + gst_pad_push_event (GST_VIDEO_DECODER_SRC_PAD (self), gst_event_new_eos ()); |
| 1190 | + gst_pad_pause_task (GST_VIDEO_DECODER_SRC_PAD (self)); |
| 1191 | + self->downstream_flow_ret = GST_FLOW_ERROR; |
| 1192 | @@ -7830,13 +7884,18 @@ index 0000000..49a0203 |
| 1193 | +gst_amc_video_dec_stop (GstVideoDecoder * decoder) |
| 1194 | +{ |
| 1195 | + GstAmcVideoDec *self; |
| 1196 | ++ GError *err = NULL; |
| 1197 | + |
| 1198 | + self = GST_AMC_VIDEO_DEC (decoder); |
| 1199 | + GST_DEBUG_OBJECT (self, "Stopping decoder"); |
| 1200 | + self->flushing = TRUE; |
| 1201 | + if (self->started) { |
| 1202 | -+ gst_amc_codec_flush (self->codec); |
| 1203 | -+ gst_amc_codec_stop (self->codec); |
| 1204 | ++ gst_amc_codec_flush (self->codec, &err); |
| 1205 | ++ if (err) |
| 1206 | ++ GST_ELEMENT_WARNING_FROM_ERROR (self, err); |
| 1207 | ++ gst_amc_codec_stop (self->codec, &err); |
| 1208 | ++ if (err) |
| 1209 | ++ GST_ELEMENT_WARNING_FROM_ERROR (self, err); |
| 1210 | + self->started = FALSE; |
| 1211 | + if (self->input_buffers) |
| 1212 | + gst_amc_codec_free_buffers (self->input_buffers, self->n_input_buffers); |
| 1213 | @@ -7877,6 +7936,7 @@ index 0000000..49a0203 |
| 1214 | + guint8 *codec_data = NULL; |
| 1215 | + gsize codec_data_size = 0; |
| 1216 | + int buffsize; |
| 1217 | ++ GError *err = NULL; |
| 1218 | + |
| 1219 | + self = GST_AMC_VIDEO_DEC (decoder); |
| 1220 | + |
| 1221 | @@ -7964,16 +8024,20 @@ index 0000000..49a0203 |
| 1222 | + state->info.width, state->info.height, buffsize); |
| 1223 | + format = |
| 1224 | + gst_amc_format_new_video (mime, state->info.width, state->info.height, |
| 1225 | -+ buffsize); |
| 1226 | ++ buffsize, &err); |
| 1227 | + if (!format) { |
| 1228 | + GST_ERROR_OBJECT (self, "Failed to create video format"); |
| 1229 | ++ GST_ELEMENT_ERROR_FROM_ERROR (self, err); |
| 1230 | + return FALSE; |
| 1231 | + } |
| 1232 | + |
| 1233 | + /* FIXME: This buffer needs to be valid until the codec is stopped again */ |
| 1234 | -+ if (self->codec_data) |
| 1235 | ++ if (self->codec_data) { |
| 1236 | + gst_amc_format_set_buffer (format, "csd-0", self->codec_data, |
| 1237 | -+ self->codec_data_size); |
| 1238 | ++ self->codec_data_size, &err); |
| 1239 | ++ if (err) |
| 1240 | ++ GST_ELEMENT_WARNING_FROM_ERROR (self, err); |
| 1241 | ++ } |
| 1242 | + |
| 1243 | + /* Configure the hardware codec with format */ |
| 1244 | + ret = gst_amc_video_dec_configure_self (decoder, format); |
| 1245 | @@ -8009,6 +8073,7 @@ index 0000000..49a0203 |
| 1246 | +gst_amc_video_dec_flush (GstVideoDecoder * decoder) |
| 1247 | +{ |
| 1248 | + GstAmcVideoDec *self; |
| 1249 | ++ GError *err = NULL; |
| 1250 | + |
| 1251 | + self = GST_AMC_VIDEO_DEC (decoder); |
| 1252 | + |
| 1253 | @@ -8020,7 +8085,9 @@ index 0000000..49a0203 |
| 1254 | + } |
| 1255 | + |
| 1256 | + self->flushing = TRUE; |
| 1257 | -+ gst_amc_codec_flush (self->codec); |
| 1258 | ++ gst_amc_codec_flush (self->codec, &err); |
| 1259 | ++ if (err) |
| 1260 | ++ GST_ELEMENT_WARNING_FROM_ERROR (self, err); |
| 1261 | + |
| 1262 | + /* Wait until the srcpad loop is finished, |
| 1263 | + * unlock GST_VIDEO_DECODER_STREAM_LOCK to prevent deadlocks |
| 1264 | @@ -8096,6 +8163,7 @@ index 0000000..49a0203 |
| 1265 | + GstClockTime timestamp, duration, timestamp_offset = 0; |
| 1266 | + GstMapInfo minfo; |
| 1267 | + gboolean first_buff = TRUE; |
| 1268 | ++ GError *err = NULL; |
| 1269 | + |
| 1270 | + memset (&minfo, 0, sizeof (minfo)); |
| 1271 | + |
| 1272 | @@ -8142,14 +8210,16 @@ index 0000000..49a0203 |
| 1273 | + /* Wait at most 100ms here, some codecs don't fail dequeueing if |
| 1274 | + * the codec is flushing, causing deadlocks during shutdown */ |
| 1275 | + idx = |
| 1276 | -+ gst_amc_codec_dequeue_input_buffer (self->codec, wait_buff_us); |
| 1277 | ++ gst_amc_codec_dequeue_input_buffer (self->codec, wait_buff_us, &err); |
| 1278 | + GST_PAD_STREAM_LOCK (GST_VIDEO_DECODER_SINK_PAD (decoder)); |
| 1279 | + GST_VIDEO_DECODER_STREAM_LOCK (self); |
| 1280 | + |
| 1281 | + GST_DEBUG_OBJECT (self, "Tried to dequeue input buffer idx: %d", idx); |
| 1282 | + if (idx < 0) { |
| 1283 | -+ if (self->flushing) |
| 1284 | ++ if (self->flushing) { |
| 1285 | ++ g_clear_error (&err); |
| 1286 | + goto flushing; |
| 1287 | ++ } |
| 1288 | + switch (idx) { |
| 1289 | + case INFO_TRY_AGAIN_LATER: |
| 1290 | + GST_DEBUG_OBJECT (self, "Dequeueing input buffer timed out"); |
| 1291 | @@ -8195,7 +8265,10 @@ index 0000000..49a0203 |
| 1292 | + |
| 1293 | + if (self->downstream_flow_ret != GST_FLOW_OK) { |
| 1294 | + memset (&buffer_info, 0, sizeof (buffer_info)); |
| 1295 | -+ gst_amc_codec_queue_input_buffer (self->codec, idx, &buffer_info); |
| 1296 | ++ gst_amc_codec_queue_input_buffer (self->codec, idx, &buffer_info, &err); |
| 1297 | ++ if (err && !self->flushing) |
| 1298 | ++ GST_ELEMENT_WARNING_FROM_ERROR (self, err); |
| 1299 | ++ g_clear_error (&err); |
| 1300 | + goto downstream_error; |
| 1301 | + } |
| 1302 | + |
| 1303 | @@ -8239,8 +8312,14 @@ index 0000000..49a0203 |
| 1304 | + "Queueing buffer %d: size %d time %" G_GINT64_FORMAT " flags 0x%08x", |
| 1305 | + idx, buffer_info.size, buffer_info.presentation_time_us, |
| 1306 | + buffer_info.flags); |
| 1307 | -+ if (!gst_amc_codec_queue_input_buffer (self->codec, idx, &buffer_info)) |
| 1308 | ++ if (!gst_amc_codec_queue_input_buffer (self->codec, idx, &buffer_info, |
| 1309 | ++ &err)) { |
| 1310 | ++ if (self->flushing) { |
| 1311 | ++ g_clear_error (&err); |
| 1312 | ++ goto flushing; |
| 1313 | ++ } |
| 1314 | + goto queue_error; |
| 1315 | ++ } |
| 1316 | + |
| 1317 | + first_buff = FALSE; |
| 1318 | + } |
| 1319 | @@ -8280,9 +8359,7 @@ index 0000000..49a0203 |
| 1320 | + } |
| 1321 | +dequeue_error: |
| 1322 | + { |
| 1323 | -+ GST_ERROR_OBJECT (self, "handle_frame, dequeue_error"); |
| 1324 | -+ GST_ELEMENT_ERROR (self, LIBRARY, FAILED, (NULL), |
| 1325 | -+ ("Failed to dequeue input buffer")); |
| 1326 | ++ GST_ELEMENT_ERROR_FROM_ERROR (self, err); |
| 1327 | + if (minfo.data) |
| 1328 | + gst_buffer_unmap (frame->input_buffer, &minfo); |
| 1329 | + gst_video_codec_frame_unref (frame); |
| 1330 | @@ -8290,9 +8367,7 @@ index 0000000..49a0203 |
| 1331 | + } |
| 1332 | +queue_error: |
| 1333 | + { |
| 1334 | -+ GST_ERROR_OBJECT (self, "handle_frame, queue_error"); |
| 1335 | -+ GST_ELEMENT_ERROR (self, LIBRARY, FAILED, (NULL), |
| 1336 | -+ ("Failed to queue input buffer")); |
| 1337 | ++ GST_VIDEO_DECODER_ERROR_FROM_ERROR (self, err); |
| 1338 | + if (minfo.data) |
| 1339 | + gst_buffer_unmap (frame->input_buffer, &minfo); |
| 1340 | + gst_video_codec_frame_unref (frame); |
| 1341 | @@ -8323,6 +8398,7 @@ index 0000000..49a0203 |
| 1342 | +{ |
| 1343 | + GstFlowReturn ret; |
| 1344 | + gint idx; |
| 1345 | ++ GError *err = NULL; |
| 1346 | + |
| 1347 | + GST_DEBUG_OBJECT (self, "Draining codec"); |
| 1348 | + if (!self->started) { |
| 1349 | @@ -8346,7 +8422,8 @@ index 0000000..49a0203 |
| 1350 | + * class drop the EOS event. We will send it later when |
| 1351 | + * the EOS buffer arrives on the output port. |
| 1352 | + * Wait at most 0.5s here. */ |
| 1353 | -+ idx = gst_amc_codec_dequeue_input_buffer (self->codec, self->current_timeout); |
| 1354 | ++ idx = gst_amc_codec_dequeue_input_buffer (self->codec, self->current_timeout, |
| 1355 | ++ &err); |
| 1356 | + GST_DEBUG_OBJECT (self, "dequeued input buffer with idx: %d", idx); |
| 1357 | + GST_VIDEO_DECODER_STREAM_LOCK (self); |
| 1358 | + |
| 1359 | @@ -8363,13 +8440,14 @@ index 0000000..49a0203 |
| 1360 | + gst_util_uint64_scale (self->last_upstream_ts, 1, GST_USECOND); |
| 1361 | + buffer_info.flags |= BUFFER_FLAG_END_OF_STREAM; |
| 1362 | + |
| 1363 | -+ if (gst_amc_codec_queue_input_buffer (self->codec, idx, &buffer_info)) { |
| 1364 | ++ if (gst_amc_codec_queue_input_buffer (self->codec, idx, &buffer_info, &err)) { |
| 1365 | + GST_DEBUG_OBJECT (self, "Waiting until codec is drained"); |
| 1366 | + g_cond_wait (&self->drain_cond, &self->drain_lock); |
| 1367 | + GST_DEBUG_OBJECT (self, "Drained codec"); |
| 1368 | + ret = GST_FLOW_OK; |
| 1369 | + } else { |
| 1370 | + GST_ERROR_OBJECT (self, "Failed to queue input buffer"); |
| 1371 | ++ GST_ELEMENT_WARNING_FROM_ERROR (self, err); |
| 1372 | + ret = GST_FLOW_ERROR; |
| 1373 | + } |
| 1374 | + |
| 1375 | @@ -8381,6 +8459,8 @@ index 0000000..49a0203 |
| 1376 | + ret = GST_FLOW_ERROR; |
| 1377 | + } else { |
| 1378 | + GST_ERROR_OBJECT (self, "Failed to acquire buffer for EOS: %d", idx); |
| 1379 | ++ if (err) |
| 1380 | ++ GST_ELEMENT_WARNING_FROM_ERROR (self, err); |
| 1381 | + ret = GST_FLOW_ERROR; |
| 1382 | + } |
| 1383 | + |
| 1384 | @@ -8395,6 +8475,11 @@ index 0000000..49a0203 |
| 1385 | + |
| 1386 | + GST_DEBUG_OBJECT (element, "%s", __PRETTY_FUNCTION__); |
| 1387 | + |
| 1388 | ++ if (self->codec == NULL) { |
| 1389 | ++ GST_WARNING_OBJECT (self, "codec not set yet"); |
| 1390 | ++ return; |
| 1391 | ++ } |
| 1392 | ++ |
| 1393 | + stc = gst_context_get_surface_texture_client (context); |
| 1394 | + if (!stc) |
| 1395 | + GST_ERROR_OBJECT (self, |


See 14 inline comments below for some minor changes.