Commit a57f4dc8 authored by Mathieu Duponchelle's avatar Mathieu Duponchelle 🐸 Committed by Mathieu Duponchelle

mpegtsmux: spring cleanup, no functional change

parent 44c701d1
......@@ -19,17 +19,17 @@
* Boston, MA 02110-1301, USA.
*/
#include "atscmux.h"
#include "gstatscmux.h"
GST_DEBUG_CATEGORY (atscmux_debug);
#define GST_CAT_DEFAULT atscmux_debug
GST_DEBUG_CATEGORY (gst_atsc_mux_debug);
#define GST_CAT_DEFAULT gst_atsc_mux_debug
G_DEFINE_TYPE (ATSCMux, atscmux, GST_TYPE_BASE_TSMUX);
G_DEFINE_TYPE (GstATSCMux, gst_atsc_mux, GST_TYPE_BASE_TS_MUX);
#define parent_class atscmux_parent_class
#define parent_class gst_atsc_mux_parent_class
#define ATSCMUX_ST_PS_AUDIO_EAC3 0x87
static GstStaticPadTemplate atscmux_src_factory =
static GstStaticPadTemplate gst_atsc_mux_src_factory =
GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
......@@ -37,7 +37,7 @@ GST_STATIC_PAD_TEMPLATE ("src",
"systemstream = (boolean) true, " "packetsize = (int) 192 ")
);
static GstStaticPadTemplate atscmux_sink_factory =
static GstStaticPadTemplate gst_atsc_mux_sink_factory =
GST_STATIC_PAD_TEMPLATE ("sink_%d",
GST_PAD_SINK,
GST_PAD_REQUEST,
......@@ -50,9 +50,11 @@ static GstStaticPadTemplate atscmux_sink_factory =
"audio/x-ac3, framed = (boolean) TRUE;"
"audio/x-eac3, framed = (boolean) TRUE;"));
/* Internals */
static void
atscmux_stream_get_es_descrs (TsMuxStream * stream,
GstMpegtsPMTStream * pmt_stream, BaseTsMux * mpegtsmux)
gst_atsc_mux_stream_get_es_descrs (TsMuxStream * stream,
GstMpegtsPMTStream * pmt_stream, GstBaseTsMux * mpegtsmux)
{
GstMpegtsDescriptor *descriptor;
......@@ -120,8 +122,8 @@ atscmux_stream_get_es_descrs (TsMuxStream * stream,
}
static TsMuxStream *
atscmux_create_new_stream (guint16 new_pid,
TsMuxStreamType stream_type, BaseTsMux * mpegtsmux)
gst_atsc_mux_create_new_stream (guint16 new_pid,
TsMuxStreamType stream_type, GstBaseTsMux * mpegtsmux)
{
TsMuxStream *ret = tsmux_stream_new (new_pid, stream_type);
......@@ -132,26 +134,28 @@ atscmux_create_new_stream (guint16 new_pid,
}
tsmux_stream_set_get_es_descriptors_func (ret,
(TsMuxStreamGetESDescriptorsFunc) atscmux_stream_get_es_descrs,
(TsMuxStreamGetESDescriptorsFunc) gst_atsc_mux_stream_get_es_descrs,
mpegtsmux);
return ret;
}
/* GstBaseTsMux implementation */
static TsMux *
atscmux_create_ts_mux (BaseTsMux * mpegtsmux)
gst_atsc_mux_create_ts_mux (GstBaseTsMux * mpegtsmux)
{
TsMux *ret = ((BaseTsMuxClass *) parent_class)->create_ts_mux (mpegtsmux);
TsMux *ret = ((GstBaseTsMuxClass *) parent_class)->create_ts_mux (mpegtsmux);
tsmux_set_new_stream_func (ret,
(TsMuxNewStreamFunc) atscmux_create_new_stream, mpegtsmux);
(TsMuxNewStreamFunc) gst_atsc_mux_create_new_stream, mpegtsmux);
return ret;
}
static guint
atscmux_handle_media_type (BaseTsMux * mux, const gchar * media_type,
BaseTsPadData * ts_data)
gst_atsc_mux_handle_media_type (GstBaseTsMux * mux, const gchar * media_type,
GstBaseTsPadData * ts_data)
{
guint ret = TSMUX_ST_RESERVED;
......@@ -163,29 +167,29 @@ atscmux_handle_media_type (BaseTsMux * mux, const gchar * media_type,
}
static void
atscmux_class_init (ATSCMuxClass * klass)
gst_atsc_mux_class_init (GstATSCMuxClass * klass)
{
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
BaseTsMuxClass *mpegtsmux_class = (BaseTsMuxClass *) klass;
GstBaseTsMuxClass *mpegtsmux_class = (GstBaseTsMuxClass *) klass;
GST_DEBUG_CATEGORY_INIT (atscmux_debug, "atscmux", 0, "ATSC muxer");
GST_DEBUG_CATEGORY_INIT (gst_atsc_mux_debug, "atscmux", 0, "ATSC muxer");
gst_element_class_set_static_metadata (gstelement_class,
"ATSC Transport Stream Muxer", "Codec/Muxer",
"Multiplexes media streams into an ATSC-compliant Transport Stream",
"Mathieu Duponchelle <mathieu@centricular.com>");
mpegtsmux_class->create_ts_mux = atscmux_create_ts_mux;
mpegtsmux_class->handle_media_type = atscmux_handle_media_type;
mpegtsmux_class->create_ts_mux = gst_atsc_mux_create_ts_mux;
mpegtsmux_class->handle_media_type = gst_atsc_mux_handle_media_type;
gst_element_class_add_static_pad_template (gstelement_class,
&atscmux_sink_factory);
&gst_atsc_mux_sink_factory);
gst_element_class_add_static_pad_template (gstelement_class,
&atscmux_src_factory);
&gst_atsc_mux_src_factory);
}
static void
atscmux_init (ATSCMux * mux)
gst_atsc_mux_init (GstATSCMux * mux)
{
}
/* ATSC Transport Stream muxer
* Copyright (C) 2019 Mathieu Duponchelle <mathieu@centricular.com>
*
* atscmux.h:
* gstatscmux.h:
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
......@@ -22,24 +22,24 @@
#ifndef __ATSCMUX_H__
#define __ATSCMUX_H__
#include "basetsmux.h"
#include "gstbasetsmux.h"
G_BEGIN_DECLS
#define GST_TYPE_ATSCMUX (atscmux_get_type())
#define GST_TYPE_ATSCMUX (gst_atsc_mux_get_type())
typedef struct ATSCMux ATSCMux;
typedef struct ATSCMuxClass ATSCMuxClass;
typedef struct GstATSCMux GstATSCMux;
typedef struct GstATSCMuxClass GstATSCMuxClass;
struct ATSCMux {
BaseTsMux parent;
struct GstATSCMux {
GstBaseTsMux parent;
};
struct ATSCMuxClass {
BaseTsMuxClass parent_class;
struct GstATSCMuxClass {
GstBaseTsMuxClass parent_class;
};
GType atscmux_get_type (void);
GType gst_atsc_mux_get_type (void);
G_END_DECLS
......
......@@ -86,44 +86,29 @@
#include <gst/gst.h>
#include <gst/base/gstcollectpads.h>
#include <gst/base/gstadapter.h>
#include <glib-object.h>
G_BEGIN_DECLS
#include <tsmux/tsmux.h>
#include "tsmux/tsmux.h"
#define GST_TYPE_BASE_TSMUX (basetsmux_get_type())
#define GST_BASE_TSMUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_BASE_TSMUX, BaseTsMux))
#define GST_BASE_TSMUX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_BASE_TSMUX,BaseTsMuxClass))
#define GST_TYPE_BASE_TS_MUX (gst_base_ts_mux_get_type())
#define GST_BASE_TS_MUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_BASE_TS_MUX, GstBaseTsMux))
#define GST_BASE_TS_MUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_BASE_TS_MUX, GstBaseTsMuxClass))
#define GST_BASE_TS_MUX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_BASE_TS_MUX,GstBaseTsMuxClass))
#define CLOCK_BASE 9LL
#define CLOCK_FREQ (CLOCK_BASE * 10000) /* 90 kHz PTS clock */
#define CLOCK_FREQ_SCR (CLOCK_FREQ * 300) /* 27 MHz SCR clock */
#define GST_BASE_TS_MUX_NORMAL_PACKET_LENGTH 188
#define GSTTIME_TO_MPEGTIME(time) \
(((time) > 0 ? (gint64) 1 : (gint64) -1) * \
(gint64) gst_util_uint64_scale (ABS(time), CLOCK_BASE, GST_MSECOND/10))
typedef struct GstBaseTsMux GstBaseTsMux;
typedef struct GstBaseTsMuxClass GstBaseTsMuxClass;
typedef struct GstBaseTsPadData GstBaseTsPadData;
/* 27 MHz SCR conversions: */
#define MPEG_SYS_TIME_TO_GSTTIME(time) (gst_util_uint64_scale ((time), \
GST_USECOND, CLOCK_FREQ_SCR / 1000000))
#define GSTTIME_TO_MPEG_SYS_TIME(time) (gst_util_uint64_scale ((time), \
CLOCK_FREQ_SCR / 1000000, GST_USECOND))
typedef GstBuffer * (*GstBaseTsPadDataPrepareFunction) (GstBuffer * buf,
GstBaseTsPadData * data, GstBaseTsMux * mux);
#define NORMAL_TS_PACKET_LENGTH 188
#define M2TS_PACKET_LENGTH 192
typedef void (*GstBaseTsPadDataFreePrepareDataFunction) (gpointer prepare_data);
#define DEFAULT_PROG_ID 0
typedef struct BaseTsMux BaseTsMux;
typedef struct BaseTsMuxClass BaseTsMuxClass;
typedef struct BaseTsPadData BaseTsPadData;
typedef GstBuffer * (*BaseTsPadDataPrepareFunction) (GstBuffer * buf,
BaseTsPadData * data, BaseTsMux * mux);
typedef void (*BaseTsPadDataFreePrepareDataFunction) (gpointer prepare_data);
struct BaseTsMux {
struct GstBaseTsMux {
GstElement parent;
GstPad *srcpad;
......@@ -160,34 +145,41 @@ struct BaseTsMux {
/* output buffer aggregation */
GstAdapter *out_adapter;
GstBuffer *out_buffer;
#if 0
/* SPN/PTS index handling */
GstIndex *element_index;
gint spn_count;
#endif
};
/**
* BaseTsMuxClass:
* GstBaseTsMuxClass:
* @create_ts_mux: Optional.
* Called in order to create the #TsMux object.
* @handle_media_type: Optional.
* Called in order to determine the stream-type for a given
* @media_type (eg. video/x-h264).
* @allocate_packet: Optional.
* Called when the underlying #TsMux object needs a packet
* to write into.
* @output_packet: Optional.
* Called when the underlying #TsMux object has a packet
* ready to output.
* @reset: Optional.
* Called when the subclass needs to reset.
* @drain: Optional.
* Called at EOS, if the subclass has data it needs to drain.
*/
struct BaseTsMuxClass {
struct GstBaseTsMuxClass {
GstElementClass parent_class;
TsMux * (*create_ts_mux) (BaseTsMux *mux);
guint (*handle_media_type) (BaseTsMux *mux, const gchar *media_type, BaseTsPadData * ts_data);
void (*allocate_packet) (BaseTsMux *mux, GstBuffer **buffer);
gboolean (*output_packet) (BaseTsMux *mux, GstBuffer *buffer, gint64 new_pcr);
void (*reset) (BaseTsMux *mux);
gboolean (*drain) (BaseTsMux *mux);
TsMux * (*create_ts_mux) (GstBaseTsMux *mux);
guint (*handle_media_type) (GstBaseTsMux *mux, const gchar *media_type, GstBaseTsPadData * ts_data);
void (*allocate_packet) (GstBaseTsMux *mux, GstBuffer **buffer);
gboolean (*output_packet) (GstBaseTsMux *mux, GstBuffer *buffer, gint64 new_pcr);
void (*reset) (GstBaseTsMux *mux);
gboolean (*drain) (GstBaseTsMux *mux);
};
void gst_base_tsmux_set_packet_size (BaseTsMux *mux, gsize size);
void gst_base_tsmux_set_automatic_alignment (BaseTsMux *mux, gsize alignment);
void gst_base_ts_mux_set_packet_size (GstBaseTsMux *mux, gsize size);
void gst_base_ts_mux_set_automatic_alignment (GstBaseTsMux *mux, gsize alignment);
struct BaseTsPadData {
struct GstBaseTsPadData {
/* parent */
GstCollectData collect;
......@@ -197,11 +189,6 @@ struct BaseTsPadData {
/* most recent DTS */
gint64 dts;
#if 0
/* (optional) index writing */
gint element_index_writer_id;
#endif
/* optional codec data available in the caps */
GstBuffer *codec_data;
......@@ -209,9 +196,9 @@ struct BaseTsPadData {
gpointer prepare_data;
/* handler to prepare input data */
BaseTsPadDataPrepareFunction prepare_func;
GstBaseTsPadDataPrepareFunction prepare_func;
/* handler to free the private data */
BaseTsPadDataFreePrepareDataFunction free_func;
GstBaseTsPadDataFreePrepareDataFunction free_func;
/* program id to which it is attached to (not program pid) */
gint prog_id;
......@@ -221,7 +208,7 @@ struct BaseTsPadData {
gchar *language;
};
GType basetsmux_get_type (void);
GType gst_base_ts_mux_get_type (void);
G_END_DECLS
......
......@@ -84,13 +84,14 @@
#include "config.h"
#endif
#include "basetsmux_aac.h"
#include "gstbasetsmuxaac.h"
#include <string.h>
#define GST_CAT_DEFAULT basetsmux_debug
#define GST_CAT_DEFAULT gst_base_ts_mux_debug
GstBuffer *
basetsmux_prepare_aac (GstBuffer * buf, BaseTsPadData * data, BaseTsMux * mux)
gst_base_ts_mux_prepare_aac (GstBuffer * buf, GstBaseTsPadData * data,
GstBaseTsMux * mux)
{
guint8 adts_header[7] = { 0, };
gsize out_size = gst_buffer_get_size (buf) + 7;
......
......@@ -83,9 +83,9 @@
#ifndef __BASETSMUX_AAC_H__
#define __BASETSMUX_AAC_H__
#include "basetsmux.h"
#include "gstbasetsmux.h"
GstBuffer * basetsmux_prepare_aac (GstBuffer * buf, BaseTsPadData * data,
BaseTsMux * mux);
GstBuffer * gst_base_ts_mux_prepare_aac (GstBuffer * buf, GstBaseTsPadData * data,
GstBaseTsMux * mux);
#endif /* __BASETSMUX_AAC_H__ */
......@@ -27,17 +27,17 @@
#endif
#include <stdio.h>
#include "basetsmux_jpeg2000.h"
#include "gstbasetsmuxjpeg2000.h"
#include <string.h>
#include <gst/audio/audio.h>
#include <gst/base/gstbytewriter.h>
#include <gst/gst.h>
#define GST_CAT_DEFAULT basetsmux_debug
#define GST_CAT_DEFAULT gst_base_ts_mux_debug
GstBuffer *
basetsmux_prepare_jpeg2000 (GstBuffer * buf, BaseTsPadData * data,
BaseTsMux * mux)
gst_base_ts_mux_prepare_jpeg2000 (GstBuffer * buf, GstBaseTsPadData * data,
GstBaseTsMux * mux)
{
j2k_private_data *private_data = data->prepare_data;
GstByteWriter wr;
......@@ -127,7 +127,7 @@ basetsmux_prepare_jpeg2000 (GstBuffer * buf, BaseTsPadData * data,
}
void
basetsmux_free_jpeg2000 (gpointer prepare_data)
gst_base_ts_mux_free_jpeg2000 (gpointer prepare_data)
{
/* Free prepare data memory object */
g_free (prepare_data);
......
......@@ -25,7 +25,7 @@
#ifndef __BASETSMUX_JPEG2000_H__
#define __BASETSMUX_JPEG2000_H__
#include "basetsmux.h"
#include "gstbasetsmux.h"
/* color specifications for JPEG 2000 stream over MPEG TS */
typedef enum
......@@ -38,7 +38,7 @@ typedef enum
GST_MPEGTS_JPEG2000_COLORSPEC_CIEXYZ,
GST_MPEGTS_JPEG2000_COLORSPEC_REC2020,
GST_MPEGTS_JPEG2000_COLORSPEC_SMPTE2084
} GstBaseTsJpeg2000ColorSpec;
} GstGstBaseTsJpeg2000ColorSpec;
typedef struct j2k_private_data
......@@ -55,9 +55,9 @@ typedef struct j2k_private_data
guint8 color_spec;
} j2k_private_data;
GstBuffer *basetsmux_prepare_jpeg2000 (GstBuffer * buf, BaseTsPadData * data,
BaseTsMux * mux);
GstBuffer *gst_base_ts_mux_prepare_jpeg2000 (GstBuffer * buf, GstBaseTsPadData * data,
GstBaseTsMux * mux);
void basetsmux_free_jpeg2000 (gpointer prepare_data);
void gst_base_ts_mux_free_jpeg2000 (gpointer prepare_data);
#endif /* __BASETSMUX_JPEG2000_H__ */
......@@ -84,15 +84,15 @@
#include "config.h"
#endif
#include "basetsmux_opus.h"
#include "gstbasetsmuxopus.h"
#include <string.h>
#include <gst/audio/audio.h>
#define GST_CAT_DEFAULT basetsmux_debug
#define GST_CAT_DEFAULT gst_base_ts_mux_debug
GstBuffer *
basetsmux_prepare_opus (GstBuffer * buf, BaseTsPadData * pad_data,
BaseTsMux * mux)
gst_base_ts_mux_prepare_opus (GstBuffer * buf, GstBaseTsPadData * pad_data,
GstBaseTsMux * mux)
{
gssize insize = gst_buffer_get_size (buf);
gsize outsize;
......
......@@ -83,9 +83,9 @@
#ifndef __BASETSMUX_OPUS_H__
#define __BASETSMUX_OPUS_H__
#include "basetsmux.h"
#include "gstbasetsmux.h"
GstBuffer * basetsmux_prepare_opus (GstBuffer * buf, BaseTsPadData * data,
BaseTsMux * mux);
GstBuffer * gst_base_ts_mux_prepare_opus (GstBuffer * buf, GstBaseTsPadData * data,
GstBaseTsMux * mux);
#endif /* __BASETSMUX_OPUS_H__ */
......@@ -84,10 +84,10 @@
#include "config.h"
#endif
#include "basetsmux_ttxt.h"
#include "gstbasetsmuxttxt.h"
#include <string.h>
#define GST_CAT_DEFAULT basetsmux_debug
#define GST_CAT_DEFAULT gst_base_ts_mux_debug
/* from EN 300 472 spec: ITU-R System B Teletext in DVB
*
......@@ -98,8 +98,8 @@
*/
GstBuffer *
basetsmux_prepare_teletext (GstBuffer * buf, BaseTsPadData * pad_data,
BaseTsMux * mux)
gst_base_ts_mux_prepare_teletext (GstBuffer * buf, GstBaseTsPadData * pad_data,
GstBaseTsMux * mux)
{
GstBuffer *out_buf;
guint8 *data, *odata;
......
......@@ -83,9 +83,9 @@
#ifndef __BASETSMUX_TTXT_H__
#define __BASETSMUX_TTXT_H__
#include "basetsmux.h"
#include "gstbasetsmux.h"
GstBuffer * basetsmux_prepare_teletext (GstBuffer * buf, BaseTsPadData * data,
BaseTsMux * mux);
GstBuffer * gst_base_ts_mux_prepare_teletext (GstBuffer * buf, GstBaseTsPadData * data,
GstBaseTsMux * mux);
#endif /* __BASETSMUX_TTXT_H__ */
......@@ -82,17 +82,19 @@
*
*/
#include "mpegtsmux.h"
#include "gstmpegtsmux.h"
#define MPEGTSMUX_DEFAULT_M2TS FALSE
#define M2TS_PACKET_LENGTH 192
enum
{
PROP_0,
PROP_M2TS_MODE,
};
static GstStaticPadTemplate mpegtsmux_sink_factory =
static GstStaticPadTemplate gst_mpeg_ts_mux_sink_factory =
GST_STATIC_PAD_TEMPLATE ("sink_%d",
GST_PAD_SINK,
GST_PAD_REQUEST,
......@@ -129,7 +131,7 @@ static GstStaticPadTemplate mpegtsmux_sink_factory =
"subpicture/x-dvb; application/x-teletext; meta/x-klv, parsed=true;"
"image/x-jpc, profile = (int)[0, 49151];"));
static GstStaticPadTemplate mpegtsmux_src_factory =
static GstStaticPadTemplate gst_mpeg_ts_mux_src_factory =
GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
......@@ -137,59 +139,16 @@ GST_STATIC_PAD_TEMPLATE ("src",
"systemstream = (boolean) true, " "packetsize = (int) { 188, 192} ")
);
GST_DEBUG_CATEGORY (mpegtsmux_debug);
#define GST_CAT_DEFAULT mpegtsmux_debug
G_DEFINE_TYPE (MpegTsMux, mpegtsmux, GST_TYPE_BASE_TSMUX);
#define parent_class mpegtsmux_parent_class
static void
gst_mpegtsmux_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
{
MpegTsMux *mux = GST_MPEG_TSMUX (object);
switch (prop_id) {
case PROP_M2TS_MODE:
/* set incase if the output stream need to be of 192 bytes */
mux->m2ts_mode = g_value_get_boolean (value);
gst_base_tsmux_set_packet_size (GST_BASE_TSMUX (mux),
mux->m2ts_mode ? M2TS_PACKET_LENGTH : NORMAL_TS_PACKET_LENGTH);
gst_base_tsmux_set_automatic_alignment (GST_BASE_TSMUX (mux),
mux->m2ts_mode ? 32 : 0);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gst_mpegtsmux_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec)
{
MpegTsMux *mux = GST_MPEG_TSMUX (object);
switch (prop_id) {
case PROP_M2TS_MODE:
g_value_set_boolean (value, mux->m2ts_mode);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
GST_DEBUG_CATEGORY (gst_mpeg_ts_mux_debug);
#define GST_CAT_DEFAULT gst_mpeg_ts_mux_debug
static void
gst_mpegtsmux_allocate_packet (BaseTsMux * mux, GstBuffer ** buffer)
{
((BaseTsMuxClass *) parent_class)->allocate_packet (mux, buffer);
G_DEFINE_TYPE (GstMpegTsMux, gst_mpeg_ts_mux, GST_TYPE_BASE_TS_MUX);
#define parent_class gst_mpeg_ts_mux_parent_class
gst_buffer_set_size (*buffer, NORMAL_TS_PACKET_LENGTH);
}
/* Internals */
static gboolean
new_packet_m2ts (MpegTsMux * mux, GstBuffer * buf, gint64 new_pcr)
new_packet_m2ts (GstMpegTsMux * mux, GstBuffer * buf, gint64 new_pcr)
{
GstBuffer *out_buf;
int chunk_bytes;
......@@ -272,8 +231,8 @@ new_packet_m2ts (MpegTsMux * mux, GstBuffer * buf, gint64 new_pcr)
GST_LOG_OBJECT (mux, "Outputting a packet of length %d PCR %"
G_GUINT64_FORMAT, M2TS_PACKET_LENGTH, cur_pcr);
((BaseTsMuxClass *) parent_class)->output_packet (GST_BASE_TSMUX (mux),
out_buf, -1);
((GstBaseTsMuxClass *)
parent_class)->output_packet (GST_BASE_TS_MUX (mux), out_buf, -1);
}
}
......@@ -291,8 +250,8 @@ new_packet_m2ts (MpegTsMux * mux, GstBuffer * buf, gint64 new_pcr)
GST_LOG_OBJECT (mux, "Outputting a packet of length %d PCR %"
G_GUINT64_FORMAT, M2TS_PACKET_LENGTH, new_pcr);
((BaseTsMuxClass *) parent_class)->output_packet (GST_BASE_TSMUX (mux), buf,
-1);
((GstBaseTsMuxClass *) parent_class)->output_packet (GST_BASE_TS_MUX (mux),
buf, -1);
if (new_pcr != mux->previous_pcr) {
mux->previous_pcr = new_pcr;
......@@ -303,16 +262,26 @@ exit:
return TRUE;
}
/* GstBaseTsMux implementation */
static void
gst_mpeg_ts_mux_allocate_packet (GstBaseTsMux * mux, GstBuffer ** buffer)
{
((GstBaseTsMuxClass *) parent_class)->allocate_packet (mux, buffer);
gst_buffer_set_size (*buffer, GST_BASE_TS_MUX_NORMAL_PACKET_LENGTH);
}
static gboolean
gst_mpegtsmux_output_packet (BaseTsMux * base_tsmux, GstBuffer * buffer,
gst_mpeg_ts_mux_output_packet (GstBaseTsMux * base_tsmux, GstBuffer * buffer,
gint64 new_pcr)
{
MpegTsMux *mux = (MpegTsMux *) base_tsmux;
GstMpegTsMux *mux = GST_MPEG_TS_MUX (base_tsmux);
GstMapInfo map;
if (!mux->m2ts_mode)
return ((BaseTsMuxClass *) parent_class)->output_packet (base_tsmux, buffer,
new_pcr);
return ((GstBaseTsMuxClass *) parent_class)->output_packet (base_tsmux,
buffer, new_pcr);
gst_buffer_set_size (buffer, M2TS_PACKET_LENGTH);
......@@ -327,9 +296,9 @@ gst_mpegtsmux_output_packet (BaseTsMux * base_tsmux, GstBuffer * buffer,
}
static void
gst_mpegtsmux_reset (BaseTsMux * base_tsmux)
gst_mpeg_ts_mux_reset (GstBaseTsMux * base_tsmux)
{
MpegTsMux *mux = (MpegTsMux *) base_tsmux;
GstMpegTsMux *mux = GST_MPEG_TS_MUX (base_tsmux);
if (mux->adapter)
gst_adapter_clear (mux->adapter);
......@@ -339,10 +308,56 @@ gst_mpegtsmux_reset (BaseTsMux * base_tsmux)
mux->pcr_rate_num = mux->pcr_rate_den = 1;
}
static gboolean
gst_mpeg_ts_mux_drain (GstBaseTsMux * mux)
{
return new_packet_m2ts (GST_MPEG_TS_MUX (mux), NULL, -1);
}
/* GObject implementation */
static void
gst_mpeg_ts_mux_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
{
GstMpegTsMux *mux = GST_MPEG_TS_MUX (object);
switch (prop_id) {
case PROP_M2TS_MODE:
/* set incase if the output stream need to be of 192 bytes */
mux->m2ts_mode = g_value_get_boolean (value);
gst_base_ts_mux_set_packet_size (GST_BASE_TS_MUX (mux),
mux->m2ts_mode ? M2TS_PACKET_LENGTH :
GST_BASE_TS_MUX_NORMAL_PACKET_LENGTH);
gst_base_ts_mux_set_automatic_alignment (GST_BASE_TS_MUX (mux),
mux->m2ts_mode ? 32 : 0);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gst_mpeg_ts_mux_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec)
{
GstMpegTsMux *mux = GST_MPEG_TS_MUX (object);
switch (prop_id) {
case PROP_M2TS_MODE:
g_value_set_boolean (value, mux->m2ts_mode);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gst_mpegtsmux_dispose (GObject * object)
gst_mpeg_ts_mux_dispose (GObject * object)
{
MpegTsMux *mux = (MpegTsMux *) object;
GstMpegTsMux *mux = GST_MPEG_TS_MUX (object);
if (mux->adapter) {
g_object_unref (mux->adapter);
......@@ -352,32 +367,28 @@ gst_mpegtsmux_dispose (GObject * object)
GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
}
static gboolean
gst_mpegtsmux_drain (BaseTsMux * mux)
{
return new_packet_m2ts ((MpegTsMux *) mux, NULL, -1);
}
static void
mpegtsmux_class_init (MpegTsMuxClass * klass)
gst_mpeg_ts_mux_class_init (GstMpegTsMuxClass * klass)
{
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
BaseTsMuxClass *base_tsmux_class = (BaseTsMuxClass *) klass;
GstBaseTsMuxClass *base_tsmux_class = GST_BASE_TS_MUX_CLASS (klass);
GST_DEBUG_CATEGORY_INIT (mpegtsmux_debug, "mpegtsmux", 0,
GST_DEBUG_CATEGORY_INIT (gst_mpeg_ts_mux_debug, "mpegtsmux", 0,
"MPEG Transport Stream muxer");
gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_mpegtsmux_set_property);
gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_mpegtsmux_get_property);