/* GStreamer mplex (mjpegtools) wrapper * (c) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net> * * gstmplexjob.hh: gstreamer/mplex multiplex-job wrapper * * 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. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstmplexjob.hh" #include <gst/gst.h> enum { ARG_0, ARG_FORMAT, ARG_MUX_BITRATE, ARG_VBR, ARG_SYSTEM_HEADERS, ARG_SPLIT_SEQUENCE, ARG_SEGMENT_SIZE, ARG_PACKETS_PER_PACK, ARG_SECTOR_SIZE, ARG_BUFSIZE /* FILL ME */ }; #define DEFAULT_FORMAT MPEG_FORMAT_DVD /* * Property enumeration types. */ #define GST_TYPE_MPLEX_FORMAT \ (gst_mplex_format_get_type ()) static GType gst_mplex_format_get_type (void) { static GType mplex_format_type = 0; if (!mplex_format_type) { static const GEnumValue mplex_formats[] = { {MPEG_FORMAT_MPEG1, "Generic MPEG-1", "mpeg-1"}, {MPEG_FORMAT_VCD, "Standard VCD", "vcd"}, {MPEG_FORMAT_VCD_NSR, "User VCD", "vcd-nsr"}, {MPEG_FORMAT_MPEG2, "Generic MPEG-2", "mpeg-2"}, {MPEG_FORMAT_SVCD, "Standard SVCD", "svcd"}, {MPEG_FORMAT_SVCD_NSR, "User SVCD", "svcd-nsr"}, {MPEG_FORMAT_VCD_STILL, "VCD Stills sequences", "vcd-still"}, {MPEG_FORMAT_SVCD_STILL, "SVCD Stills sequences", "svcd-still"}, {MPEG_FORMAT_DVD_NAV, "DVD MPEG-2 for dvdauthor", "dvd-nav"}, {MPEG_FORMAT_DVD, "DVD MPEG-2", "dvd"}, {MPEG_FORMAT_ATSC480i, "ATSC 480i", "atsc-480i"}, {MPEG_FORMAT_ATSC480p, "ATSC 480p", "atsc-480p"}, {MPEG_FORMAT_ATSC720p, "ATSC 720p", "atsc-720p"}, {MPEG_FORMAT_ATSC1080i, "ATSC 1080i", "atsc-1080i"}, {0, NULL, NULL}, }; mplex_format_type = g_enum_register_static ("GstMplexFormat", mplex_formats); } return mplex_format_type; } /* * Class init functions. */ GstMplexJob::GstMplexJob (void): MultiplexJob () { /* blabla */ bufsize = 0; } /* * GObject properties. */ void GstMplexJob::initProperties (GObjectClass * klass) { /* encoding profile */ g_object_class_install_property (klass, ARG_FORMAT, g_param_spec_enum ("format", "Format", "Encoding profile format", GST_TYPE_MPLEX_FORMAT, DEFAULT_FORMAT, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); /* total stream datarate. Normally, this shouldn't be needed, but * some DVD/VCD/SVCD players really need strict values to handle * the created files correctly. */ g_object_class_install_property (klass, ARG_MUX_BITRATE, g_param_spec_int ("mux-bitrate", "Mux. bitrate", "Bitrate of output stream in kbps (0 = autodetect)", 0, 15 * 1024, 0, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); /* override decode buffer size otherwise determined by format */ g_object_class_install_property (klass, ARG_BUFSIZE, g_param_spec_int ("bufsize", "Decoder buf. size", "Target decoders video buffer size (kB) " "[default determined by format if not explicitly set]", 20, 4000, 46, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); /* some boolean stuff for headers */ g_object_class_install_property (klass, ARG_VBR, g_param_spec_boolean ("vbr", "VBR", "Whether the input video stream is variable bitrate", FALSE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (klass, ARG_SYSTEM_HEADERS, g_param_spec_boolean ("system-headers", "System headers", "Create system header in every pack for generic formats", FALSE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); #if 0 /* not supported */ g_object_class_install_property (klass, ARG_SPLIT_SEQUENCE, g_param_spec_boolean ("split-sequence", "Split sequence", "Simply split a sequence across files " "(rather than building run-out/run-in)", FALSE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); /* size of a segment */ g_object_class_install_property (klass, ARG_SEGMENT_SIZE, g_param_spec_int ("max-segment-size", "Max. segment size", "Max. size per segment/file in MB (0 = unlimited)", 0, 10 * 1024, 0, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); #endif /* packets per pack (generic formats) */ g_object_class_install_property (klass, ARG_PACKETS_PER_PACK, g_param_spec_int ("packets-per-pack", "Packets per pack", "Number of packets per pack for generic formats", 1, 100, 1, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); /* size of one sector */ g_object_class_install_property (klass, ARG_SECTOR_SIZE, g_param_spec_int ("sector-size", "Sector size", "Specify sector size in bytes for generic formats", 256, 16384, 2048, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); gst_type_mark_as_plugin_api (GST_TYPE_MPLEX_FORMAT, (GstPluginAPIFlags) 0); } /* * set/get gobject properties. */ void GstMplexJob::getProperty (guint prop_id, GValue * value) { switch (prop_id) { case ARG_FORMAT: g_value_set_enum (value, mux_format); break; case ARG_MUX_BITRATE: /* convert from bytes back to bits */ g_value_set_int (value, (data_rate * 8) / 1000); break; case ARG_VBR: g_value_set_boolean (value, VBR); break; case ARG_SYSTEM_HEADERS: g_value_set_boolean (value, always_system_headers); break; case ARG_SPLIT_SEQUENCE: g_value_set_boolean (value, multifile_segment); break; case ARG_SEGMENT_SIZE: g_value_set_int (value, max_segment_size); break; case ARG_PACKETS_PER_PACK: g_value_set_int (value, packets_per_pack); break; case ARG_SECTOR_SIZE: g_value_set_int (value, sector_size); break; case ARG_BUFSIZE: g_value_set_int (value, bufsize); break; default: break; } } void GstMplexJob::setProperty (guint prop_id, const GValue * value) { switch (prop_id) { case ARG_FORMAT: mux_format = g_value_get_enum (value); break; case ARG_MUX_BITRATE: /* data_rate expects bytes (don't ask me why the property itself is * in bits, I'm just staying compatible to mjpegtools options), and * rounded up to 50-bytes. */ data_rate = ((g_value_get_int (value) * 1000 / 8 + 49) / 50) * 50; break; case ARG_VBR: VBR = g_value_get_boolean (value); break; case ARG_SYSTEM_HEADERS: always_system_headers = g_value_get_boolean (value); break; case ARG_SPLIT_SEQUENCE: multifile_segment = g_value_get_boolean (value); break; case ARG_SEGMENT_SIZE: max_segment_size = g_value_get_int (value); break; case ARG_PACKETS_PER_PACK: packets_per_pack = g_value_get_int (value); break; case ARG_SECTOR_SIZE: sector_size = g_value_get_int (value); break; case ARG_BUFSIZE: bufsize = g_value_get_int (value); break; default: break; } }