static GstFlowReturn gst_gl_mixer_aggregate_frames (GstVideoAggregator * vagg, GstBuffer * outbuf) { gboolean res = FALSE; GstGLMixer *mix = GST_GL_MIXER (vagg); GstGLMixerClass *mix_class = GST_GL_MIXER_GET_CLASS (vagg); GstGLSyncMeta *sync_meta; if (mix_class->process_buffers) res = gst_gl_mixer_process_buffers (mix, outbuf); else if (mix_class->process_textures) res = gst_gl_mixer_process_textures (mix, outbuf); sync_meta = gst_buffer_get_gl_sync_meta (outbuf); if (sync_meta) gst_gl_sync_meta_set_sync_point (sync_meta, mix->context); return res ? GST_FLOW_OK : GST_FLOW_ERROR; }
static GstFlowReturn gst_gl_test_src_fill (GstPushSrc * psrc, GstBuffer * buffer) { GstGLTestSrc *src = GST_GL_TEST_SRC (psrc); GstClockTime next_time; GstVideoFrame out_frame; GstGLSyncMeta *sync_meta; if (G_UNLIKELY (!src->negotiated || !src->context)) goto not_negotiated; /* 0 framerate and we are at the second frame, eos */ if (G_UNLIKELY (GST_VIDEO_INFO_FPS_N (&src->out_info) == 0 && src->n_frames == 1)) goto eos; if (!gst_video_frame_map (&out_frame, &src->out_info, buffer, GST_MAP_WRITE | GST_MAP_GL)) { return GST_FLOW_NOT_NEGOTIATED; } src->out_tex = (GstGLMemory *) out_frame.map[0].memory; gst_gl_context_thread_add (src->context, (GstGLContextThreadFunc) _fill_gl, src); if (!src->gl_result) { gst_video_frame_unmap (&out_frame); goto gl_error; } gst_video_frame_unmap (&out_frame); if (!src->gl_result) goto gl_error; sync_meta = gst_buffer_get_gl_sync_meta (buffer); if (sync_meta) gst_gl_sync_meta_set_sync_point (sync_meta, src->context); GST_BUFFER_TIMESTAMP (buffer) = src->timestamp_offset + src->running_time; GST_BUFFER_OFFSET (buffer) = src->n_frames; src->n_frames++; GST_BUFFER_OFFSET_END (buffer) = src->n_frames; if (src->out_info.fps_n) { next_time = gst_util_uint64_scale_int (src->n_frames * GST_SECOND, src->out_info.fps_d, src->out_info.fps_n); GST_BUFFER_DURATION (buffer) = next_time - src->running_time; } else { next_time = src->timestamp_offset; /* NONE means forever */ GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE; } src->running_time = next_time; return GST_FLOW_OK; gl_error: { GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (_("failed to draw pattern")), (_("A GL error occured"))); return GST_FLOW_NOT_NEGOTIATED; } not_negotiated: { GST_ELEMENT_ERROR (src, CORE, NEGOTIATION, (NULL), (_("format wasn't negotiated before get function"))); return GST_FLOW_NOT_NEGOTIATED; } eos: { GST_DEBUG_OBJECT (src, "eos: 0 framerate, frame %d", (gint) src->n_frames); return GST_FLOW_EOS; } }
static GstBuffer * _default_pad_upload_buffer (GstGLMixer * mix, GstGLMixerFrameData * frame, GstBuffer * buffer) { GstVideoAggregatorPad *vaggpad = GST_VIDEO_AGGREGATOR_PAD (frame->pad); GstGLMixerPad *pad = frame->pad; GstBuffer *uploaded_buf, *gl_buffer; GstCaps *gl_caps; GstCapsFeatures *gl_features; GstVideoInfo gl_info; GstVideoFrame gl_frame; GstGLSyncMeta *sync_meta; gst_video_info_set_format (&gl_info, GST_VIDEO_FORMAT_RGBA, GST_VIDEO_INFO_WIDTH (&vaggpad->info), GST_VIDEO_INFO_HEIGHT (&vaggpad->info)); gl_features = gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_GL_MEMORY); gl_caps = gst_video_info_to_caps (&gl_info); gst_caps_set_features (gl_caps, 0, gst_caps_features_copy (gl_features)); if (!pad->upload) { GstCaps *in_caps = gst_pad_get_current_caps (GST_PAD (pad)); GstCaps *upload_caps = gst_caps_copy (in_caps); pad->upload = gst_gl_upload_new (mix->context); gst_caps_set_features (upload_caps, 0, gst_caps_features_copy (gl_features)); gst_gl_upload_set_caps (pad->upload, in_caps, upload_caps); if (!pad->convert) { pad->convert = gst_gl_color_convert_new (mix->context); gst_gl_color_convert_set_caps (pad->convert, upload_caps, gl_caps); } gst_caps_unref (upload_caps); gst_caps_unref (in_caps); } gst_caps_features_free (gl_features); gst_caps_unref (gl_caps); sync_meta = gst_buffer_get_gl_sync_meta (vaggpad->buffer); if (sync_meta) gst_gl_sync_meta_wait (sync_meta); if (gst_gl_upload_perform_with_buffer (pad->upload, vaggpad->buffer, &uploaded_buf) != GST_GL_UPLOAD_DONE) { return NULL; } if (!(gl_buffer = gst_gl_color_convert_perform (pad->convert, uploaded_buf))) { gst_buffer_unref (uploaded_buf); return NULL; } if (!gst_video_frame_map (&gl_frame, &gl_info, gl_buffer, GST_MAP_READ | GST_MAP_GL)) { gst_buffer_unref (uploaded_buf); gst_buffer_unref (gl_buffer); return NULL; } frame->texture = *(guint *) gl_frame.data[0]; gst_buffer_unref (uploaded_buf); gst_video_frame_unmap (&gl_frame); return gl_buffer; }