static GstFlowReturn gst_y4m_encode_handle_frame (GstVideoEncoder * encoder, GstVideoCodecFrame * frame) { GstY4mEncode *filter = GST_Y4M_ENCODE (encoder); GstClockTime timestamp; /* check we got some decent info from caps */ if (GST_VIDEO_INFO_FORMAT (&filter->info) == GST_VIDEO_FORMAT_UNKNOWN) goto not_negotiated; timestamp = GST_BUFFER_TIMESTAMP (frame->input_buffer); if (G_UNLIKELY (!filter->header)) { gboolean tff = FALSE; if (GST_VIDEO_INFO_IS_INTERLACED (&filter->info)) { tff = GST_BUFFER_FLAG_IS_SET (frame->input_buffer, GST_VIDEO_BUFFER_FLAG_TFF); } frame->output_buffer = gst_y4m_encode_get_stream_header (filter, tff); filter->header = TRUE; frame->output_buffer = gst_buffer_append (frame->output_buffer, gst_y4m_encode_get_frame_header (filter)); } else { frame->output_buffer = gst_y4m_encode_get_frame_header (filter); } frame->output_buffer = gst_buffer_append (frame->output_buffer, gst_buffer_copy (frame->input_buffer)); /* decorate */ frame->output_buffer = gst_buffer_make_writable (frame->output_buffer); GST_BUFFER_TIMESTAMP (frame->output_buffer) = timestamp; return gst_video_encoder_finish_frame (encoder, frame); not_negotiated: { GST_ELEMENT_ERROR (filter, CORE, NEGOTIATION, (NULL), ("format wasn't negotiated")); return GST_FLOW_NOT_NEGOTIATED; } }
static GstFlowReturn gst_y4m_encode_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) { GstY4mEncode *filter = GST_Y4M_ENCODE (parent); GstBuffer *outbuf; GstClockTime timestamp; /* check we got some decent info from caps */ if (GST_VIDEO_INFO_FORMAT (&filter->info) == GST_VIDEO_FORMAT_UNKNOWN) goto not_negotiated; timestamp = GST_BUFFER_TIMESTAMP (buf); if (G_UNLIKELY (!filter->header)) { gboolean tff; if (GST_VIDEO_INFO_IS_INTERLACED (&filter->info)) { tff = GST_BUFFER_FLAG_IS_SET (buf, GST_VIDEO_BUFFER_FLAG_TFF); } outbuf = gst_y4m_encode_get_stream_header (filter, tff); filter->header = TRUE; outbuf = gst_buffer_append (outbuf, gst_y4m_encode_get_frame_header (filter)); } else { outbuf = gst_y4m_encode_get_frame_header (filter); } /* join with data, FIXME, strides are all wrong etc */ outbuf = gst_buffer_append (outbuf, buf); /* decorate */ outbuf = gst_buffer_make_writable (outbuf); GST_BUFFER_TIMESTAMP (outbuf) = timestamp; return gst_pad_push (filter->srcpad, outbuf); /* ERRORS */ not_negotiated: { GST_ELEMENT_ERROR (filter, CORE, NEGOTIATION, (NULL), ("format wasn't negotiated before chain function")); gst_buffer_unref (buf); return GST_FLOW_NOT_NEGOTIATED; } }
static GstFlowReturn gst_y4m_encode_chain (GstPad * pad, GstBuffer * buf) { GstY4mEncode *filter = GST_Y4M_ENCODE (GST_PAD_PARENT (pad)); GstBuffer *outbuf; GstClockTime timestamp; /* check we got some decent info from caps */ if (filter->width < 0) { GST_ELEMENT_ERROR ("filter", CORE, NEGOTIATION, (NULL), ("format wasn't negotiated before chain function")); gst_buffer_unref (buf); return GST_FLOW_NOT_NEGOTIATED; } timestamp = GST_BUFFER_TIMESTAMP (buf); if (G_UNLIKELY (!filter->header)) { if (filter->interlaced == TRUE) { if (GST_BUFFER_FLAG_IS_SET (buf, GST_VIDEO_BUFFER_TFF)) { filter->top_field_first = TRUE; } else { filter->top_field_first = FALSE; } } outbuf = gst_y4m_encode_get_stream_header (filter); filter->header = TRUE; outbuf = gst_buffer_join (outbuf, gst_y4m_encode_get_frame_header (filter)); } else { outbuf = gst_y4m_encode_get_frame_header (filter); } /* join with data */ outbuf = gst_buffer_join (outbuf, buf); /* decorate */ gst_buffer_make_metadata_writable (outbuf); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (filter->srcpad)); GST_BUFFER_TIMESTAMP (outbuf) = timestamp; return gst_pad_push (filter->srcpad, outbuf); }