summaryrefslogtreecommitdiffstats
path: root/gst/rtp/gstrtph263pay.h
diff options
context:
space:
mode:
authorJanin Kolenc <janin.kolenc at marand.si>2009-04-14 18:44:51 +0200
committerWim Taymans <wim.taymans@collabora.co.uk>2009-04-14 18:44:51 +0200
commitde2c4895268948e10f37be29376c10ee64965a52 (patch)
tree035a4eb7e6e56309de4baec7c1b9957afcfe746b /gst/rtp/gstrtph263pay.h
parentcb344828a48972df12c99c8b24cdc502ec3c2303 (diff)
h263pay: Fix the payloader
Fix the H263 payloader to be more RFC 2190 compliant. See #509311
Diffstat (limited to 'gst/rtp/gstrtph263pay.h')
-rw-r--r--gst/rtp/gstrtph263pay.h364
1 files changed, 358 insertions, 6 deletions
diff --git a/gst/rtp/gstrtph263pay.h b/gst/rtp/gstrtph263pay.h
index b8274fed..6a50882a 100644
--- a/gst/rtp/gstrtph263pay.h
+++ b/gst/rtp/gstrtph263pay.h
@@ -1,5 +1,5 @@
/* GStreamer
- * Copyright (C) <2005> Wim Taymans <wim.taymans@gmail.com>
+ * Copyright (C) <2005> Wim Taymans <wim@fluendo.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -15,6 +15,8 @@
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
+ *
+ * Author: Dejan Sakelsak sahel@kiberpipa.org
*/
#ifndef __GST_RTP_H263_PAY_H__
@@ -25,7 +27,6 @@
#include <gst/base/gstadapter.h>
G_BEGIN_DECLS
-
#define GST_TYPE_RTP_H263_PAY \
(gst_rtp_h263_pay_get_type())
#define GST_RTP_H263_PAY(obj) \
@@ -36,17 +37,53 @@ G_BEGIN_DECLS
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_H263_PAY))
#define GST_IS_RTP_H263_PAY_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_H263_PAY))
+// blocks per macroblock
+#define N_BLOCKS 6
+#define DEFAULT_MODE_A TRUE
+#define MTU_SECURITY_OFFSET 50
+ typedef enum _GstRtpH263PayHeaderMode
+{
+ GST_RTP_H263_PAYLOAD_HEADER_MODE_A = 4,
+ GST_RTP_H263_PAYLOAD_HEADER_MODE_B = 8,
+ GST_RTP_H263_PAYLOAD_HEADER_MODE_C = 12
+} GstRtpH263PayHeaderMode;
-typedef struct _GstRtpH263Pay GstRtpH263Pay;
+typedef struct _GstRtpH263PayContext GstRtpH263PayContext;
+typedef struct _GstRtpH263PayPic GstRtpH263PayPic;
typedef struct _GstRtpH263PayClass GstRtpH263PayClass;
+typedef struct _GstRtpH263Pay GstRtpH263Pay;
+typedef struct _GstRtpH263PayBoundry GstRtpH263PayBoundry;
+typedef struct _GstRtpH263PayMB GstRtpH263PayMB;
+typedef struct _GstRtpH263PayGob GstRtpH263PayGob;
+typedef struct _GstRtpH263PayPackage GstRtpH263PayPackage;
+
+//typedef enum _GstRtpH263PayHeaderMode GstRtpH263PayHeaderMode;
struct _GstRtpH263Pay
{
GstBaseRTPPayload payload;
GstAdapter *adapter;
- GstClockTime first_timestamp;
- GstClockTime first_duration;
+ GstClockTime first_ts;
+#if 0
+ gboolean prop_payload_mode;
+#endif
+ guint8 *data;
+ guint available_data;
+
+};
+
+struct _GstRtpH263PayContext
+{
+ GstRtpH263PayPic *piclayer;
+
+ guint mtu;
+ guint window;
+ guint8 *win_end;
+ guint8 cpm;
+
+ GstRtpH263PayGob **gobs;
+
};
struct _GstRtpH263PayClass
@@ -54,8 +91,323 @@ struct _GstRtpH263PayClass
GstBaseRTPPayloadClass parent_class;
};
+typedef struct _GstRtpH263PayAHeader
+{
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ unsigned int ebit:3; /* End position */
+ unsigned int sbit:3; /* Start position */
+ unsigned int p:1; /* PB-frames mode */
+ unsigned int f:1; /* flag bit */
+
+ unsigned int r1:1; /* Reserved */
+ unsigned int a:1; /* Advanced Prediction */
+ unsigned int s:1; /* syntax based arithmetic coding */
+ unsigned int u:1; /* Unrestricted motion vector */
+ unsigned int i:1; /* Picture coding type */
+ unsigned int src:3; /* Source format */
+
+ unsigned int trb:3; /* Temporal ref for B frame */
+ unsigned int dbq:2; /* Differential Quantisation parameter */
+ unsigned int r2:3; /* Reserved */
+#elif G_BYTE_ORDER == G_BIG_ENDIAN
+ unsigned int f:1; /* flag bit */
+ unsigned int p:1; /* PB-frames mode */
+ unsigned int sbit:3; /* Start position */
+ unsigned int ebit:3; /* End position */
+
+ unsigned int src:3; /* Source format */
+ unsigned int i:1; /* Picture coding type */
+ unsigned int u:1; /* Unrestricted motion vector */
+ unsigned int s:1; /* syntax based arithmetic coding */
+ unsigned int a:1; /* Advanced Prediction */
+ unsigned int r1:1; /* Reserved */
+
+ unsigned int r2:3; /* Reserved */
+ unsigned int dbq:2; /* Differential Quantisation parameter */
+ unsigned int trb:3; /* Temporal ref for B frame */
+#else
+#error "G_BYTE_ORDER should be big or little endian."
+#endif
+ unsigned int tr:8; /* Temporal ref for P frame */
+} GstRtpH263PayAHeader;
+
+typedef struct _GstRtpH263PayBHeader
+{
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ unsigned int ebit:3; /* End position */
+ unsigned int sbit:3; /* Start position */
+ unsigned int p:1; /* PB-frames mode */
+ unsigned int f:1; /* flag bit */
+
+ unsigned int quant:5; /* Quantization value for first MB */
+ unsigned int src:3; /* Source format */
+
+ unsigned int mba1:3; /* Address of first MB starting count from 0 - part1 */
+ unsigned int gobn:5; /* GOB number in effect at start of packet */
+
+ unsigned int r:2; /* Reserved */
+ unsigned int mba2:6; /* Address of first MB starting count from 0 - part2 */
+
+ unsigned int hmv11:4; /* horizontal motion vector predictor for MB 1 - part 1 */
+ unsigned int a:1; /* Advanced Prediction */
+ unsigned int s:1; /* syntax based arithmetic coding */
+ unsigned int u:1; /* Unrestricted motion vector */
+ unsigned int i:1; /* Picture coding type */
+
+ unsigned int vmv11:5; /* vertical motion vector predictor for MB 1 - part 1 */
+ unsigned int hmv12:3; /* horizontal motion vector predictor for MB 1 - part 2 */
+
+ unsigned int hmv21:6; /* horizontal motion vector predictor for MB 3 - part 1 */
+ unsigned int vmv12:2; /* vertical motion vector predictor for MB 1 - part 2 */
+
+ unsigned int vmv21:7; /* vertical motion vector predictor for MB 3 */
+ unsigned int hmv22:1; /* horizontal motion vector predictor for MB 3 - part 2 */
+
+#elif G_BYTE_ORDER == G_BIG_ENDIAN
+ unsigned int f:1; /* flag bit */
+ unsigned int p:1; /* PB-frames mode */
+ unsigned int sbit:3; /* Start position */
+ unsigned int ebit:3; /* End position */
+
+ unsigned int src:3; /* Source format */
+ unsigned int quant:5; /* Quantization value for first MB */
+
+ unsigned int gobn:5; /* GOB number in effect at start of packet */
+ unsigned int mba1:3; /* Address of first MB starting count from 0 - part1 */
+
+ unsigned int mba2:6; /* Address of first MB starting count from 0 - part2 */
+ unsigned int r:2; /* Reserved */
+
+ unsigned int i:1; /* Picture coding type */
+ unsigned int u:1; /* Unrestricted motion vector */
+ unsigned int s:1; /* syntax based arithmetic coding */
+ unsigned int a:1; /* Advanced Prediction */
+ unsigned int hmv11:4; /* horizontal motion vector predictor for MB 1 - part 1 */
+
+ unsigned int hmv12:3; /* horizontal motion vector predictor for MB 1 - part 2 */
+ unsigned int vmv11:5; /* vertical motion vector predictor for MB 1 - part 1 */
+
+ unsigned int vmv12:2; /* vertical motion vector predictor for MB 1 - part 2 */
+ unsigned int hmv21:6; /* horizontal motion vector predictor for MB 3 - part 1 */
+
+ unsigned int hmv22:1; /* horizontal motion vector predictor for MB 3 - part 2 */
+ unsigned int vmv21:7 /* vertical motion vector predictor for MB 3 */
+#else
+#error "G_BYTE_ORDER should be big or little endian."
+#endif
+} GstRtpH263PayBHeader;
+
+typedef struct _GstRtpH263PayCHeader
+{
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ unsigned int ebit:3; /* End position */
+ unsigned int sbit:3; /* Start position */
+ unsigned int p:1; /* PB-frames mode */
+ unsigned int f:1; /* flag bit */
+
+ unsigned int quant:5; /* Quantization value for first MB */
+ unsigned int src:3; /* Source format */
+
+ unsigned int mba1:3; /* Address of first MB starting count from 0 - part1 */
+ unsigned int gobn:5; /* GOB number in effect at start of packet */
+
+ unsigned int r:2; /* Reserved */
+ unsigned int mba2:6; /* Address of first MB starting count from 0 - part2 */
+
+ unsigned int hmv11:4; /* horizontal motion vector predictor for MB 1 - part 1 */
+ unsigned int a:1; /* Advanced Prediction */
+ unsigned int s:1; /* syntax based arithmetic coding */
+ unsigned int u:1; /* Unrestricted motion vector */
+ unsigned int i:1; /* Picture coding type */
+
+ unsigned int vmv11:5; /* vertical motion vector predictor for MB 1 - part 1 */
+ unsigned int hmv12:3; /* horizontal motion vector predictor for MB 1 - part 2 */
+
+ unsigned int hmv21:6; /* horizontal motion vector predictor for MB 3 - part 1 */
+ unsigned int vmv12:2; /* vertical motion vector predictor for MB 1 - part 2 */
+
+ unsigned int vmv21:7; /* vertical motion vector predictor for MB 3 */
+ unsigned int hmv22:1; /* horizontal motion vector predictor for MB 3 - part 2 */
+
+ unsigned int rr1:8; /* reserved */
+
+ unsigned int rr2:8; /* reserved */
+
+ unsigned int trb:3; /* Temporal Reference for the B */
+ unsigned int dbq:2; /* Differential quantization parameter */
+ unsigned int rr3:3; /* reserved */
+
+ unsigned int tr:8; /* Temporal Reference for the P frame */
+
+#elif G_BYTE_ORDER == G_BIG_ENDIAN
+ unsigned int f:1; /* flag bit */
+ unsigned int p:1; /* PB-frames mode */
+ unsigned int sbit:3; /* Start position */
+ unsigned int ebit:3; /* End position */
+
+ unsigned int src:3; /* Source format */
+ unsigned int quant:5; /* Quantization value for first MB */
+
+ unsigned int gobn:5; /* GOB number in effect at start of packet */
+ unsigned int mba1:3; /* Address of first MB starting count from 0 - part1 */
+
+ unsigned int mba2:6; /* Address of first MB starting count from 0 - part2 */
+ unsigned int r:2; /* Reserved */
+
+ unsigned int i:1; /* Picture coding type */
+ unsigned int u:1; /* Unrestricted motion vector */
+ unsigned int s:1; /* syntax based arithmetic coding */
+ unsigned int a:1; /* Advanced Prediction */
+ unsigned int hmv11:4; /* horizontal motion vector predictor for MB 1 - part 1 */
+
+ unsigned int hmv12:3; /* horizontal motion vector predictor for MB 1 - part 2 */
+ unsigned int vmv11:5; /* vertical motion vector predictor for MB 1 - part 1 */
+
+ unsigned int vmv12:2; /* vertical motion vector predictor for MB 1 - part 2 */
+ unsigned int hmv21:6; /* horizontal motion vector predictor for MB 3 - part 1 */
+
+ unsigned int hmv22:1; /* horizontal motion vector predictor for MB 3 - part 2 */
+ unsigned int vmv21:7 /* vertical motion vector predictor for MB 3 */
+ unsigned int rr1:8; /* reserved */
+ unsigned int rr2:8; /* reserved */
+
+ unsigned int rr3:3; /* reserved */
+ unsigned int dbq:2; /* Differential quantization parameter */
+ unsigned int trb:3; /* Temporal Reference for the B */
+
+ unsigned int tr:8; /* Temporal Reference for the P frame */
+#else
+#error "G_BYTE_ORDER should be big or little endian."
+#endif
+} GstRtpH263PayCHeader;
+
+struct _GstRtpH263PayPic
+{
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ unsigned int psc1:16;
+
+ unsigned int tr1:2;
+ unsigned int psc2:6;
+
+ unsigned int ptype_263:1;
+ unsigned int ptype_start:1;
+ unsigned int tr2:6;
+
+ unsigned int ptype_umvmode:1;
+ unsigned int ptype_pictype:1;
+ unsigned int ptype_srcformat:3;
+ unsigned int ptype_freeze:1;
+ unsigned int ptype_camera:1;
+ unsigned int ptype_split:1;
+
+ unsigned int pquant:5;
+ unsigned int ptype_pbmode:1;
+ unsigned int ptype_apmode:1;
+ unsigned int ptype_sacmode:1;
+
+#elif G_BYTE_ORDER == G_BIG_ENDIAN
+ unsigned int psc1:16;
+
+ unsigned int psc2:6;
+ unsigned int tr1:2;
+
+ unsigned int tr2:6;
+ unsigned int ptype_start:2;
+
+ unsigned int ptype_split:1;
+ unsigned int ptype_camera:1;
+ unsigned int ptype_freeze:1;
+ unsigned int ptype_srcformat:3;
+ unsigned int ptype_pictype:1;
+ unsigned int ptype_umvmode:1;
+
+ unsigned int ptype_sacmode:1;
+ unsigned int ptype_apmode:1;
+ unsigned int ptype_pbmode:1;
+ unsigned int pquant:5;
+
+#else
+#error "G_BYTE_ORDER should be big or little endian."
+#endif
+};
+
+struct _GstRtpH263PayBoundry
+{
+
+ guint8 *start;
+ guint8 *end;
+ guint8 sbit;
+ guint8 ebit;
+
+};
+
+struct _GstRtpH263PayMB
+{
+ guint8 *start;
+ guint8 *end;
+ guint8 sbit;
+ guint8 ebit;
+ guint length;
+
+ guint8 mb_type;
+ guint quant;
+
+ guint mba;
+ guint8 mvd[10];
+};
+
+struct _GstRtpH263PayGob
+{
+ guint8 *start;
+ guint8 *end;
+ guint length;
+ guint8 sbit;
+ guint8 ebit;
+
+ guint gobn;
+ guint quant;
+
+ GstRtpH263PayMB **macroblocks;
+ guint nmacroblocs;
+};
+
+struct _GstRtpH263PayPackage
+{
+ guint8 *payload_start;
+ guint8 *payload_end;
+ guint payload_len;
+ guint8 sbit;
+ guint8 ebit;
+ GstBuffer *outbuf;
+ gboolean marker;
+
+ GstRtpH263PayHeaderMode mode;
+
+ /*
+ * mode B,C data
+ */
+
+ guint16 mba;
+ guint nmvd;
+ guint8 mvd[10];
+ guint gobn;
+ guint quant;
+};
+
+#define GST_H263_PICTURELAYER_PLSRC(buf) (((GstRtpH263PayPic *)(buf))->ptype_srcformat)
+#define GST_H263_PICTURELAYER_PLTYPE(buf) (((GstRtpH263PayPic *)(buf))->ptype_pictype)
+#define GST_H263_PICTURELAYER_PLUMV(buf) (((GstRtpH263PayPic *)(buf))->ptype_umvmode)
+#define GST_H263_PICTURELAYER_PLSAC(buf) (((GstRtpH263PayPic *)(buf))->ptype_sacmode)
+#define GST_H263_PICTURELAYER_PLAP(buf) (((GstRtpH263PayPic *)(buf))->ptype_apmode)
+
+/*
+ * TODO: PB frame relevant tables
+ */
+
+#define GST_RTP_H263_PAY_END(start, len) (((guint8 *)start) + ((guint)len))
+#define GST_RTP_H263_PAY_GOBN(gob) (((((guint8 *) gob)[2] >> 2) & 0x1f)
+
gboolean gst_rtp_h263_pay_plugin_init (GstPlugin * plugin);
G_END_DECLS
-
#endif /* __GST_RTP_H263_PAY_H__ */