omxvideoenc: Make handling and usage of the base video codec frames threadsafe

This commit is contained in:
Sebastian Dröge 2011-11-07 11:07:01 +01:00
parent 9a6cea5af3
commit 636cdd31bf

View file

@ -634,7 +634,6 @@ _find_nearest_frame (GstOMXVideoEnc * self, GstOMXBuffer * buf)
guint64 best_diff = G_MAXUINT64; guint64 best_diff = G_MAXUINT64;
BufferIdentification *best_id = NULL; BufferIdentification *best_id = NULL;
GST_BASE_VIDEO_CODEC_STREAM_LOCK (self);
for (l = GST_BASE_VIDEO_CODEC (self)->frames; l; l = l->next) { for (l = GST_BASE_VIDEO_CODEC (self)->frames; l; l = l->next) {
GstVideoFrame *tmp = l->data; GstVideoFrame *tmp = l->data;
BufferIdentification *id = tmp->coder_hook; BufferIdentification *id = tmp->coder_hook;
@ -689,8 +688,6 @@ _find_nearest_frame (GstOMXVideoEnc * self, GstOMXBuffer * buf)
} }
} }
GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (self);
if (finish_frames) { if (finish_frames) {
g_warning ("Too old frames, bug in encoder -- please file a bug"); g_warning ("Too old frames, bug in encoder -- please file a bug");
for (l = finish_frames; l; l = l->next) { for (l = finish_frames; l; l = l->next) {
@ -768,6 +765,7 @@ gst_omx_video_enc_loop (GstOMXVideoEnc * self)
goto flushing; goto flushing;
} }
GST_BASE_VIDEO_CODEC_STREAM_LOCK (self);
frame = _find_nearest_frame (self, buf); frame = _find_nearest_frame (self, buf);
if ((buf->omx_buf->nFlags & OMX_BUFFERFLAG_CODECCONFIG) if ((buf->omx_buf->nFlags & OMX_BUFFERFLAG_CODECCONFIG)
&& buf->omx_buf->nFilledLen > 0) { && buf->omx_buf->nFilledLen > 0) {
@ -785,6 +783,7 @@ gst_omx_video_enc_loop (GstOMXVideoEnc * self)
gst_caps_unref (caps); gst_caps_unref (caps);
if (buf) if (buf)
gst_omx_port_release_buffer (self->out_port, buf); gst_omx_port_release_buffer (self->out_port, buf);
GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (self);
goto caps_failed; goto caps_failed;
} }
gst_caps_unref (caps); gst_caps_unref (caps);
@ -840,6 +839,7 @@ gst_omx_video_enc_loop (GstOMXVideoEnc * self)
gst_base_video_encoder_finish_frame (GST_BASE_VIDEO_ENCODER (self), gst_base_video_encoder_finish_frame (GST_BASE_VIDEO_ENCODER (self),
frame); frame);
} }
GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (self);
if (flow_ret == GST_FLOW_OK && (buf->omx_buf->nFlags & OMX_BUFFERFLAG_EOS)) { if (flow_ret == GST_FLOW_OK && (buf->omx_buf->nFlags & OMX_BUFFERFLAG_EOS)) {
g_mutex_lock (self->drain_lock); g_mutex_lock (self->drain_lock);