mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-08 23:42:28 +00:00
amc: Correctly handle NULL input buffers
https://bugzilla.gnome.org/show_bug.cgi?id=763401
This commit is contained in:
parent
9132b72c32
commit
610705cbb4
4 changed files with 50 additions and 16 deletions
|
@ -453,6 +453,7 @@ gst_amc_codec_get_input_buffer (GstAmcCodec * codec, gint index, GError ** err)
|
||||||
media_codec.get_input_buffer, &buffer, index))
|
media_codec.get_input_buffer, &buffer, index))
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
|
if (buffer != NULL) {
|
||||||
ret = g_new0 (GstAmcBuffer, 1);
|
ret = g_new0 (GstAmcBuffer, 1);
|
||||||
ret->object = gst_amc_jni_object_make_global (env, buffer);
|
ret->object = gst_amc_jni_object_make_global (env, buffer);
|
||||||
if (!ret->object) {
|
if (!ret->object) {
|
||||||
|
@ -468,6 +469,7 @@ gst_amc_codec_get_input_buffer (GstAmcCodec * codec, gint index, GError ** err)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
ret->size = (*env)->GetDirectBufferCapacity (env, ret->object);
|
ret->size = (*env)->GetDirectBufferCapacity (env, ret->object);
|
||||||
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
|
||||||
|
|
|
@ -1128,8 +1128,10 @@ gst_amc_audio_dec_handle_frame (GstAudioDecoder * decoder, GstBuffer * inbuf)
|
||||||
/* Copy the buffer content in chunks of size as requested
|
/* Copy the buffer content in chunks of size as requested
|
||||||
* by the port */
|
* by the port */
|
||||||
buf = gst_amc_codec_get_input_buffer (self->codec, idx, &err);
|
buf = gst_amc_codec_get_input_buffer (self->codec, idx, &err);
|
||||||
if (!buf)
|
if (err)
|
||||||
goto failed_to_get_input_buffer;
|
goto failed_to_get_input_buffer;
|
||||||
|
else if (!buf)
|
||||||
|
goto got_null_input_buffer;
|
||||||
|
|
||||||
memset (&buffer_info, 0, sizeof (buffer_info));
|
memset (&buffer_info, 0, sizeof (buffer_info));
|
||||||
buffer_info.offset = 0;
|
buffer_info.offset = 0;
|
||||||
|
@ -1200,6 +1202,16 @@ failed_to_get_input_buffer:
|
||||||
gst_buffer_unref (inbuf);
|
gst_buffer_unref (inbuf);
|
||||||
return GST_FLOW_ERROR;
|
return GST_FLOW_ERROR;
|
||||||
}
|
}
|
||||||
|
got_null_input_buffer:
|
||||||
|
{
|
||||||
|
GST_ELEMENT_ERROR (self, LIBRARY, SETTINGS, (NULL),
|
||||||
|
("Got no input buffer"));
|
||||||
|
if (minfo.data)
|
||||||
|
gst_buffer_unmap (inbuf, &minfo);
|
||||||
|
if (inbuf)
|
||||||
|
gst_buffer_unref (inbuf);
|
||||||
|
return GST_FLOW_ERROR;
|
||||||
|
}
|
||||||
dequeue_error:
|
dequeue_error:
|
||||||
{
|
{
|
||||||
GST_ELEMENT_ERROR_FROM_ERROR (self, err);
|
GST_ELEMENT_ERROR_FROM_ERROR (self, err);
|
||||||
|
|
|
@ -2193,8 +2193,10 @@ gst_amc_video_dec_handle_frame (GstVideoDecoder * decoder,
|
||||||
/* Copy the buffer content in chunks of size as requested
|
/* Copy the buffer content in chunks of size as requested
|
||||||
* by the port */
|
* by the port */
|
||||||
buf = gst_amc_codec_get_input_buffer (self->codec, idx, &err);
|
buf = gst_amc_codec_get_input_buffer (self->codec, idx, &err);
|
||||||
if (!buf)
|
if (err)
|
||||||
goto failed_to_get_input_buffer;
|
goto failed_to_get_input_buffer;
|
||||||
|
else if (!buf)
|
||||||
|
goto got_null_input_buffer;
|
||||||
|
|
||||||
memset (&buffer_info, 0, sizeof (buffer_info));
|
memset (&buffer_info, 0, sizeof (buffer_info));
|
||||||
buffer_info.offset = 0;
|
buffer_info.offset = 0;
|
||||||
|
@ -2268,6 +2270,15 @@ failed_to_get_input_buffer:
|
||||||
gst_video_codec_frame_unref (frame);
|
gst_video_codec_frame_unref (frame);
|
||||||
return GST_FLOW_ERROR;
|
return GST_FLOW_ERROR;
|
||||||
}
|
}
|
||||||
|
got_null_input_buffer:
|
||||||
|
{
|
||||||
|
GST_ELEMENT_ERROR (self, LIBRARY, SETTINGS, (NULL),
|
||||||
|
("Got no input buffer"));
|
||||||
|
if (minfo.data)
|
||||||
|
gst_buffer_unmap (frame->input_buffer, &minfo);
|
||||||
|
gst_video_codec_frame_unref (frame);
|
||||||
|
return GST_FLOW_ERROR;
|
||||||
|
}
|
||||||
dequeue_error:
|
dequeue_error:
|
||||||
{
|
{
|
||||||
GST_ELEMENT_ERROR_FROM_ERROR (self, err);
|
GST_ELEMENT_ERROR_FROM_ERROR (self, err);
|
||||||
|
|
|
@ -1469,8 +1469,10 @@ again:
|
||||||
/* Copy the buffer content in chunks of size as requested
|
/* Copy the buffer content in chunks of size as requested
|
||||||
* by the port */
|
* by the port */
|
||||||
buf = gst_amc_codec_get_input_buffer (self->codec, idx, &err);
|
buf = gst_amc_codec_get_input_buffer (self->codec, idx, &err);
|
||||||
if (!buf)
|
if (err)
|
||||||
goto failed_to_get_input_buffer;
|
goto failed_to_get_input_buffer;
|
||||||
|
else if (!buf)
|
||||||
|
goto got_null_input_buffer;
|
||||||
|
|
||||||
memset (&buffer_info, 0, sizeof (buffer_info));
|
memset (&buffer_info, 0, sizeof (buffer_info));
|
||||||
buffer_info.offset = 0;
|
buffer_info.offset = 0;
|
||||||
|
@ -1539,6 +1541,13 @@ failed_to_get_input_buffer:
|
||||||
gst_video_codec_frame_unref (frame);
|
gst_video_codec_frame_unref (frame);
|
||||||
return GST_FLOW_ERROR;
|
return GST_FLOW_ERROR;
|
||||||
}
|
}
|
||||||
|
got_null_input_buffer:
|
||||||
|
{
|
||||||
|
GST_ELEMENT_ERROR (self, LIBRARY, SETTINGS, (NULL),
|
||||||
|
("Got no input buffer"));
|
||||||
|
gst_video_codec_frame_unref (frame);
|
||||||
|
return GST_FLOW_ERROR;
|
||||||
|
}
|
||||||
buffer_fill_error:
|
buffer_fill_error:
|
||||||
{
|
{
|
||||||
GST_ELEMENT_ERROR (self, RESOURCE, WRITE, (NULL),
|
GST_ELEMENT_ERROR (self, RESOURCE, WRITE, (NULL),
|
||||||
|
|
Loading…
Reference in a new issue