msdk: dec: remove code to manage buffers with locked surface
https://bugzilla.gnome.org/show_bug.cgi?id=793413
This commit is contained in:
parent
b08b8ddae3
commit
37ef61586a
@ -81,7 +81,6 @@ allocate_output_buffer (GstMsdkDec * thiz, GstBuffer ** buffer)
|
|||||||
GstFlowReturn flow;
|
GstFlowReturn flow;
|
||||||
GstVideoCodecFrame *frame;
|
GstVideoCodecFrame *frame;
|
||||||
GstVideoDecoder *decoder = GST_VIDEO_DECODER (thiz);
|
GstVideoDecoder *decoder = GST_VIDEO_DECODER (thiz);
|
||||||
mfxFrameSurface1 *mfx_surface;
|
|
||||||
|
|
||||||
frame = gst_video_decoder_get_oldest_frame (decoder);
|
frame = gst_video_decoder_get_oldest_frame (decoder);
|
||||||
if (!frame) {
|
if (!frame) {
|
||||||
@ -92,26 +91,11 @@ allocate_output_buffer (GstMsdkDec * thiz, GstBuffer ** buffer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!frame->output_buffer) {
|
if (!frame->output_buffer) {
|
||||||
retry:
|
|
||||||
flow = gst_video_decoder_allocate_output_frame (decoder, frame);
|
flow = gst_video_decoder_allocate_output_frame (decoder, frame);
|
||||||
if (flow != GST_FLOW_OK) {
|
if (flow != GST_FLOW_OK) {
|
||||||
gst_video_codec_frame_unref (frame);
|
gst_video_codec_frame_unref (frame);
|
||||||
return flow;
|
return flow;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gst_msdk_is_msdk_buffer (frame->output_buffer)) {
|
|
||||||
mfx_surface = gst_msdk_get_surface_from_buffer (frame->output_buffer);
|
|
||||||
/* When using video memory, mfx surface is still locked even though
|
|
||||||
* it's finished by SyncOperation. There's no way to get notified when it gets unlocked.
|
|
||||||
* We should be keep these buffers and check if it's unlocked.
|
|
||||||
*/
|
|
||||||
if (mfx_surface && mfx_surface->Data.Locked) {
|
|
||||||
thiz->locked_buffer =
|
|
||||||
g_list_append (thiz->locked_buffer, frame->output_buffer);
|
|
||||||
frame->output_buffer = NULL;
|
|
||||||
goto retry;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*buffer = gst_buffer_ref (frame->output_buffer);
|
*buffer = gst_buffer_ref (frame->output_buffer);
|
||||||
@ -159,24 +143,12 @@ get_surface (GstMsdkDec * thiz, GstBuffer * buffer)
|
|||||||
GST_MAP_WRITE))
|
GST_MAP_WRITE))
|
||||||
goto failed_unref_buffer;
|
goto failed_unref_buffer;
|
||||||
|
|
||||||
retry:
|
|
||||||
if (gst_buffer_pool_acquire_buffer (thiz->pool, &buffer,
|
if (gst_buffer_pool_acquire_buffer (thiz->pool, &buffer,
|
||||||
NULL) != GST_FLOW_OK)
|
NULL) != GST_FLOW_OK)
|
||||||
goto failed_unmap_copy;
|
goto failed_unmap_copy;
|
||||||
|
|
||||||
if (gst_msdk_is_msdk_buffer (buffer)) {
|
|
||||||
i->surface = gst_msdk_get_surface_from_buffer (buffer);
|
i->surface = gst_msdk_get_surface_from_buffer (buffer);
|
||||||
|
|
||||||
/* When using video memory, mfx surface is still locked even though
|
|
||||||
* it's finished by SyncOperation. There's no way to get notified when it gets unlocked.
|
|
||||||
* We should keep these buffers and check if it's unlocked.
|
|
||||||
*/
|
|
||||||
if (i->surface->Data.Locked) {
|
|
||||||
thiz->locked_buffer = g_list_append (thiz->locked_buffer, buffer);
|
|
||||||
goto retry;
|
|
||||||
}
|
|
||||||
i->buf = buffer;
|
i->buf = buffer;
|
||||||
}
|
|
||||||
|
|
||||||
if (!gst_video_frame_map (&i->data, &thiz->pool_info, buffer,
|
if (!gst_video_frame_map (&i->data, &thiz->pool_info, buffer,
|
||||||
GST_MAP_READWRITE))
|
GST_MAP_READWRITE))
|
||||||
@ -584,35 +556,6 @@ release_msdk_surfaces (GstMsdkDec * thiz)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
release_locked_buffer (GstMsdkDec * thiz)
|
|
||||||
{
|
|
||||||
GList *l;
|
|
||||||
GstBuffer *buf;
|
|
||||||
|
|
||||||
for (l = thiz->locked_buffer; l; l = l->next) {
|
|
||||||
buf = l->data;
|
|
||||||
gst_buffer_unref (buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
check_locked_buffer (GstMsdkDec * thiz)
|
|
||||||
{
|
|
||||||
GList *l;
|
|
||||||
GstBuffer *buf;
|
|
||||||
mfxFrameSurface1 *mfx_surface;
|
|
||||||
|
|
||||||
for (l = thiz->locked_buffer; l; l = l->next) {
|
|
||||||
buf = l->data;
|
|
||||||
mfx_surface = gst_msdk_get_surface_from_buffer (buf);
|
|
||||||
if (!mfx_surface->Data.Locked) {
|
|
||||||
gst_buffer_unref (buf);
|
|
||||||
thiz->locked_buffer = g_list_delete_link (thiz->locked_buffer, l);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_msdkdec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame)
|
gst_msdkdec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame)
|
||||||
{
|
{
|
||||||
@ -657,8 +600,6 @@ gst_msdkdec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame)
|
|||||||
|
|
||||||
session = gst_msdk_context_get_session (thiz->context);
|
session = gst_msdk_context_get_session (thiz->context);
|
||||||
for (;;) {
|
for (;;) {
|
||||||
check_locked_buffer (thiz);
|
|
||||||
|
|
||||||
task = &g_array_index (thiz->tasks, MsdkDecTask, thiz->next_task);
|
task = &g_array_index (thiz->tasks, MsdkDecTask, thiz->next_task);
|
||||||
flow = gst_msdkdec_finish_task (thiz, task);
|
flow = gst_msdkdec_finish_task (thiz, task);
|
||||||
if (flow != GST_FLOW_OK)
|
if (flow != GST_FLOW_OK)
|
||||||
@ -946,8 +887,6 @@ gst_msdkdec_drain (GstVideoDecoder * decoder)
|
|||||||
session = gst_msdk_context_get_session (thiz->context);
|
session = gst_msdk_context_get_session (thiz->context);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
check_locked_buffer (thiz);
|
|
||||||
|
|
||||||
task = &g_array_index (thiz->tasks, MsdkDecTask, thiz->next_task);
|
task = &g_array_index (thiz->tasks, MsdkDecTask, thiz->next_task);
|
||||||
if ((flow = gst_msdkdec_finish_task (thiz, task)) != GST_FLOW_OK) {
|
if ((flow = gst_msdkdec_finish_task (thiz, task)) != GST_FLOW_OK) {
|
||||||
if (flow != GST_FLOW_FLUSHING)
|
if (flow != GST_FLOW_FLUSHING)
|
||||||
@ -1003,8 +942,6 @@ gst_msdkdec_drain (GstVideoDecoder * decoder)
|
|||||||
thiz->next_task = (thiz->next_task + 1) % thiz->tasks->len;
|
thiz->next_task = (thiz->next_task + 1) % thiz->tasks->len;
|
||||||
}
|
}
|
||||||
|
|
||||||
check_locked_buffer (thiz);
|
|
||||||
release_locked_buffer (thiz);
|
|
||||||
release_msdk_surfaces (thiz);
|
release_msdk_surfaces (thiz);
|
||||||
|
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
|
@ -81,7 +81,6 @@ struct _GstMsdkDec
|
|||||||
guint next_task;
|
guint next_task;
|
||||||
|
|
||||||
GList *decoded_msdk_surfaces;
|
GList *decoded_msdk_surfaces;
|
||||||
GList *locked_buffer;
|
|
||||||
|
|
||||||
/* element properties */
|
/* element properties */
|
||||||
gboolean hardware;
|
gboolean hardware;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user