本文整理汇总了C++中GST_BUFFER_DATA函数的典型用法代码示例。如果您正苦于以下问题:C++ GST_BUFFER_DATA函数的具体用法?C++ GST_BUFFER_DATA怎么用?C++ GST_BUFFER_DATA使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了GST_BUFFER_DATA函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: play_loop
static void
play_loop (GstPad * pad)
{
GstFlowReturn ret;
GstNsfDec *nsfdec;
GstBuffer *out;
gint64 value, offset, time;
GstFormat format;
nsfdec = GST_NSFDEC (gst_pad_get_parent (pad));
out = gst_buffer_new_and_alloc (nsfdec->blocksize);
gst_buffer_set_caps (out, GST_PAD_CAPS (pad));
nsf_frame (nsfdec->nsf);
apu_process (GST_BUFFER_DATA (out), nsfdec->blocksize / nsfdec->bps);
/* get offset in samples */
format = GST_FORMAT_DEFAULT;
gst_nsfdec_src_convert (nsfdec->srcpad,
GST_FORMAT_BYTES, nsfdec->total_bytes, &format, &offset);
GST_BUFFER_OFFSET (out) = offset;
/* get current timestamp */
format = GST_FORMAT_TIME;
gst_nsfdec_src_convert (nsfdec->srcpad,
GST_FORMAT_BYTES, nsfdec->total_bytes, &format, &time);
GST_BUFFER_TIMESTAMP (out) = time;
/* update position and get new timestamp to calculate duration */
nsfdec->total_bytes += nsfdec->blocksize;
/* get offset in samples */
format = GST_FORMAT_DEFAULT;
gst_nsfdec_src_convert (nsfdec->srcpad,
GST_FORMAT_BYTES, nsfdec->total_bytes, &format, &value);
GST_BUFFER_OFFSET_END (out) = value;
format = GST_FORMAT_TIME;
gst_nsfdec_src_convert (nsfdec->srcpad,
GST_FORMAT_BYTES, nsfdec->total_bytes, &format, &value);
GST_BUFFER_DURATION (out) = value - time;
if ((ret = gst_pad_push (nsfdec->srcpad, out)) != GST_FLOW_OK)
goto pause;
done:
gst_object_unref (nsfdec);
return;
/* ERRORS */
pause:
{
const gchar *reason = gst_flow_get_name (ret);
GST_DEBUG_OBJECT (nsfdec, "pausing task, reason %s", reason);
gst_pad_pause_task (pad);
if (ret == GST_FLOW_UNEXPECTED) {
/* perform EOS logic, FIXME, segment seek? */
gst_pad_push_event (pad, gst_event_new_eos ());
} else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) {
/* for fatal errors we post an error message */
GST_ELEMENT_ERROR (nsfdec, STREAM, FAILED,
(NULL), ("streaming task paused, reason %s", reason));
gst_pad_push_event (pad, gst_event_new_eos ());
}
goto done;
}
}
示例2: gst_video_mark_yuv
static GstFlowReturn
gst_video_mark_yuv (GstVideoMark * videomark, GstBuffer * buffer)
{
GstVideoFormat format;
gint i, pw, ph, row_stride, pixel_stride, offset;
gint width, height, req_width, req_height;
guint8 *d, *data;
guint64 pattern_shift;
guint8 color;
data = GST_BUFFER_DATA (buffer);
format = videomark->format;
width = videomark->width;
height = videomark->height;
pw = videomark->pattern_width;
ph = videomark->pattern_height;
row_stride = gst_video_format_get_row_stride (format, 0, width);
pixel_stride = gst_video_format_get_pixel_stride (format, 0);
offset = gst_video_format_get_component_offset (format, 0, width, height);
req_width =
(videomark->pattern_count + videomark->pattern_data_count) * pw +
videomark->left_offset;
req_height = videomark->bottom_offset + ph;
if (req_width > width || req_height > height) {
GST_ELEMENT_ERROR (videomark, STREAM, WRONG_TYPE, (NULL),
("videomark pattern doesn't fit video, need at least %ix%i (stream has %ix%i)",
req_width, req_height, width, height));
return GST_FLOW_ERROR;
}
/* draw the bottom left pixels */
for (i = 0; i < videomark->pattern_count; i++) {
d = data + offset;
/* move to start of bottom left */
d += row_stride * (height - ph - videomark->bottom_offset) +
pixel_stride * videomark->left_offset;
/* move to i-th pattern */
d += pixel_stride * pw * i;
if (i & 1)
/* odd pixels must be white */
color = 255;
else
color = 0;
/* draw box of width * height */
gst_video_mark_draw_box (videomark, d, pw, ph, row_stride, pixel_stride,
color);
}
pattern_shift = G_GUINT64_CONSTANT (1) << (videomark->pattern_data_count - 1);
/* get the data of the pattern */
for (i = 0; i < videomark->pattern_data_count; i++) {
d = data + offset;
/* move to start of bottom left, adjust for offsets */
d += row_stride * (height - ph - videomark->bottom_offset) +
pixel_stride * videomark->left_offset;
/* move after the fixed pattern */
d += pixel_stride * videomark->pattern_count * pw;
/* move to i-th pattern data */
d += pixel_stride * pw * i;
if (videomark->pattern_data & pattern_shift)
color = 255;
else
color = 0;
gst_video_mark_draw_box (videomark, d, pw, ph, row_stride, pixel_stride,
color);
pattern_shift >>= 1;
}
return GST_FLOW_OK;
}
示例3: glfwMakeContextCurrent
bool nvxio::GStreamerBaseRenderImpl::flush()
{
if (!pipeline)
return false;
glfwMakeContextCurrent(window_);
if (glfwWindowShouldClose(window_))
return false;
gl_->PixelStorei(GL_PACK_ALIGNMENT, 1);
gl_->PixelStorei(GL_PACK_ROW_LENGTH, wndWidth_);
{
GstClockTime duration = GST_SECOND / (double)GSTREAMER_DEFAULT_FPS;
GstClockTime timestamp = num_frames * duration;
#if GST_VERSION_MAJOR == 0
GstBuffer * buffer = gst_buffer_try_new_and_alloc(wndHeight_ * wndWidth_ * 4);
if (!buffer)
{
NVXIO_PRINT("Cannot create GStreamer buffer");
FinalizeGStreamerPipeline();
return false;
}
gl_->ReadPixels(0, 0, wndWidth_, wndHeight_, GL_RGBA, GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buffer));
GST_BUFFER_TIMESTAMP(buffer) = timestamp;
if (!GST_BUFFER_TIMESTAMP_IS_VALID(buffer))
NVXIO_PRINT("Failed to setup timestamp");
#else
GstBuffer * buffer = gst_buffer_new_allocate(NULL, wndHeight_ * wndWidth_ * 4, NULL);
GstMapInfo info;
gst_buffer_map(buffer, &info, GST_MAP_READ);
gl_->ReadPixels(0, 0, wndWidth_, wndHeight_, GL_RGBA, GL_UNSIGNED_BYTE, info.data);
gst_buffer_unmap(buffer, &info);
GST_BUFFER_PTS(buffer) = timestamp;
if (!GST_BUFFER_PTS_IS_VALID(buffer))
NVXIO_PRINT("Failed to setup PTS");
GST_BUFFER_DTS(buffer) = timestamp;
if (!GST_BUFFER_DTS_IS_VALID(buffer))
NVXIO_PRINT("Failed to setup DTS");
#endif
GST_BUFFER_DURATION(buffer) = duration;
if (!GST_BUFFER_DURATION_IS_VALID(buffer))
NVXIO_PRINT("Failed to setup duration");
GST_BUFFER_OFFSET(buffer) = num_frames++;
if (!GST_BUFFER_OFFSET_IS_VALID(buffer))
NVXIO_PRINT("Failed to setup offset");
if (gst_app_src_push_buffer(appsrc, buffer) != GST_FLOW_OK)
{
NVXIO_PRINT("Error pushing buffer to GStreamer pipeline");
FinalizeGStreamerPipeline();
return false;
}
}
// reset state
gl_->PixelStorei(GL_PACK_ALIGNMENT, 4);
gl_->PixelStorei(GL_PACK_ROW_LENGTH, 0);
glfwSwapBuffers(window_);
clearGlBuffer();
return true;
}
示例4: gst_segment_clip
HRESULT AudioFakeSink::DoRenderSample(IMediaSample *pMediaSample)
{
GstBuffer *out_buf = NULL;
gboolean in_seg = FALSE;
GstClockTime buf_start, buf_stop;
gint64 clip_start = 0, clip_stop = 0;
guint start_offset = 0, stop_offset;
GstClockTime duration;
if(pMediaSample)
{
BYTE *pBuffer = NULL;
LONGLONG lStart = 0, lStop = 0;
long size = pMediaSample->GetActualDataLength();
pMediaSample->GetPointer(&pBuffer);
pMediaSample->GetTime(&lStart, &lStop);
if (!GST_CLOCK_TIME_IS_VALID (mDec->timestamp)) {
// Convert REFERENCE_TIME to GST_CLOCK_TIME
mDec->timestamp = (GstClockTime)lStart * 100;
}
duration = (lStop - lStart) * 100;
buf_start = mDec->timestamp;
buf_stop = mDec->timestamp + duration;
/* save stop position to start next buffer with it */
mDec->timestamp = buf_stop;
/* check if this buffer is in our current segment */
in_seg = gst_segment_clip (mDec->segment, GST_FORMAT_TIME,
buf_start, buf_stop, &clip_start, &clip_stop);
/* if the buffer is out of segment do not push it downstream */
if (!in_seg) {
GST_DEBUG_OBJECT (mDec,
"buffer is out of segment, start %" GST_TIME_FORMAT " stop %"
GST_TIME_FORMAT, GST_TIME_ARGS (buf_start), GST_TIME_ARGS (buf_stop));
goto done;
}
/* buffer is entirely or partially in-segment, so allocate a
* GstBuffer for output, and clip if required */
/* allocate a new buffer for raw audio */
mDec->last_ret = gst_pad_alloc_buffer (mDec->srcpad,
GST_BUFFER_OFFSET_NONE,
size,
GST_PAD_CAPS (mDec->srcpad), &out_buf);
if (!out_buf) {
GST_WARNING_OBJECT (mDec, "cannot allocate a new GstBuffer");
goto done;
}
/* set buffer properties */
GST_BUFFER_TIMESTAMP (out_buf) = buf_start;
GST_BUFFER_DURATION (out_buf) = duration;
memcpy (GST_BUFFER_DATA (out_buf), pBuffer,
MIN ((unsigned int)size, GST_BUFFER_SIZE (out_buf)));
/* we have to remove some heading samples */
if ((GstClockTime) clip_start > buf_start) {
start_offset = (guint)gst_util_uint64_scale_int (clip_start - buf_start,
mDec->rate, GST_SECOND) * mDec->depth / 8 * mDec->channels;
}
else
start_offset = 0;
/* we have to remove some trailing samples */
if ((GstClockTime) clip_stop < buf_stop) {
stop_offset = (guint)gst_util_uint64_scale_int (buf_stop - clip_stop,
mDec->rate, GST_SECOND) * mDec->depth / 8 * mDec->channels;
}
else
stop_offset = size;
/* truncating */
if ((start_offset != 0) || (stop_offset != (size_t) size)) {
GstBuffer *subbuf = gst_buffer_create_sub (out_buf, start_offset,
stop_offset - start_offset);
if (subbuf) {
gst_buffer_set_caps (subbuf, GST_PAD_CAPS (mDec->srcpad));
gst_buffer_unref (out_buf);
out_buf = subbuf;
}
}
GST_BUFFER_TIMESTAMP (out_buf) = clip_start;
GST_BUFFER_DURATION (out_buf) = clip_stop - clip_start;
/* replace the saved stop position by the clipped one */
mDec->timestamp = clip_stop;
GST_DEBUG_OBJECT (mDec,
"push_buffer (size %d)=> pts %" GST_TIME_FORMAT " stop %" GST_TIME_FORMAT
" duration %" GST_TIME_FORMAT, size,
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (out_buf)),
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (out_buf) +
GST_BUFFER_DURATION (out_buf)),
//.........这里部分代码省略.........
示例5: data_proc
static OSErr
data_proc (SGChannel c, Ptr p, long len, long * offset, long chRefCon,
TimeValue time, short writeType, long refCon)
{
GstOSXVideoSrc * self;
gint fps_n, fps_d;
GstClockTime duration, timestamp, latency;
CodecFlags flags;
ComponentResult err;
PixMapHandle hPixMap;
Rect portRect;
int pix_rowBytes;
void *pix_ptr;
int pix_height;
int pix_size;
self = GST_OSX_VIDEO_SRC (refCon);
if (self->buffer != NULL) {
gst_buffer_unref (self->buffer);
self->buffer = NULL;
}
err = DecompressSequenceFrameS (self->dec_seq, p, len, 0, &flags, NULL);
if (err != noErr) {
GST_ERROR_OBJECT (self, "DecompressSequenceFrameS returned %d", (int) err);
return err;
}
hPixMap = GetGWorldPixMap (self->world);
LockPixels (hPixMap);
GetPortBounds (self->world, &portRect);
pix_rowBytes = (int) GetPixRowBytes (hPixMap);
pix_ptr = GetPixBaseAddr (hPixMap);
pix_height = (portRect.bottom - portRect.top);
pix_size = pix_rowBytes * pix_height;
GST_DEBUG_OBJECT (self, "num=%5d, height=%d, rowBytes=%d, size=%d",
self->seq_num, pix_height, pix_rowBytes, pix_size);
fps_n = FRAMERATE;
fps_d = 1;
duration = gst_util_uint64_scale_int (GST_SECOND, fps_d, fps_n);
latency = duration;
timestamp = gst_clock_get_time (GST_ELEMENT_CAST (self)->clock);
timestamp -= gst_element_get_base_time (GST_ELEMENT_CAST (self));
if (timestamp > latency)
timestamp -= latency;
else
timestamp = 0;
self->buffer = gst_buffer_new_and_alloc (pix_size);
GST_BUFFER_OFFSET (self->buffer) = self->seq_num;
GST_BUFFER_TIMESTAMP (self->buffer) = timestamp;
memcpy (GST_BUFFER_DATA (self->buffer), pix_ptr, pix_size);
self->seq_num++;
UnlockPixels (hPixMap);
return noErr;
}
示例6: gst_scene_change_filter_ip_I420
static GstFlowReturn
gst_scene_change_filter_ip_I420 (GstVideoFilter2 * videofilter2,
GstBuffer * buf, int start, int end)
{
GstSceneChange *scenechange;
double score_min;
double score_max;
double threshold;
double score;
gboolean change;
int i;
int width;
int height;
g_return_val_if_fail (GST_IS_SCENE_CHANGE (videofilter2), GST_FLOW_ERROR);
scenechange = GST_SCENE_CHANGE (videofilter2);
width = GST_VIDEO_FILTER2_WIDTH (videofilter2);
height = GST_VIDEO_FILTER2_HEIGHT (videofilter2);
if (!scenechange->oldbuf) {
scenechange->n_diffs = 0;
memset (scenechange->diffs, 0, sizeof (double) * SC_N_DIFFS);
scenechange->oldbuf = gst_buffer_ref (buf);
return GST_FLOW_OK;
}
score = get_frame_score (GST_BUFFER_DATA (scenechange->oldbuf),
GST_BUFFER_DATA (buf), width, height);
memmove (scenechange->diffs, scenechange->diffs + 1,
sizeof (double) * (SC_N_DIFFS - 1));
scenechange->diffs[SC_N_DIFFS - 1] = score;
scenechange->n_diffs++;
gst_buffer_unref (scenechange->oldbuf);
scenechange->oldbuf = gst_buffer_ref (buf);
score_min = scenechange->diffs[0];
score_max = scenechange->diffs[0];
for (i = 1; i < SC_N_DIFFS - 1; i++) {
score_min = MIN (score_min, scenechange->diffs[i]);
score_max = MAX (score_max, scenechange->diffs[i]);
}
threshold = 1.8 * score_max - 0.8 * score_min;
if (scenechange->n_diffs > 2) {
if (score < 5) {
change = FALSE;
} else if (score / threshold < 1.0) {
change = FALSE;
} else if (score / threshold > 2.5) {
change = TRUE;
} else if (score > 50) {
change = TRUE;
} else {
change = FALSE;
}
} else {
change = FALSE;
}
#ifdef TESTING
if (change != is_shot_change (scenechange->n_diffs)) {
g_print ("%d %g %g %g %d\n", scenechange->n_diffs, score / threshold,
score, threshold, change);
}
#endif
if (change) {
GstEvent *event;
GST_DEBUG_OBJECT (scenechange, "%d %g %g %g %d",
scenechange->n_diffs, score / threshold, score, threshold, change);
event = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM,
gst_structure_new ("GstForceKeyUnit", NULL));
gst_pad_push_event (GST_BASE_TRANSFORM_SRC_PAD (scenechange), event);
}
return GST_FLOW_OK;
}
示例7: gst_devsound_src_create
static GstFlowReturn gst_devsound_src_create(GstBaseSrc *src, guint64 offset,
guint size, GstBuffer **buf)
{
GstDevsoundSrc *dsrc= GST_DEVSOUND_SRC(src);
int bufferpos=0;
int ret = KErrNone;
if(!g_queue_get_length(dataqueue) && (dsrc->eosreceived == TRUE))
{
pthread_mutex_lock(&(create_mutex1));
pthread_cond_signal(&(create_condition1));
pthread_mutex_unlock(&(create_mutex1));
post_symbian_error( src,KErrCancel );
return GST_FLOW_UNEXPECTED;
}
//gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) dsrc, "gst_devsound_src_create ENTER ");
//gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) dsrc, "Before Buffer Alloc in CREATE ",NULL);
*buf = gst_buffer_try_new_and_alloc(size);
//gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) dsrc, "AFter Buffer Alloc in CREATE ",NULL);
if(*buf == NULL)
{
post_symbian_error( src,KErrNoMemory );
return GST_FLOW_UNEXPECTED;
}
while (size > 0)
{
if (dataleft >= size)
{
// if there is some data left in the popped buffer previously whose size
// is more then the buffer which is incoming fresh to get filled, fill it
//here. and if the data left in the popped buffer is 0, then unref it
//gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) dsrc, "dataleft >=size in CREATE ", NULL);
memcpy(GST_BUFFER_DATA(*buf)+bufferpos,GST_BUFFER_DATA(popBuffer)+dataCopied,size);
bufferpos+=size;
dataCopied += size;
dataleft = GST_BUFFER_SIZE(popBuffer) - dataCopied;
size = 0;
if (dataleft == 0)
{
dataCopied = 0;
gst_buffer_unref(popBuffer);
popBuffer = NULL;
}
}
else
{
// if the dataleft in the popped buffer is greater then 0 and less then
// the size of data needed for the fresh buffer. copy the remaining data
// from the popped buffer and then unref it.
if (dataleft > 0)
{
//gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) dsrc, "dataleft >0 in CREATE ",NULL);
memcpy(GST_BUFFER_DATA(*buf)+bufferpos,GST_BUFFER_DATA(popBuffer)+dataCopied,dataleft);
size -= dataleft;
bufferpos += dataleft;
dataCopied = 0;
dataleft = 0;
gst_buffer_unref(popBuffer);
popBuffer = NULL;
}
// we wait here if the dataqueue length is 0 and we need data
// to be filled in the queue from the DevSound Thread
if (!g_queue_get_length(dataqueue))
{
//gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) dsrc, "Before WAIT in CREATE ",NULL);
if(dsrc->eosreceived == TRUE)
{
post_symbian_error( src,KErrCancel );
return GST_FLOW_UNEXPECTED;
}
else
{
cmd = RECORDING;
return_error = KErrNone;
pthread_mutex_lock(&(create_mutex1));
pthread_cond_signal(&(create_condition1));
pthread_mutex_unlock(&(create_mutex1));
pthread_mutex_lock(&(create_mutex1));
pthread_cond_wait(&(create_condition1), &(create_mutex1));
ret = return_error;
pthread_mutex_unlock(&(create_mutex1));
}
//gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) dsrc, "AFTER WAIT in CREATE ",NULL);
}
if( ret )
{
post_symbian_error( src,ret );
return GST_FLOW_UNEXPECTED;
}
//gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) dsrc, "Before POP in CREATE ",NULL);
GST_OBJECT_LOCK(dsrc);
popBuffer = (GstBuffer*)g_queue_pop_tail(dataqueue);
GST_OBJECT_UNLOCK(dsrc);
if(!popBuffer )
//.........这里部分代码省略.........
示例8: gst_identity_transform_ip
static GstFlowReturn
gst_identity_transform_ip (GstBaseTransform * trans, GstBuffer * buf)
{
GstFlowReturn ret = GST_FLOW_OK;
GstIdentity *identity = GST_IDENTITY (trans);
GstClockTime runtimestamp = G_GINT64_CONSTANT (0);
if (identity->check_perfect)
gst_identity_check_perfect (identity, buf);
if (identity->check_imperfect_timestamp)
gst_identity_check_imperfect_timestamp (identity, buf);
if (identity->check_imperfect_offset)
gst_identity_check_imperfect_offset (identity, buf);
/* update prev values */
identity->prev_timestamp = GST_BUFFER_TIMESTAMP (buf);
identity->prev_duration = GST_BUFFER_DURATION (buf);
identity->prev_offset_end = GST_BUFFER_OFFSET_END (buf);
identity->prev_offset = GST_BUFFER_OFFSET (buf);
if (identity->error_after >= 0) {
identity->error_after--;
if (identity->error_after == 0) {
GST_ELEMENT_ERROR (identity, CORE, FAILED,
(_("Failed after iterations as requested.")), (NULL));
return GST_FLOW_ERROR;
}
}
if (identity->drop_probability > 0.0) {
if ((gfloat) (1.0 * rand () / (RAND_MAX)) < identity->drop_probability) {
if (!identity->silent) {
GST_OBJECT_LOCK (identity);
g_free (identity->last_message);
identity->last_message =
g_strdup_printf
("dropping ******* (%s:%s)i (%d bytes, timestamp: %"
GST_TIME_FORMAT ", duration: %" GST_TIME_FORMAT ", offset: %"
G_GINT64_FORMAT ", offset_end: % " G_GINT64_FORMAT
", flags: %d) %p", GST_DEBUG_PAD_NAME (trans->sinkpad),
GST_BUFFER_SIZE (buf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), GST_BUFFER_OFFSET (buf),
GST_BUFFER_OFFSET_END (buf), GST_BUFFER_FLAGS (buf), buf);
GST_OBJECT_UNLOCK (identity);
gst_identity_notify_last_message (identity);
}
/* return DROPPED to basetransform. */
return GST_BASE_TRANSFORM_FLOW_DROPPED;
}
}
if (identity->dump) {
gst_util_dump_mem (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
}
if (!identity->silent) {
GST_OBJECT_LOCK (identity);
g_free (identity->last_message);
identity->last_message =
g_strdup_printf ("chain ******* (%s:%s)i (%d bytes, timestamp: %"
GST_TIME_FORMAT ", duration: %" GST_TIME_FORMAT ", offset: %"
G_GINT64_FORMAT ", offset_end: % " G_GINT64_FORMAT ", flags: %d) %p",
GST_DEBUG_PAD_NAME (trans->sinkpad), GST_BUFFER_SIZE (buf),
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
GST_TIME_ARGS (GST_BUFFER_DURATION (buf)),
GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET_END (buf),
GST_BUFFER_FLAGS (buf), buf);
GST_OBJECT_UNLOCK (identity);
gst_identity_notify_last_message (identity);
}
if (identity->datarate > 0) {
GstClockTime time = gst_util_uint64_scale_int (identity->offset,
GST_SECOND, identity->datarate);
GST_BUFFER_TIMESTAMP (buf) = time;
GST_BUFFER_DURATION (buf) =
GST_BUFFER_SIZE (buf) * GST_SECOND / identity->datarate;
}
if (identity->signal_handoffs)
g_signal_emit (identity, gst_identity_signals[SIGNAL_HANDOFF], 0, buf);
if (trans->segment.format == GST_FORMAT_TIME)
runtimestamp = gst_segment_to_running_time (&trans->segment,
GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (buf));
if ((identity->sync) && (trans->segment.format == GST_FORMAT_TIME)) {
GstClock *clock;
GST_OBJECT_LOCK (identity);
if ((clock = GST_ELEMENT (identity)->clock)) {
GstClockReturn cret;
GstClockTime timestamp;
timestamp = runtimestamp + GST_ELEMENT (identity)->base_time;
/* save id if we need to unlock */
/* FIXME: actually unlock this somewhere in the state changes */
identity->clock_id = gst_clock_new_single_shot_id (clock, timestamp);
//.........这里部分代码省略.........
示例9: gst_slvideo_buffer_alloc
static GstFlowReturn
gst_slvideo_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size,
GstCaps * caps, GstBuffer ** buf)
{
gint width, height;
GstStructure *structure = NULL;
GstSLVideo *slvideo;
slvideo = GST_SLVIDEO(bsink);
// caps == requested caps
// we can ignore these and reverse-negotiate our preferred dimensions with
// the peer if we like - we need to do this to obey dynamic resize requests
// flowing in from the app.
structure = llgst_caps_get_structure (caps, 0);
if (!llgst_structure_get_int(structure, "width", &width) ||
!llgst_structure_get_int(structure, "height", &height))
{
GST_WARNING_OBJECT (slvideo, "no width/height in caps %" GST_PTR_FORMAT, caps);
return GST_FLOW_NOT_NEGOTIATED;
}
GstBuffer *newbuf = llgst_buffer_new();
bool made_bufferdata_ptr = false;
#define MAXDEPTHHACK 4
GST_OBJECT_LOCK(slvideo);
if (slvideo->resize_forced_always) // app is giving us a fixed size to work with
{
gint slwantwidth, slwantheight;
slwantwidth = slvideo->resize_try_width;
slwantheight = slvideo->resize_try_height;
if (slwantwidth != width ||
slwantheight != height)
{
// don't like requested caps, we will issue our own suggestion - copy
// the requested caps but substitute our own width and height and see
// if our peer is happy with that.
GstCaps *desired_caps;
GstStructure *desired_struct;
desired_caps = llgst_caps_copy (caps);
desired_struct = llgst_caps_get_structure (desired_caps, 0);
GValue value = {0};
g_value_init(&value, G_TYPE_INT);
g_value_set_int(&value, slwantwidth);
llgst_structure_set_value (desired_struct, "width", &value);
g_value_unset(&value);
g_value_init(&value, G_TYPE_INT);
g_value_set_int(&value, slwantheight);
llgst_structure_set_value (desired_struct, "height", &value);
if (llgst_pad_peer_accept_caps (GST_VIDEO_SINK_PAD (slvideo),
desired_caps))
{
// todo: re-use buffers from a pool?
// todo: set MALLOCDATA to null, set DATA to point straight to shm?
// peer likes our cap suggestion
DEBUGMSG("peer loves us :)");
GST_BUFFER_SIZE(newbuf) = slwantwidth * slwantheight * MAXDEPTHHACK;
GST_BUFFER_MALLOCDATA(newbuf) = (guint8*)g_malloc(GST_BUFFER_SIZE(newbuf));
GST_BUFFER_DATA(newbuf) = GST_BUFFER_MALLOCDATA(newbuf);
llgst_buffer_set_caps (GST_BUFFER_CAST(newbuf), desired_caps);
made_bufferdata_ptr = true;
} else {
// peer hates our cap suggestion
INFOMSG("peer hates us :(");
llgst_caps_unref(desired_caps);
}
}
}
GST_OBJECT_UNLOCK(slvideo);
if (!made_bufferdata_ptr) // need to fallback to malloc at original size
{
GST_BUFFER_SIZE(newbuf) = width * height * MAXDEPTHHACK;
GST_BUFFER_MALLOCDATA(newbuf) = (guint8*)g_malloc(GST_BUFFER_SIZE(newbuf));
GST_BUFFER_DATA(newbuf) = GST_BUFFER_MALLOCDATA(newbuf);
llgst_buffer_set_caps (GST_BUFFER_CAST(newbuf), caps);
}
*buf = GST_BUFFER_CAST(newbuf);
return GST_FLOW_OK;
}
示例10: gst_amrwbenc_chain
static GstFlowReturn
gst_amrwbenc_chain (GstPad * pad, GstBuffer * buffer)
{
GstAmrwbEnc *amrwbenc;
GstFlowReturn ret = GST_FLOW_OK;
const int buffer_size = sizeof (Word16) * L_FRAME16k;
amrwbenc = GST_AMRWBENC (gst_pad_get_parent (pad));
g_return_val_if_fail (amrwbenc->handle, GST_FLOW_WRONG_STATE);
if (amrwbenc->rate == 0 || amrwbenc->channels == 0) {
ret = GST_FLOW_NOT_NEGOTIATED;
goto done;
}
/* discontinuity clears adapter, FIXME, maybe we can set some
* encoder flag to mask the discont. */
if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) {
gst_adapter_clear (amrwbenc->adapter);
amrwbenc->ts = 0;
amrwbenc->discont = TRUE;
}
if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer))
amrwbenc->ts = GST_BUFFER_TIMESTAMP (buffer);
ret = GST_FLOW_OK;
gst_adapter_push (amrwbenc->adapter, buffer);
/* Collect samples until we have enough for an output frame */
while (gst_adapter_available (amrwbenc->adapter) >= buffer_size) {
GstBuffer *out;
guint8 *data;
gint outsize;
out = gst_buffer_new_and_alloc (buffer_size);
GST_BUFFER_DURATION (out) = GST_SECOND * L_FRAME16k /
(amrwbenc->rate * amrwbenc->channels);
GST_BUFFER_TIMESTAMP (out) = amrwbenc->ts;
if (amrwbenc->ts != -1) {
amrwbenc->ts += GST_BUFFER_DURATION (out);
}
if (amrwbenc->discont) {
GST_BUFFER_FLAG_SET (out, GST_BUFFER_FLAG_DISCONT);
amrwbenc->discont = FALSE;
}
gst_buffer_set_caps (out, gst_pad_get_caps (amrwbenc->srcpad));
data = (guint8 *) gst_adapter_peek (amrwbenc->adapter, buffer_size);
/* encode */
outsize =
E_IF_encode (amrwbenc->handle, amrwbenc->bandmode, (Word16 *) data,
(UWord8 *) GST_BUFFER_DATA (out), 0);
gst_adapter_flush (amrwbenc->adapter, buffer_size);
GST_BUFFER_SIZE (out) = outsize;
/* play */
if ((ret = gst_pad_push (amrwbenc->srcpad, out)) != GST_FLOW_OK)
break;
}
done:
gst_object_unref (amrwbenc);
return ret;
}
示例11: gst_ape_demux_parse_tag
static GstTagDemuxResult
gst_ape_demux_parse_tag (GstTagDemux * demux, GstBuffer * buffer,
gboolean start_tag, guint * tag_size, GstTagList ** tags)
{
const guint8 *data;
const guint8 *footer;
gboolean have_header;
gboolean end_tag = !start_tag;
GstCaps *sink_caps;
guint version, footer_size;
GST_LOG_OBJECT (demux, "Parsing buffer of size %u", GST_BUFFER_SIZE (buffer));
data = GST_BUFFER_DATA (buffer);
footer = GST_BUFFER_DATA (buffer) + GST_BUFFER_SIZE (buffer) - 32;
GST_LOG_OBJECT (demux, "Checking for footer at offset 0x%04x",
(guint) (footer - data));
if (footer > data && memcmp (footer, "APETAGEX", 8) == 0) {
GST_DEBUG_OBJECT (demux, "Found footer");
footer_size = 32;
} else {
GST_DEBUG_OBJECT (demux, "No footer");
footer_size = 0;
}
/* APE tags at the end must have a footer */
if (end_tag && footer_size == 0) {
GST_WARNING_OBJECT (demux, "Tag at end of file without footer!");
return GST_TAG_DEMUX_RESULT_BROKEN_TAG;
}
/* don't trust the header/footer flags, better detect them ourselves */
have_header = (memcmp (data, "APETAGEX", 8) == 0);
if (start_tag && !have_header) {
GST_DEBUG_OBJECT (demux, "Tag at beginning of file without header!");
return GST_TAG_DEMUX_RESULT_BROKEN_TAG;
}
if (end_tag && !have_header) {
GST_DEBUG_OBJECT (demux, "Tag at end of file has no header (APEv1)");
*tag_size -= 32; /* adjust tag size */
}
if (have_header) {
version = GST_READ_UINT32_LE (data + 8);
} else {
version = GST_READ_UINT32_LE (footer + 8);
}
/* skip header */
if (have_header) {
data += 32;
}
GST_DEBUG_OBJECT (demux, "APE tag with version %u, size %u at offset 0x%08"
G_GINT64_MODIFIER "x", version, *tag_size,
GST_BUFFER_OFFSET (buffer) + ((have_header) ? 0 : 32));
if (APE_VERSION_MAJOR (version) != 1 && APE_VERSION_MAJOR (version) != 2) {
GST_WARNING ("APE tag is version %u.%03u, but decoder only supports "
"v1 or v2. Ignoring.", APE_VERSION_MAJOR (version), version % 1000);
return GST_TAG_DEMUX_RESULT_OK;
}
*tags = ape_demux_parse_tags (data, *tag_size - footer_size);
sink_caps = gst_static_pad_template_get_caps (&sink_factory);
gst_pb_utils_add_codec_description_to_tag_list (*tags,
GST_TAG_CONTAINER_FORMAT, sink_caps);
gst_caps_unref (sink_caps);
return GST_TAG_DEMUX_RESULT_OK;
}
示例12: gst_base_rtp_audio_payload_push_buffer
static GstFlowReturn
gst_base_rtp_audio_payload_push_buffer (GstBaseRTPAudioPayload *
baseaudiopayload, GstBuffer * buffer)
{
GstBaseRTPPayload *basepayload;
GstBaseRTPAudioPayloadPrivate *priv;
GstBuffer *outbuf;
GstClockTime timestamp;
guint8 *payload;
guint payload_len;
GstFlowReturn ret;
priv = baseaudiopayload->priv;
basepayload = GST_BASE_RTP_PAYLOAD (baseaudiopayload);
payload_len = GST_BUFFER_SIZE (buffer);
timestamp = GST_BUFFER_TIMESTAMP (buffer);
GST_DEBUG_OBJECT (baseaudiopayload, "Pushing %d bytes ts %" GST_TIME_FORMAT,
payload_len, GST_TIME_ARGS (timestamp));
if (priv->buffer_list) {
/* create just the RTP header buffer */
outbuf = gst_rtp_buffer_new_allocate (0, 0, 0);
} else {
/* create buffer to hold the payload */
outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0);
}
/* set metadata */
gst_base_rtp_audio_payload_set_meta (baseaudiopayload, outbuf, payload_len,
timestamp);
if (priv->buffer_list) {
GstBufferList *list;
GstBufferListIterator *it;
list = gst_buffer_list_new ();
it = gst_buffer_list_iterate (list);
/* add both buffers to the buffer list */
gst_buffer_list_iterator_add_group (it);
gst_buffer_list_iterator_add (it, outbuf);
gst_buffer_list_iterator_add (it, buffer);
gst_buffer_list_iterator_free (it);
GST_DEBUG_OBJECT (baseaudiopayload, "Pushing list %p", list);
ret = gst_basertppayload_push_list (basepayload, list);
} else {
/* copy payload */
payload = gst_rtp_buffer_get_payload (outbuf);
memcpy (payload, GST_BUFFER_DATA (buffer), payload_len);
gst_buffer_unref (buffer);
GST_DEBUG_OBJECT (baseaudiopayload, "Pushing buffer %p", outbuf);
ret = gst_basertppayload_push (basepayload, outbuf);
}
return ret;
}
示例13: gst_pgmdec_chain
static GstFlowReturn gst_pgmdec_chain (GstPad * pad, GstBuffer * in)
{
GstFlowReturn ret = GST_FLOW_OK;
GstBuffer *out;
Gstpgmdec *filter = GST_PGMDEC (GST_OBJECT_PARENT (pad));
//GstCaps *caps = GST_PAD_CAPS (filter->srcpad);
GstCaps *caps;
guint byts=0;
gchar line[4][20];
//const gchar *l;
gint i;
//GstStructure *structure = gst_caps_get_structure (caps, 0);
guint8 *outbuf;
guint8 *inbuf;
//Get pgm header
if(!GST_BUFFER_OFFSET(in)){
//filter->buff = in;
inbuf = (guint8 *) GST_BUFFER_DATA (in);
byts = sscanf(inbuf, "%s%s%s%s", line[0], line[1], line[2], line[3]);
if (strcmp(line[0], "P5") != 0) {
GST_WARNING ("It's not PGM file");
return FALSE;
}
filter->width = atoi(line[1]);
filter->height = atoi(line[2]);
filter->bpp = (atoi(line[3]) > 256) ? 16 : 8;
for(i=0; i<4; i++) byts += strlen(line[i]);
filter->size = (filter->bpp == 8) ? filter->width*filter->height : filter->width*filter->height*2;
//gst_buffer_set_data(filter->buff, &inbuf[byts], GST_BUFFER_SIZE(in)-byts);
//filter->buff = &inbuf[byts];
GST_DEBUG_OBJECT (filter, "The file type is : %s width = %d height = %d bpp = %d",
line[0], filter->width, filter->height, filter->bpp);
GST_DEBUG_OBJECT (filter, "DATA = %p SIZE = %d OFFSET = %d",
GST_BUFFER_DATA(in), GST_BUFFER_SIZE(in), GST_BUFFER_OFFSET(in));
filter->buff = gst_buffer_new_and_alloc(filter->size);
for(i=0;i < GST_BUFFER_SIZE(in)-byts; i++) GST_BUFFER_DATA(filter->buff)[i] = GST_BUFFER_DATA(in)[byts+i];
GST_BUFFER_OFFSET(filter->buff) = GST_BUFFER_SIZE(in)-byts;
gst_buffer_unref(in);
return GST_FLOW_OK;
//gst_event_new_seek (1.0,
// GST_FORMAT_BYTES,
// GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT |GST_SEEK_FLAG_ACCURATE,
// GST_SEEK_TYPE_SET, byts,
// GST_SEEK_TYPE_SET, filter->size + byts);
}
//Check for the buffer size
if(GST_BUFFER_OFFSET(filter->buff) < GST_BUFFER_SIZE(filter->buff)) {
for(i=0; i < GST_BUFFER_SIZE(in); i++) GST_BUFFER_DATA(filter->buff)[GST_BUFFER_OFFSET(filter->buff) + i] = GST_BUFFER_DATA(in)[i];
GST_BUFFER_OFFSET(filter->buff) += GST_BUFFER_SIZE(in);
//GST_DEBUG_OBJECT (filter, "DATA = %p SIZE = %d OFFSET = %d",GST_BUFFER_DATA(filter->buff), GST_BUFFER_SIZE(filter->buff),GST_BUFFER_OFFSET(filter->buff));
gst_buffer_unref(in);
if(GST_BUFFER_OFFSET(filter->buff) != GST_BUFFER_SIZE(filter->buff)) return GST_FLOW_OK;
}
GST_DEBUG_OBJECT (filter, "DATA = %p SIZE = %d OFFSET = %d",
GST_BUFFER_DATA(filter->buff), GST_BUFFER_SIZE(filter->buff), GST_BUFFER_OFFSET(filter->buff));
caps = gst_caps_new_simple ("video/x-raw-bayer",
"width", G_TYPE_INT, filter->width,
"height", G_TYPE_INT, filter->height,
"bpp", G_TYPE_INT, filter->bpp,
"framerate", GST_TYPE_FRACTION, 0, 1,
NULL);
gst_buffer_set_caps(filter->buff, caps);
gst_pad_set_caps (filter->srcpad, caps);
gst_pad_use_fixed_caps (filter->srcpad);
gst_caps_unref (caps);
/* just push out the incoming buffer without touching it */
ret = gst_pad_push(filter->srcpad, filter->buff);
return ret;
}
示例14: start_play_tune
static gboolean
start_play_tune (GstNsfDec * nsfdec)
{
gboolean res;
nsfdec->nsf = nsf_load (NULL, GST_BUFFER_DATA (nsfdec->tune_buffer),
GST_BUFFER_SIZE (nsfdec->tune_buffer));
if (!nsfdec->nsf)
goto could_not_load;
if (!nsfdec_negotiate (nsfdec))
goto could_not_negotiate;
nsfdec->taglist = gst_tag_list_new ();
gst_tag_list_add (nsfdec->taglist, GST_TAG_MERGE_REPLACE,
GST_TAG_AUDIO_CODEC, "NES Sound Format", NULL);
if (nsfdec->nsf->artist_name)
gst_tag_list_add (nsfdec->taglist, GST_TAG_MERGE_REPLACE,
GST_TAG_ARTIST, nsfdec->nsf->artist_name, NULL);
if (nsfdec->nsf->song_name)
gst_tag_list_add (nsfdec->taglist, GST_TAG_MERGE_REPLACE,
GST_TAG_TITLE, nsfdec->nsf->song_name, NULL);
gst_element_post_message (GST_ELEMENT_CAST (nsfdec),
gst_message_new_tag (GST_OBJECT (nsfdec),
gst_tag_list_copy (nsfdec->taglist)));
nsf_playtrack (nsfdec->nsf,
nsfdec->tune_number, nsfdec->frequency, nsfdec->bits, nsfdec->stereo);
nsf_setfilter (nsfdec->nsf, nsfdec->filter);
nsfdec->bps = (nsfdec->bits >> 3) * nsfdec->channels;
/* calculate the number of bytes we need to output after each call to
* nsf_frame(). */
nsfdec->blocksize =
nsfdec->bps * nsfdec->frequency / nsfdec->nsf->playback_rate;
gst_pad_push_event (nsfdec->srcpad,
gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, -1, 0));
res = gst_pad_start_task (nsfdec->srcpad,
(GstTaskFunction) play_loop, nsfdec->srcpad, NULL);
return res;
/* ERRORS */
could_not_load:
{
GST_ELEMENT_ERROR (nsfdec, LIBRARY, INIT,
("Could not load tune"), ("Could not load tune"));
return FALSE;
}
could_not_negotiate:
{
GST_ELEMENT_ERROR (nsfdec, CORE, NEGOTIATION,
("Could not negotiate format"), ("Could not negotiate format"));
return FALSE;
}
}
示例15: gst_v4l2_buffer_new
static GstV4l2Buffer *
gst_v4l2_buffer_new (GstV4l2BufferPool * pool, guint index, GstCaps * caps)
{
GstV4l2Buffer *ret;
guint8 *data;
ret = (GstV4l2Buffer *) gst_mini_object_new (GST_TYPE_V4L2_BUFFER);
GST_LOG_OBJECT (pool->v4l2elem, "creating buffer %u, %p in pool %p", index,
ret, pool);
ret->pool =
(GstV4l2BufferPool *) gst_mini_object_ref (GST_MINI_OBJECT (pool));
ret->vbuffer.index = index;
ret->vbuffer.type = pool->type;
ret->vbuffer.memory = V4L2_MEMORY_MMAP;
if (v4l2_ioctl (pool->video_fd, VIDIOC_QUERYBUF, &ret->vbuffer) < 0)
goto querybuf_failed;
GST_LOG_OBJECT (pool->v4l2elem, " index: %u", ret->vbuffer.index);
GST_LOG_OBJECT (pool->v4l2elem, " type: %d", ret->vbuffer.type);
GST_LOG_OBJECT (pool->v4l2elem, " bytesused: %u", ret->vbuffer.bytesused);
GST_LOG_OBJECT (pool->v4l2elem, " flags: %08x", ret->vbuffer.flags);
GST_LOG_OBJECT (pool->v4l2elem, " field: %d", ret->vbuffer.field);
GST_LOG_OBJECT (pool->v4l2elem, " memory: %d", ret->vbuffer.memory);
if (ret->vbuffer.memory == V4L2_MEMORY_MMAP)
GST_LOG_OBJECT (pool->v4l2elem, " MMAP offset: %u",
ret->vbuffer.m.offset);
GST_LOG_OBJECT (pool->v4l2elem, " length: %u", ret->vbuffer.length);
//GST_LOG_OBJECT (pool->v4l2elem, " input: %u", ret->vbuffer.input);
data = (guint8 *) v4l2_mmap (0, ret->vbuffer.length,
PROT_READ | PROT_WRITE, MAP_SHARED, pool->video_fd,
ret->vbuffer.m.offset);
if (data == MAP_FAILED)
goto mmap_failed;
GST_BUFFER_DATA (ret) = data;
GST_BUFFER_SIZE (ret) = ret->vbuffer.length;
GST_BUFFER_FLAG_SET (ret, GST_BUFFER_FLAG_READONLY);
gst_buffer_set_caps (GST_BUFFER (ret), caps);
return ret;
/* ERRORS */
querybuf_failed:
{
gint errnosave = errno;
GST_WARNING ("Failed QUERYBUF: %s", g_strerror (errnosave));
gst_buffer_unref (GST_BUFFER (ret));
errno = errnosave;
return NULL;
}
mmap_failed:
{
gint errnosave = errno;
GST_WARNING ("Failed to mmap: %s", g_strerror (errnosave));
gst_buffer_unref (GST_BUFFER (ret));
errno = errnosave;
return NULL;
}
}