static GstFlowReturn gst_rtp_gsm_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstRTPGSMPay *rtpgsmpay; guint size, payload_len; GstBuffer *outbuf; guint8 *payload, *data; GstClockTime timestamp, duration; GstFlowReturn ret; rtpgsmpay = GST_RTP_GSM_PAY (basepayload); size = GST_BUFFER_SIZE (buffer); timestamp = GST_BUFFER_TIMESTAMP (buffer); duration = GST_BUFFER_DURATION (buffer); /* FIXME, only one GSM frame per RTP packet for now */ payload_len = size; /* FIXME, just error out for now */ if (payload_len > GST_BASE_RTP_PAYLOAD_MTU (rtpgsmpay)) { GST_ELEMENT_ERROR (rtpgsmpay, STREAM, ENCODE, (NULL), ("payload_len %u > mtu %u", payload_len, GST_BASE_RTP_PAYLOAD_MTU (rtpgsmpay))); return GST_FLOW_ERROR; } outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); /* copy timestamp and duration */ GST_BUFFER_TIMESTAMP (outbuf) = timestamp; GST_BUFFER_DURATION (outbuf) = duration; /* get payload */ payload = gst_rtp_buffer_get_payload (outbuf); data = GST_BUFFER_DATA (buffer); /* copy data in payload */ memcpy (&payload[0], data, size); gst_buffer_unref (buffer); GST_DEBUG ("gst_rtp_gsm_pay_chain: pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); ret = gst_basertppayload_push (basepayload, outbuf); return ret; }
static GstFlowReturn gst_rtp_gsm_pay_handle_buffer (GstRTPBasePayload * basepayload, GstBuffer * buffer) { GstRTPGSMPay *rtpgsmpay; guint payload_len; GstBuffer *outbuf; GstClockTime timestamp, duration; GstFlowReturn ret; rtpgsmpay = GST_RTP_GSM_PAY (basepayload); timestamp = GST_BUFFER_PTS (buffer); duration = GST_BUFFER_DURATION (buffer); /* FIXME, only one GSM frame per RTP packet for now */ payload_len = gst_buffer_get_size (buffer); /* FIXME, just error out for now */ if (payload_len > GST_RTP_BASE_PAYLOAD_MTU (rtpgsmpay)) goto too_big; outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); /* copy timestamp and duration */ GST_BUFFER_PTS (outbuf) = timestamp; GST_BUFFER_DURATION (outbuf) = duration; gst_rtp_copy_meta (GST_ELEMENT_CAST (rtpgsmpay), outbuf, buffer, g_quark_from_static_string (GST_META_TAG_AUDIO_STR)); /* append payload */ outbuf = gst_buffer_append (outbuf, buffer); GST_DEBUG ("gst_rtp_gsm_pay_chain: pushing buffer of size %" G_GSIZE_FORMAT, gst_buffer_get_size (outbuf)); ret = gst_rtp_base_payload_push (basepayload, outbuf); return ret; /* ERRORS */ too_big: { GST_ELEMENT_ERROR (rtpgsmpay, STREAM, ENCODE, (NULL), ("payload_len %u > mtu %u", payload_len, GST_RTP_BASE_PAYLOAD_MTU (rtpgsmpay))); return GST_FLOW_ERROR; } }
static GstFlowReturn gst_rtp_gsm_pay_handle_buffer (GstRTPBasePayload * basepayload, GstBuffer * buffer) { GstRTPGSMPay *rtpgsmpay; guint payload_len; GstBuffer *outbuf; GstMapInfo map; guint8 *payload; GstClockTime timestamp, duration; GstFlowReturn ret; GstRTPBuffer rtp = { NULL }; rtpgsmpay = GST_RTP_GSM_PAY (basepayload); gst_buffer_map (buffer, &map, GST_MAP_READ); timestamp = GST_BUFFER_TIMESTAMP (buffer); duration = GST_BUFFER_DURATION (buffer); /* FIXME, only one GSM frame per RTP packet for now */ payload_len = map.size; /* FIXME, just error out for now */ if (payload_len > GST_RTP_BASE_PAYLOAD_MTU (rtpgsmpay)) goto too_big; outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); /* copy timestamp and duration */ GST_BUFFER_TIMESTAMP (outbuf) = timestamp; GST_BUFFER_DURATION (outbuf) = duration; /* get payload */ gst_rtp_buffer_map (outbuf, GST_MAP_WRITE, &rtp); /* copy data in payload */ payload = gst_rtp_buffer_get_payload (&rtp); memcpy (payload, map.data, map.size); gst_rtp_buffer_unmap (&rtp); gst_buffer_unmap (buffer, &map); gst_buffer_unref (buffer); GST_DEBUG ("gst_rtp_gsm_pay_chain: pushing buffer of size %" G_GSIZE_FORMAT, gst_buffer_get_size (outbuf)); ret = gst_rtp_base_payload_push (basepayload, outbuf); return ret; /* ERRORS */ too_big: { GST_ELEMENT_ERROR (rtpgsmpay, STREAM, ENCODE, (NULL), ("payload_len %u > mtu %u", payload_len, GST_RTP_BASE_PAYLOAD_MTU (rtpgsmpay))); gst_buffer_unmap (buffer, &map); return GST_FLOW_ERROR; } }