[prev in list] [next in list] [prev in thread] [next in thread]
List: gstreamer-cvs
Subject: [gst-cvs] gst-plugins-bad: rtpvp8pay: Treat the frame header just
From: sjoerd () kemper ! freedesktop ! org (Sjoerd Simons)
Date: 2011-01-30 14:53:05
Message-ID: 20110130145305.791961004C () kemper ! freedesktop ! org
[Download RAW message or body]
Module: gst-plugins-bad
Branch: master
Commit: 0bee149c74a22ad9a08f46eebe25b5a88b7fb204
URL: http://cgit.freedesktop.org/gstreamer/gst-plugins-bad/commit/?id=0bee149c74a22ad9a08f46eebe25b5a88b7fb204
Author: Sjoerd Simons <sjoerd@luon.net>
Date: Sun Jan 23 16:42:17 2011 +0000
rtpvp8pay: Treat the frame header just like any other partition
When setting up the initial mapping just act as if the global frame
information is another partition. This saves special-casing it later in
the actual packetizing code.
---
gst/rtpvp8/gstrtpvp8pay.c | 64 +++++++++++++++-----------------------------
gst/rtpvp8/gstrtpvp8pay.h | 8 +++---
2 files changed, 26 insertions(+), 46 deletions(-)
diff --git a/gst/rtpvp8/gstrtpvp8pay.c b/gst/rtpvp8/gstrtpvp8pay.c
index 8a55270..0ea5777 100644
--- a/gst/rtpvp8/gstrtpvp8pay.c
+++ b/gst/rtpvp8/gstrtpvp8pay.c
@@ -264,7 +264,7 @@ gst_rtp_vp8_pay_parse_frame (GstRtpVP8Pay * self, GstBuffer * \
buffer) if (!gst_bit_reader_get_bits_uint8 (reader, &tmp8, 2))
goto error;
- self->n_partitions = partitions = 1 << tmp8;
+ partitions = 1 << tmp8;
/* Check if things are still sensible */
if (header_size + (partitions - 1) * 3 >= GST_BUFFER_SIZE (buffer))
@@ -273,12 +273,14 @@ gst_rtp_vp8_pay_parse_frame (GstRtpVP8Pay * self, GstBuffer * \
buffer) /* partition data is right after the frame header */
data = GST_BUFFER_DATA (buffer) + header_size;
- self->partition_offset[0] = header_size + (partitions - 1) * 3;
+ /* Set up mapping, count the initial header as a partition to make other
+ * sections of the code easier */
+ self->n_partitions = partitions + 1;
+ self->partition_offset[0] = 0;
+ self->partition_size[0] = header_size + (partitions - 1) * 3;
- /* Include partition data in the header for RTP purposes */
- self->header_size = self->partition_offset[0];
-
- for (i = 0; i < (partitions - 1); i++) {
+ self->partition_offset[1] = self->partition_size[0];
+ for (i = 1; i < partitions; i++) {
guint size = (data[2] << 16 | data[1] << 8 | data[0]);
data += 3;
@@ -313,15 +315,6 @@ gst_rtp_vp8_fit_partitions (GstRtpVP8Pay * self, gint first, \
gsize available)
g_assert (first < self->n_partitions);
- if (first < 0) {
- if (self->header_size > available)
- return 0;
-
- available -= self->header_size;
- num++;
- first = 0;
- }
-
for (i = first;
i < self->n_partitions && self->partition_size[i] < available; i++) {
num++;
@@ -333,16 +326,10 @@ gst_rtp_vp8_fit_partitions (GstRtpVP8Pay * self, gint first, \
gsize available)
static GstBuffer *
gst_rtp_vp8_create_sub (GstRtpVP8Pay * self,
- GstBuffer * buffer, gint current, guint num)
+ GstBuffer * buffer, guint current, guint num)
{
- guint offset = 0;
- guint size;
-
- if (current >= 0) {
- offset = self->partition_offset[current];
- }
-
- size = self->partition_offset[current + num] - offset;
+ guint offset = self->partition_offset[current];
+ guint size = self->partition_offset[current + num] - offset;
return gst_buffer_create_sub (buffer, offset, size);
}
@@ -350,7 +337,7 @@ gst_rtp_vp8_create_sub (GstRtpVP8Pay * self,
static guint
gst_rtp_vp8_payload_next (GstRtpVP8Pay * self,
- GstBufferListIterator * it, gint first, GstBuffer * buffer)
+ GstBufferListIterator * it, guint first, GstBuffer * buffer)
{
guint num;
GstBuffer *header;
@@ -358,7 +345,7 @@ gst_rtp_vp8_payload_next (GstRtpVP8Pay * self,
gboolean mark;
gsize available = gst_rtp_vp8_calc_payload_len (GST_BASE_RTP_PAYLOAD (self));
- g_assert (first < 8);
+ g_assert (first < 9);
/* How many partitions can we fit */
num = gst_rtp_vp8_fit_partitions (self, first, available);
@@ -366,7 +353,7 @@ gst_rtp_vp8_payload_next (GstRtpVP8Pay * self,
if (num > 0) {
mark = (first + num == self->n_partitions);
/* whole set of partitions, payload them and done */
- header = gst_rtp_vp8_create_header_buffer (first == -1, mark,
+ header = gst_rtp_vp8_create_header_buffer (first == 0, mark,
FI_FRAG_UNFRAGMENTED, buffer);
sub = gst_rtp_vp8_create_sub (self, buffer, first, num);
@@ -375,18 +362,11 @@ gst_rtp_vp8_payload_next (GstRtpVP8Pay * self,
gst_buffer_list_iterator_add (it, sub);
} else {
/* Fragmented packets */
- guint left;
- guint offset;
-
- if (first >= 0) {
- offset = self->partition_offset[first];
- left = self->partition_size[first];
- } else {
- offset = 0;
- left = self->header_size;
- }
+ guint offset = self->partition_offset[first];
+ guint left = self->partition_size[first];
+ gboolean start = (first == 0);
- header = gst_rtp_vp8_create_header_buffer (first == -1, FALSE,
+ header = gst_rtp_vp8_create_header_buffer (start, FALSE,
FI_FRAG_START, buffer);
sub = gst_buffer_create_sub (buffer, offset, available);
offset += available;
@@ -398,7 +378,7 @@ gst_rtp_vp8_payload_next (GstRtpVP8Pay * self,
left -= available;
for (; left > available; left -= available) {
- header = gst_rtp_vp8_create_header_buffer (first == -1, FALSE,
+ header = gst_rtp_vp8_create_header_buffer (start, FALSE,
FI_FRAG_MIDDLE, buffer);
sub = gst_buffer_create_sub (buffer, offset, available);
@@ -411,7 +391,7 @@ gst_rtp_vp8_payload_next (GstRtpVP8Pay * self,
mark = (first + 1 == self->n_partitions);
- header = gst_rtp_vp8_create_header_buffer (first == -1, mark,
+ header = gst_rtp_vp8_create_header_buffer (start, mark,
FI_FRAG_END, buffer);
sub = gst_buffer_create_sub (buffer, offset, left);
@@ -433,7 +413,7 @@ gst_rtp_vp8_pay_handle_buffer (GstBaseRTPPayload * payload, \
GstBuffer * buffer) GstFlowReturn ret;
GstBufferList *list;
GstBufferListIterator *it;
- gint current;
+ guint current;
if (G_UNLIKELY (!gst_rtp_vp8_pay_parse_frame (self, buffer))) {
/* FIXME throw flow error */
@@ -444,7 +424,7 @@ gst_rtp_vp8_pay_handle_buffer (GstBaseRTPPayload * payload, \
GstBuffer * buffer) list = gst_buffer_list_new ();
it = gst_buffer_list_iterate (list);
- for (current = -1; current < self->n_partitions;) {
+ for (current = 0; current < self->n_partitions;) {
guint n;
n = gst_rtp_vp8_payload_next (self, it, current, buffer);
diff --git a/gst/rtpvp8/gstrtpvp8pay.h b/gst/rtpvp8/gstrtpvp8pay.h
index ea76534..19a2e01 100644
--- a/gst/rtpvp8/gstrtpvp8pay.h
+++ b/gst/rtpvp8/gstrtpvp8pay.h
@@ -37,10 +37,10 @@ struct _GstRtpVP8Pay
GstBaseRTPPayload parent;
gboolean is_keyframe;
gint n_partitions;
- guint header_size;
- /* Add the end offset for easier implementation */
- guint partition_offset[9];
- guint partition_size[8];
+ /* Treat frame header & tag & partition size block as the first partition,
+ * folowed by max. 8 data partitions. last offset is the end of the buffer */
+ guint partition_offset[10];
+ guint partition_size[9];
};
GType gst_rtp_vp8_pay_get_type (void);
------------------------------------------------------------------------------
Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)!
Finally, a world-class log management solution at an even better price-free!
Download using promo code Free_Logger_4_Dev2Dev. Offer expires
February 28th, so secure your free ArcSight Logger TODAY!
http://p.sf.net/sfu/arcsight-sfd2d
_______________________________________________
gstreamer-cvs mailing list
gstreamer-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gstreamer-cvs
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic