static GstFlowReturn request_buffer(GstPad *pad, guint64 ofs, guint size, GstCaps *caps, GstBuffer **buf) { GstTfImpl *This = gst_pad_get_element_private(pad); IMediaSample *sample; BYTE *ptr; HRESULT hr; TRACE("Requesting buffer\n"); hr = BaseOutputPinImpl_GetDeliveryBuffer((BaseOutputPin*)This->tf.ppPins[1], &sample, NULL, NULL, 0); if (FAILED(hr)) { ERR("Could not get output buffer: %08x\n", hr); return GST_FLOW_WRONG_STATE; } IMediaSample_SetActualDataLength(sample, size); IMediaSample_GetPointer(sample, &ptr); *buf = gst_app_buffer_new(ptr, size, release_sample, sample); if (!*buf) { IMediaSample_Release(sample); ERR("Out of memory\n"); return GST_FLOW_ERROR; } if (!caps) caps = gst_pad_get_caps_reffed(This->my_sink); gst_buffer_set_caps(*buf, caps); return GST_FLOW_OK; }
void QGstAppSrc::pushDataToAppSrc() { if (!isStreamValid() || !m_setup) return; if (m_dataRequested && !m_enoughData) { qint64 size; if (m_dataRequestSize == (unsigned int)-1) size = qMin(m_stream->bytesAvailable(), queueSize()); else size = qMin(m_stream->bytesAvailable(), (qint64)m_dataRequestSize); void *data = g_malloc(size); GstBuffer* buffer = gst_app_buffer_new(data, size, g_free, data); buffer->offset = m_stream->pos(); qint64 bytesRead = m_stream->read((char*)GST_BUFFER_DATA(buffer), size); buffer->offset_end = buffer->offset + bytesRead - 1; if (bytesRead > 0) { m_dataRequested = false; m_enoughData = false; GstFlowReturn ret = gst_app_src_push_buffer (GST_APP_SRC (element()), buffer); if (ret == GST_FLOW_ERROR) { qWarning()<<"appsrc: push buffer error"; } else if (ret == GST_FLOW_WRONG_STATE) { qWarning()<<"appsrc: push buffer wrong state"; } else if (ret == GST_FLOW_RESEND) { qWarning()<<"appsrc: push buffer resend"; } } } else if (m_stream->atEnd()) { sendEOS(); } }
//-------------------------------------------------------------- void testApp::update(){ grabber.update(); if(grabber.isFrameNew()){ GstBuffer * buffer; if( 1 ){ unsigned char * lpBits24 = grabber.getPixels(); memcpy(pixels.getPixels(), lpBits24, 640*480*3); //for(int i=0;i<640*480;i++){ // int nPos24 = i*3; // // pixels[nPos24] = lpBits24[; // pixels[nPos24+1] = (lpBits24[i*3]+lpBits24[i*3+1]+lpBits24[i*3+2])*.3333; // pixels[nPos24+2] = 0; // //} buffer = gst_app_buffer_new (pixels.getPixels(), 640*480*3, NULL, pixels.getPixels()); } GstFlowReturn flow_return = gst_app_src_push_buffer(gstSrc, buffer); if (flow_return != GST_FLOW_OK) { ofLog(OF_LOG_WARNING,"error pushing buffer"); } gst.update(); } grabber.draw(0,0); }
int main (int argc, char *argv[]) { App *app = &s_app; int i; gst_init (&argc, &argv); app->pipe = gst_pipeline_new (NULL); g_assert (app->pipe); app->src = gst_element_factory_make ("appsrc", NULL); g_assert (app->src); gst_bin_add (GST_BIN (app->pipe), app->src); app->id = gst_element_factory_make ("identity", NULL); g_assert (app->id); gst_bin_add (GST_BIN (app->pipe), app->id); app->sink = gst_element_factory_make ("appsink", NULL); g_assert (app->sink); gst_bin_add (GST_BIN (app->pipe), app->sink); gst_element_link (app->src, app->id); gst_element_link (app->id, app->sink); gst_element_set_state (app->pipe, GST_STATE_PLAYING); for (i = 0; i < 10; i++) { GstBuffer *buf; void *data; data = malloc (100); memset (data, i, 100); buf = gst_app_buffer_new (data, 100, dont_eat_my_chicken_wings, data); printf ("%d: creating buffer for pointer %p, %p\n", i, data, buf); gst_app_src_push_buffer (GST_APP_SRC (app->src), buf); } gst_app_src_end_of_stream (GST_APP_SRC (app->src)); while (!gst_app_sink_is_eos (GST_APP_SINK (app->sink))) { GstBuffer *buf; buf = gst_app_sink_pull_buffer (GST_APP_SINK (app->sink)); printf ("retrieved buffer %p\n", buf); gst_buffer_unref (buf); } gst_element_set_state (app->pipe, GST_STATE_NULL); return 0; }
void shmdata_any_writer_push_data (shmdata_any_writer_t * context, void *data, int size, unsigned long long timestamp, void (*done_with_data) (void *), void *user_data) { GstBuffer *buf; buf = gst_app_buffer_new (data, size, done_with_data, user_data); GST_BUFFER_TIMESTAMP (buf) = (GstClockTime) (timestamp); gst_app_src_push_buffer (GST_APP_SRC (context->src_), buf); }
static HRESULT WINAPI Gstreamer_transform_ProcessData(TransformFilter *iface, IMediaSample *sample) { GstTfImpl *This = (GstTfImpl*)iface; REFERENCE_TIME tStart, tStop; BYTE *data; GstBuffer *buf; HRESULT hr; int ret; TRACE("Reading %p\n", sample); EnterCriticalSection(&This->tf.filter.csFilter); IMediaSample_GetPointer(sample, &data); buf = gst_app_buffer_new(data, IMediaSample_GetActualDataLength(sample), release_sample, sample); if (!buf) { LeaveCriticalSection(&This->tf.filter.csFilter); return S_OK; } gst_buffer_set_caps(buf, gst_pad_get_caps_reffed(This->my_src)); IMediaSample_AddRef(sample); buf->duration = buf->timestamp = -1; hr = IMediaSample_GetTime(sample, &tStart, &tStop); if (SUCCEEDED(hr)) { buf->timestamp = tStart * 100; if (hr == S_OK) buf->duration = (tStop - tStart)*100; } if (IMediaSample_GetMediaTime(sample, &tStart, &tStop) == S_OK) { buf->offset = tStart * 100; buf->offset_end = tStop * 100; } if (IMediaSample_IsDiscontinuity(sample) == S_OK) GST_BUFFER_FLAG_SET(buf, GST_BUFFER_FLAG_DISCONT); if (IMediaSample_IsPreroll(sample) == S_OK) GST_BUFFER_FLAG_SET(buf, GST_BUFFER_FLAG_PREROLL); if (IMediaSample_IsSyncPoint(sample) != S_OK) GST_BUFFER_FLAG_SET(buf, GST_BUFFER_FLAG_DELTA_UNIT); LeaveCriticalSection(&This->tf.filter.csFilter); ret = gst_pad_push(This->my_src, buf); if (ret) WARN("Sending returned: %i\n", ret); if (ret == GST_FLOW_ERROR) return E_FAIL; if (ret == GST_FLOW_WRONG_STATE) return VFW_E_WRONG_STATE; if (ret == GST_FLOW_RESEND) return S_FALSE; return S_OK; }
void shmdata_any_writer_push_data_with_duration (shmdata_any_writer_t * context, void *data, int size, unsigned long long timestamp, unsigned long long duration, unsigned long long offset, unsigned long long offset_end, void (*done_with_data) (void *), void *user_data) { GstBuffer *buf; buf = gst_app_buffer_new (data, size, done_with_data, user_data); GST_BUFFER_TIMESTAMP (buf) = (GstClockTime) (timestamp); GST_BUFFER_DURATION (buf) = (GstClockTime) (duration); GST_BUFFER_OFFSET (buf) = (GstClockTime) (offset); GST_BUFFER_OFFSET_END (buf) = (GstClockTime) (offset_end); gst_app_src_push_buffer (GST_APP_SRC (context->src_), buf); }