diff options
Diffstat (limited to 'subprojects/gst-plugins-good/gst/rtp/gstrtph263pay.h')
-rw-r--r-- | subprojects/gst-plugins-good/gst/rtp/gstrtph263pay.h | 413 |
1 files changed, 413 insertions, 0 deletions
diff --git a/subprojects/gst-plugins-good/gst/rtp/gstrtph263pay.h b/subprojects/gst-plugins-good/gst/rtp/gstrtph263pay.h new file mode 100644 index 0000000000..c77e6ac15a --- /dev/null +++ b/subprojects/gst-plugins-good/gst/rtp/gstrtph263pay.h @@ -0,0 +1,413 @@ +/* GStreamer + * Copyright (C) <2005> Wim Taymans <wim.taymans@gmail.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + * Author: Dejan Sakelsak sahel@kiberpipa.org + */ + +#ifndef __GST_RTP_H263_PAY_H__ +#define __GST_RTP_H263_PAY_H__ + +#include <gst/gst.h> +#include <gst/rtp/gstrtpbasepayload.h> + +G_BEGIN_DECLS +#define GST_TYPE_RTP_H263_PAY \ + (gst_rtp_h263_pay_get_type()) +#define GST_RTP_H263_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_H263_PAY,GstRtpH263Pay)) +#define GST_RTP_H263_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_H263_PAY,GstRtpH263PayClass)) +#define GST_IS_RTP_H263_PAY(obj) \ + (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 FALSE +#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 _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 +{ + GstRTPBasePayload payload; + + GstBuffer *current_buffer; + GstMapInfo map; + + GstClockTime first_ts; + gboolean prop_payload_mode; + guint8 *data; + guint available_data; + +}; + +struct _GstRtpH263PayContext +{ + GstRtpH263PayPic *piclayer; + + guint mtu; + guint window; + guint8 *win_end; + guint8 cpm; + + guint no_gobs; + GstRtpH263PayGob **gobs; + +}; + +struct _GstRtpH263PayClass +{ + GstRTPBasePayloadClass 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) + +GType gst_rtp_h263_pay_get_type (void); + +G_END_DECLS +#endif /* __GST_RTP_H263_PAY_H__ */ |