| /* GStreamer mpeg2enc (mjpegtools) wrapper |
| * (c) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net> |
| * |
| * gstmpeg2encoptions.cc: gobject/mpeg2enc option wrapping class |
| * |
| * 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 "gstmpeg2encoptions.hh" |
| #ifdef WIN32 |
| # include <windows.h> //For GetSystemInfo |
| #endif |
| |
| #include <gst/gst.h> |
| |
| /* |
| * Property enumeration. |
| */ |
| |
| enum |
| { |
| ARG_0, |
| ARG_FORMAT, |
| ARG_FRAMERATE, |
| ARG_ASPECT, |
| ARG_INTERLACE_MODE, |
| ARG_BITRATE, |
| ARG_NONVIDEO_BITRATE, |
| ARG_QUANTISATION, |
| ARG_VCD_STILL_SIZE, |
| ARG_MOTION_SEARCH_RADIUS, |
| ARG_REDUCTION_4_4, |
| ARG_REDUCTION_2_2, |
| ARG_UNIT_COEFF_ELIM, |
| ARG_MIN_GOP_SIZE, |
| ARG_MAX_GOP_SIZE, |
| ARG_CLOSED_GOP, |
| ARG_FORCE_B_B_P, |
| ARG_B_PER_REFFRAME, |
| ARG_QUANTISATION_REDUCTION, |
| ARG_QUANT_REDUCTION_MAX_VAR, |
| ARG_INTRA_DC_PRECISION, |
| ARG_REDUCE_HF, |
| ARG_KEEP_HF, |
| ARG_QUANTISATION_MATRIX, |
| ARG_BUFSIZE, |
| ARG_VIDEO_NORM, |
| ARG_SEQUENCE_LENGTH, |
| ARG_3_2_PULLDOWN, |
| ARG_SEQUENCE_HEADER_EVERY_GOP, |
| ARG_PLAYBACK_FIELD_ORDER, |
| ARG_DUMMY_SVCD_SOF, |
| ARG_CORRECT_SVCD_HDS, |
| ARG_ALTSCAN_MPEG2, |
| ARG_CONSTRAINTS, |
| ARG_DUALPRIME_MPEG2 |
| /* FILL ME */ |
| }; |
| |
| /* MPEG1 VCD bitrate is used as default (also by mpeg2enc) */ |
| #define DEFAULT_BITRATE 1125 |
| |
| /* |
| * Property enumeration types. |
| */ |
| |
| /* FIXME: nick/name perhaps to be reversed (?) */ |
| |
| #define GST_TYPE_MPEG2ENC_FORMAT \ |
| (gst_mpeg2enc_format_get_type ()) |
| |
| static GType |
| gst_mpeg2enc_format_get_type (void) |
| { |
| static GType mpeg2enc_format_type = 0; |
| |
| if (!mpeg2enc_format_type) { |
| static const GEnumValue mpeg2enc_formats[] = { |
| {MPEG_FORMAT_MPEG1, "Generic MPEG-1", "0"}, |
| {MPEG_FORMAT_VCD, "Standard VCD", "1"}, |
| {MPEG_FORMAT_VCD_NSR, "User VCD", "2"}, |
| {MPEG_FORMAT_MPEG2, "Generic MPEG-2", "3"}, |
| {MPEG_FORMAT_SVCD, "Standard SVCD", "4"}, |
| {MPEG_FORMAT_SVCD_NSR, "User SVCD", "5"}, |
| {MPEG_FORMAT_VCD_STILL, "VCD Stills sequences", "6"}, |
| {MPEG_FORMAT_SVCD_STILL, "SVCD Stills sequences", "7"}, |
| {MPEG_FORMAT_DVD_NAV, "DVD MPEG-2 for dvdauthor", "8"}, |
| {MPEG_FORMAT_DVD, "DVD MPEG-2", "9"}, |
| #ifdef MPEG_FORMAT_ATSC1080i |
| {MPEG_FORMAT_ATSC480i, "ATSC 480i", "10"}, |
| {MPEG_FORMAT_ATSC480p, "ATSC 480p", "11"}, |
| {MPEG_FORMAT_ATSC720p, "ATSC 720p", "12"}, |
| {MPEG_FORMAT_ATSC1080i, "ATSC 1080i", "13"}, |
| #endif |
| {0, NULL, NULL}, |
| }; |
| |
| mpeg2enc_format_type = |
| g_enum_register_static ("GstMpeg2encFormat", mpeg2enc_formats); |
| } |
| |
| return mpeg2enc_format_type; |
| } |
| |
| #define GST_TYPE_MPEG2ENC_FRAMERATE \ |
| (gst_mpeg2enc_framerate_get_type ()) |
| |
| static GType |
| gst_mpeg2enc_framerate_get_type (void) |
| { |
| static GType mpeg2enc_framerate_type = 0; |
| |
| if (!mpeg2enc_framerate_type) { |
| static const GEnumValue mpeg2enc_framerates[] = { |
| {0, "Same as input", "0"}, |
| {1, "24/1.001 (NTSC 3:2 pulldown converted film)", "1"}, |
| {2, "24 (native film)", "2"}, |
| {3, "25 (PAL/SECAM video)", "3"}, |
| {4, "30/1.001 (NTSC video)", "4"}, |
| {5, "30", "5"}, |
| {6, "50 (PAL/SECAM fields)", "6"}, |
| {7, "60/1.001 (NTSC fields)", "7"}, |
| {8, "60", "8"}, |
| {0, NULL, NULL}, |
| }; |
| |
| mpeg2enc_framerate_type = |
| g_enum_register_static ("GstMpeg2encFramerate", mpeg2enc_framerates); |
| } |
| |
| return mpeg2enc_framerate_type; |
| } |
| |
| #define GST_TYPE_MPEG2ENC_ASPECT \ |
| (gst_mpeg2enc_aspect_get_type ()) |
| |
| static GType |
| gst_mpeg2enc_aspect_get_type (void) |
| { |
| static GType mpeg2enc_aspect_type = 0; |
| |
| if (!mpeg2enc_aspect_type) { |
| static const GEnumValue mpeg2enc_aspects[] = { |
| {0, "Deduce from input", "0"}, |
| {1, "1:1", "1"}, |
| {2, "4:3", "2"}, |
| {3, "16:9", "3"}, |
| {4, "2.21:1", "4"}, |
| {0, NULL, NULL}, |
| }; |
| |
| mpeg2enc_aspect_type = |
| g_enum_register_static ("GstMpeg2encAspect", mpeg2enc_aspects); |
| } |
| |
| return mpeg2enc_aspect_type; |
| } |
| |
| #define GST_TYPE_MPEG2ENC_INTERLACE_MODE \ |
| (gst_mpeg2enc_interlace_mode_get_type ()) |
| |
| static GType |
| gst_mpeg2enc_interlace_mode_get_type (void) |
| { |
| static GType mpeg2enc_interlace_mode_type = 0; |
| |
| if (!mpeg2enc_interlace_mode_type) { |
| static const GEnumValue mpeg2enc_interlace_modes[] = { |
| {-1, "Format default mode", "-1"}, |
| {0, "Progressive", "0"}, |
| {1, "Interlaced, per-frame encoding", "1"}, |
| {2, "Interlaced, per-field-encoding", "2"}, |
| {0, NULL, NULL}, |
| }; |
| |
| mpeg2enc_interlace_mode_type = |
| g_enum_register_static ("GstMpeg2encInterlaceMode", |
| mpeg2enc_interlace_modes); |
| } |
| |
| return mpeg2enc_interlace_mode_type; |
| } |
| |
| #define GST_TYPE_MPEG2ENC_QUANTISATION_MATRIX \ |
| (gst_mpeg2enc_quantisation_matrix_get_type ()) |
| |
| #define GST_MPEG2ENC_QUANTISATION_MATRIX_DEFAULT 0 |
| #define GST_MPEG2ENC_QUANTISATION_MATRIX_HI_RES 1 |
| #define GST_MPEG2ENC_QUANTISATION_MATRIX_KVCD 2 |
| #define GST_MPEG2ENC_QUANTISATION_MATRIX_TMPGENC 3 |
| |
| static GType |
| gst_mpeg2enc_quantisation_matrix_get_type (void) |
| { |
| static GType mpeg2enc_quantisation_matrix_type = 0; |
| |
| if (!mpeg2enc_quantisation_matrix_type) { |
| static const GEnumValue mpeg2enc_quantisation_matrixes[] = { |
| {GST_MPEG2ENC_QUANTISATION_MATRIX_DEFAULT, |
| "Default", "9"}, |
| {GST_MPEG2ENC_QUANTISATION_MATRIX_HI_RES, |
| "High resolution", "1"}, |
| {GST_MPEG2ENC_QUANTISATION_MATRIX_KVCD, |
| "KVCD", "2"}, |
| {GST_MPEG2ENC_QUANTISATION_MATRIX_TMPGENC, |
| "TMPGEnc", "3"}, |
| {0, NULL, NULL}, |
| }; |
| |
| mpeg2enc_quantisation_matrix_type = |
| g_enum_register_static ("GstMpeg2encQuantisationMatrix", |
| mpeg2enc_quantisation_matrixes); |
| } |
| |
| return mpeg2enc_quantisation_matrix_type; |
| } |
| |
| #define GST_TYPE_MPEG2ENC_VIDEO_NORM \ |
| (gst_mpeg2enc_video_norm_get_type ()) |
| |
| static GType |
| gst_mpeg2enc_video_norm_get_type (void) |
| { |
| static GType mpeg2enc_video_norm_type = 0; |
| |
| if (!mpeg2enc_video_norm_type) { |
| static const GEnumValue mpeg2enc_video_norms[] = { |
| {0, "Unspecified", "0"}, |
| {'p', "PAL", "p"}, |
| {'n', "NTSC", "n"}, |
| {'s', "SECAM", "s"}, |
| {0, NULL, NULL}, |
| }; |
| |
| mpeg2enc_video_norm_type = |
| g_enum_register_static ("GstMpeg2encVideoNorm", mpeg2enc_video_norms); |
| } |
| |
| return mpeg2enc_video_norm_type; |
| } |
| |
| #define GST_TYPE_MPEG2ENC_PLAYBACK_FIELD_ORDER \ |
| (gst_mpeg2enc_playback_field_order_get_type ()) |
| |
| static GType |
| gst_mpeg2enc_playback_field_order_get_type (void) |
| { |
| static GType mpeg2enc_playback_field_order_type = 0; |
| |
| if (!mpeg2enc_playback_field_order_type) { |
| static const GEnumValue mpeg2enc_playback_field_orders[] = { |
| {Y4M_UNKNOWN, "Unspecified", "0"}, |
| {Y4M_ILACE_TOP_FIRST, "Top-field first", "1"}, |
| {Y4M_ILACE_BOTTOM_FIRST, "Bottom-field first", "2"}, |
| {0, NULL, NULL}, |
| }; |
| |
| mpeg2enc_playback_field_order_type = |
| g_enum_register_static ("GstMpeg2encPlaybackFieldOrders", |
| mpeg2enc_playback_field_orders); |
| } |
| |
| return mpeg2enc_playback_field_order_type; |
| } |
| |
| /* |
| * Class init stuff. |
| */ |
| |
| GstMpeg2EncOptions::GstMpeg2EncOptions (): |
| MPEG2EncOptions () |
| { |
| /* autodetect number of CPUs */ |
| #ifndef WIN32 |
| num_cpus = sysconf (_SC_NPROCESSORS_ONLN); |
| #else |
| SYSTEM_INFO si; |
| GetSystemInfo(&si); |
| num_cpus = si.dwNumberOfProcessors; |
| #endif |
| if (num_cpus < 0) |
| num_cpus = 1; |
| if (num_cpus > 32) |
| num_cpus = 32; |
| |
| /* set some default(s) not set in base class */ |
| bitrate = DEFAULT_BITRATE * 1000; |
| } |
| |
| /* |
| * Init properties (call once). |
| */ |
| |
| void |
| GstMpeg2EncOptions::initProperties (GObjectClass * klass) |
| { |
| /* encoding profile */ |
| g_object_class_install_property (klass, ARG_FORMAT, |
| g_param_spec_enum ("format", "Format", "Encoding profile format", |
| GST_TYPE_MPEG2ENC_FORMAT, 0, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| |
| /* input/output stream overrides */ |
| g_object_class_install_property (klass, ARG_FRAMERATE, |
| g_param_spec_enum ("framerate", "Framerate", "Output framerate", |
| GST_TYPE_MPEG2ENC_FRAMERATE, 0, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_ASPECT, |
| g_param_spec_enum ("aspect", "Aspect", "Display aspect ratio", |
| GST_TYPE_MPEG2ENC_ASPECT, 0, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_INTERLACE_MODE, |
| g_param_spec_enum ("interlace-mode", "Interlace mode", |
| "MPEG-2 motion estimation and encoding modes", |
| GST_TYPE_MPEG2ENC_INTERLACE_MODE, 0, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| |
| /* general encoding stream options */ |
| g_object_class_install_property (klass, ARG_BITRATE, |
| g_param_spec_int ("bitrate", "Bitrate", "Compressed video bitrate (kbps)", |
| 0, 40 * 1000, DEFAULT_BITRATE, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_NONVIDEO_BITRATE, |
| g_param_spec_int ("non-video-bitrate", "Non-video bitrate", |
| "Assumed bitrate of non-video for sequence splitting (kbps)", |
| 0, 10 * 1000, 0, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_QUANTISATION, |
| g_param_spec_int ("quantisation", "Quantisation", |
| "Quantisation factor (-1=cbr, 0=default, 1=best, 31=worst)", |
| -1, 31, 0, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| |
| /* stills options */ |
| g_object_class_install_property (klass, ARG_VCD_STILL_SIZE, |
| g_param_spec_int ("vcd-still-size", "VCD stills size", |
| "Size of VCD stills (in KB)", |
| 0, 512, 0, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| |
| /* motion estimation options */ |
| g_object_class_install_property (klass, ARG_MOTION_SEARCH_RADIUS, |
| g_param_spec_int ("motion-search-radius", "Motion search radius", |
| "Motion compensation search radius", |
| 0, 32, 16, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_REDUCTION_4_4, |
| g_param_spec_int ("reduction-4x4", "4x4 reduction", |
| "Reduction factor for 4x4 subsampled candidate motion estimates" |
| " (1=max. quality, 4=max. speed)", |
| 1, 4, 2, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_REDUCTION_2_2, |
| g_param_spec_int ("reduction-2x2", "2x2 reduction", |
| "Reduction factor for 2x2 subsampled candidate motion estimates" |
| " (1=max. quality, 4=max. speed)", |
| 1, 4, 3, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_UNIT_COEFF_ELIM, |
| g_param_spec_int ("unit-coeff-elim", "Unit coefficience elimination", |
| "How agressively small-unit picture blocks should be skipped", |
| -40, 40, 0, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| |
| /* GOP options */ |
| g_object_class_install_property (klass, ARG_MIN_GOP_SIZE, |
| g_param_spec_int ("min-gop-size", "Min. GOP size", |
| "Minimal size per Group-of-Pictures (-1=default)", |
| -1, 250, -1, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_MAX_GOP_SIZE, |
| g_param_spec_int ("max-gop-size", "Max. GOP size", |
| "Maximal size per Group-of-Pictures (-1=default)", |
| -1, 250, -1, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_CLOSED_GOP, |
| g_param_spec_boolean ("closed-gop", "Closed GOP", |
| "All Group-of-Pictures are closed (for multi-angle DVDs)", |
| FALSE, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_FORCE_B_B_P, |
| g_param_spec_boolean ("force-b-b-p", "Force B-B-P", |
| "Force two B frames between I/P frames when closing GOP boundaries", |
| FALSE, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_B_PER_REFFRAME, |
| g_param_spec_int ("b-per-refframe", "B per ref. frame", |
| "Number of B frames between each I/P frame", |
| 0, 2, 0, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| |
| /* quantisation options */ |
| g_object_class_install_property (klass, ARG_QUANTISATION_REDUCTION, |
| g_param_spec_float ("quantisation-reduction", "Quantisation reduction", |
| "Max. quantisation reduction for highly active blocks", |
| -4., 10., 0., |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_QUANT_REDUCTION_MAX_VAR, |
| g_param_spec_float ("quant-reduction-max-var", |
| "Max. quant. reduction variance", |
| "Maximal luma variance below which quantisation boost is used", |
| 0., 2500., 100., |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_INTRA_DC_PRECISION, |
| g_param_spec_int ("intra-dc-prec", "Intra. DC precision", |
| "Number of bits precision for DC (base colour) in MPEG-2 blocks", |
| 8, 11, 9, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_REDUCE_HF, |
| g_param_spec_float ("reduce-hf", "Reduce HF", |
| "How much to reduce high-frequency resolution (by increasing quantisation)", |
| 0., 2., 0., |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_KEEP_HF, |
| g_param_spec_boolean ("keep-hf", "Keep HF", |
| "Maximize high-frequency resolution (for high-quality sources)", |
| FALSE, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_QUANTISATION_MATRIX, |
| g_param_spec_enum ("quant-matrix", "Quant. matrix", |
| "Quantisation matrix to use for encoding", |
| GST_TYPE_MPEG2ENC_QUANTISATION_MATRIX, 0, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| |
| /* general options */ |
| g_object_class_install_property (klass, ARG_BUFSIZE, |
| g_param_spec_int ("bufsize", "Decoder buf. size", |
| "Target decoders video buffer size (kB) (default depends on format)", |
| 20, 4000, 46, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| |
| /* header flag settings */ |
| g_object_class_install_property (klass, ARG_VIDEO_NORM, |
| g_param_spec_enum ("norm", "Norm", |
| "Tag output for specific video norm", |
| GST_TYPE_MPEG2ENC_VIDEO_NORM, 0, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_SEQUENCE_LENGTH, |
| g_param_spec_int ("sequence-length", "Sequence length", |
| "Place a sequence boundary after each <num> MB (0=disable)", |
| 0, 10 * 1024, 0, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_3_2_PULLDOWN, |
| g_param_spec_boolean ("pulldown-3-2", "3-2 pull down", |
| "Generate header flags for 3-2 pull down 24fps movies", |
| FALSE, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_SEQUENCE_HEADER_EVERY_GOP, |
| g_param_spec_boolean ("sequence-header-every-gop", |
| "Sequence hdr. every GOP", |
| "Include a sequence header in every GOP", |
| FALSE, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_DUMMY_SVCD_SOF, |
| g_param_spec_boolean ("dummy-svcd-sof", "Dummy SVCD SOF", |
| "Generate dummy SVCD scan-data (for vcdimager)", |
| TRUE, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_PLAYBACK_FIELD_ORDER, |
| g_param_spec_enum ("playback-field-order", "Playback field order", |
| "Force specific playback field order", |
| GST_TYPE_MPEG2ENC_PLAYBACK_FIELD_ORDER, Y4M_UNKNOWN, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_CORRECT_SVCD_HDS, |
| g_param_spec_boolean ("correct-svcd-hds", "Correct SVCD hor. size", |
| "Force SVCD width to 480 instead of 540/720", |
| FALSE, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| g_object_class_install_property (klass, ARG_ALTSCAN_MPEG2, |
| g_param_spec_boolean ("altscan-mpeg2", "Alt. MPEG-2 scan", |
| "Alternate MPEG-2 block scanning. Disabling this might " |
| "make buggy players play SVCD streams", |
| TRUE, |
| (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| |
| /* dangerous/experimental stuff */ |
| g_object_class_install_property (klass, ARG_CONSTRAINTS, |
| g_param_spec_boolean ("constraints", "Constraints", |
| "Use strict video resolution and bitrate checks", |
| TRUE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| #if GST_MJPEGTOOLS_API >= 10800 |
| g_object_class_install_property (klass, ARG_DUALPRIME_MPEG2, |
| g_param_spec_boolean ("dualprime", "Dual Prime Motion Estimation", |
| "Dual Prime Motion Estimation Mode for MPEG-2 I/P-frame only " |
| "streams. Quite some players do not support this.", |
| FALSE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); |
| #endif |
| } |
| |
| /* |
| * GObject property foo, C++ style. |
| */ |
| |
| void |
| GstMpeg2EncOptions::getProperty (guint prop_id, GValue * value) |
| { |
| switch (prop_id) { |
| case ARG_FORMAT: |
| g_value_set_enum (value, format); |
| break; |
| case ARG_FRAMERATE: |
| g_value_set_enum (value, frame_rate); |
| break; |
| case ARG_ASPECT: |
| g_value_set_enum (value, aspect_ratio); |
| break; |
| case ARG_INTERLACE_MODE: |
| g_value_set_enum (value, fieldenc); |
| break; |
| case ARG_BITRATE: |
| g_value_set_int (value, bitrate / 1000); |
| break; |
| case ARG_NONVIDEO_BITRATE: |
| g_value_set_int (value, nonvid_bitrate); |
| break; |
| case ARG_QUANTISATION: |
| g_value_set_int (value, force_cbr ? -1 : quant); |
| break; |
| case ARG_VCD_STILL_SIZE: |
| g_value_set_int (value, still_size / 1024); |
| break; |
| case ARG_MOTION_SEARCH_RADIUS: |
| g_value_set_int (value, searchrad); |
| break; |
| case ARG_REDUCTION_4_4: |
| g_value_set_int (value, me44_red); |
| break; |
| case ARG_REDUCTION_2_2: |
| g_value_set_int (value, me22_red); |
| break; |
| case ARG_UNIT_COEFF_ELIM: |
| g_value_set_int (value, unit_coeff_elim); |
| break; |
| case ARG_MIN_GOP_SIZE: |
| g_value_set_int (value, min_GOP_size); |
| break; |
| case ARG_MAX_GOP_SIZE: |
| g_value_set_int (value, max_GOP_size); |
| break; |
| case ARG_CLOSED_GOP: |
| g_value_set_boolean (value, closed_GOPs); |
| break; |
| case ARG_FORCE_B_B_P: |
| g_value_set_boolean (value, preserve_B); |
| break; |
| case ARG_B_PER_REFFRAME: |
| g_value_set_int (value, Bgrp_size - 1); |
| break; |
| case ARG_QUANTISATION_REDUCTION: |
| g_value_set_float (value, act_boost); |
| break; |
| case ARG_QUANT_REDUCTION_MAX_VAR: |
| g_value_set_float (value, boost_var_ceil); |
| break; |
| case ARG_INTRA_DC_PRECISION: |
| g_value_set_int (value, mpeg2_dc_prec + 8); |
| break; |
| case ARG_REDUCE_HF: |
| g_value_set_float (value, hf_q_boost); |
| break; |
| case ARG_KEEP_HF: |
| g_value_set_boolean (value, hf_quant == 2); |
| break; |
| case ARG_QUANTISATION_MATRIX: |
| switch (hf_quant) { |
| case 0: |
| g_value_set_enum (value, GST_MPEG2ENC_QUANTISATION_MATRIX_DEFAULT); |
| break; |
| case 2: |
| g_value_set_enum (value, GST_MPEG2ENC_QUANTISATION_MATRIX_HI_RES); |
| break; |
| case 3: |
| g_value_set_enum (value, GST_MPEG2ENC_QUANTISATION_MATRIX_KVCD); |
| break; |
| case 4: |
| g_value_set_enum (value, GST_MPEG2ENC_QUANTISATION_MATRIX_TMPGENC); |
| break; |
| } |
| break; |
| case ARG_BUFSIZE: |
| g_value_set_int (value, video_buffer_size); |
| break; |
| case ARG_VIDEO_NORM: |
| g_value_set_enum (value, norm); |
| break; |
| case ARG_SEQUENCE_LENGTH: |
| g_value_set_int (value, seq_length_limit); |
| break; |
| case ARG_3_2_PULLDOWN: |
| g_value_set_boolean (value, vid32_pulldown); |
| break; |
| case ARG_SEQUENCE_HEADER_EVERY_GOP: |
| g_value_set_boolean (value, seq_hdr_every_gop); |
| break; |
| case ARG_DUMMY_SVCD_SOF: |
| g_value_set_boolean (value, svcd_scan_data); |
| break; |
| case ARG_PLAYBACK_FIELD_ORDER: |
| g_value_set_enum (value, force_interlacing); |
| break; |
| case ARG_CORRECT_SVCD_HDS: |
| g_value_set_boolean (value, !hack_svcd_hds_bug); |
| break; |
| case ARG_ALTSCAN_MPEG2: |
| g_value_set_boolean (value, !hack_altscan_bug); |
| break; |
| case ARG_CONSTRAINTS: |
| g_value_set_boolean (value, !ignore_constraints); |
| break; |
| #if GST_MJPEGTOOLS_API >= 10800 |
| case ARG_DUALPRIME_MPEG2: |
| g_value_set_boolean (value, hack_dualprime); |
| break; |
| #endif |
| default: |
| break; |
| } |
| } |
| |
| void |
| GstMpeg2EncOptions::setProperty (guint prop_id, const GValue * value) |
| { |
| switch (prop_id) { |
| case ARG_FORMAT: |
| format = g_value_get_enum (value); |
| break; |
| case ARG_FRAMERATE: |
| frame_rate = g_value_get_enum (value); |
| break; |
| case ARG_ASPECT: |
| aspect_ratio = g_value_get_enum (value); |
| break; |
| case ARG_INTERLACE_MODE: |
| fieldenc = g_value_get_enum (value); |
| break; |
| case ARG_BITRATE: |
| bitrate = g_value_get_int (value) * 1000; |
| if (bitrate % 400 != 0) { |
| bitrate = (bitrate / 400 + 1) * 400; |
| GST_INFO ("MPEG bitrate must be a multiple of 400" |
| " - rounded up to bitrate %d", bitrate / 1000); |
| } |
| break; |
| case ARG_NONVIDEO_BITRATE: |
| nonvid_bitrate = g_value_get_int (value); |
| break; |
| case ARG_QUANTISATION: |
| quant = g_value_get_int (value); |
| if (quant < 0) { |
| force_cbr = 1; |
| quant = 0; |
| } |
| break; |
| case ARG_VCD_STILL_SIZE: |
| still_size = g_value_get_int (value) * 1024; |
| break; |
| case ARG_MOTION_SEARCH_RADIUS: |
| searchrad = g_value_get_int (value); |
| break; |
| case ARG_REDUCTION_4_4: |
| me44_red = g_value_get_int (value); |
| break; |
| case ARG_REDUCTION_2_2: |
| me22_red = g_value_get_int (value); |
| break; |
| case ARG_UNIT_COEFF_ELIM: |
| unit_coeff_elim = g_value_get_int (value); |
| break; |
| case ARG_MIN_GOP_SIZE: |
| min_GOP_size = g_value_get_int (value); |
| break; |
| case ARG_MAX_GOP_SIZE: |
| max_GOP_size = g_value_get_int (value); |
| break; |
| case ARG_CLOSED_GOP: |
| closed_GOPs = g_value_get_boolean (value); |
| break; |
| case ARG_FORCE_B_B_P: |
| preserve_B = g_value_get_boolean (value); |
| break; |
| case ARG_B_PER_REFFRAME: |
| Bgrp_size = g_value_get_int (value) + 1; |
| break; |
| case ARG_QUANTISATION_REDUCTION: |
| act_boost = g_value_get_float (value); |
| break; |
| case ARG_QUANT_REDUCTION_MAX_VAR: |
| boost_var_ceil = g_value_get_float (value); |
| break; |
| case ARG_INTRA_DC_PRECISION: |
| mpeg2_dc_prec = g_value_get_int (value) - 8; |
| break; |
| case ARG_REDUCE_HF: |
| hf_q_boost = g_value_get_float (value); |
| if (hf_quant == 0 && hf_q_boost != 0.) |
| hf_quant = 1; |
| break; |
| case ARG_KEEP_HF: |
| hf_quant = g_value_get_boolean (value) ? 2 : 0; |
| break; |
| case ARG_QUANTISATION_MATRIX: |
| switch (g_value_get_enum (value)) { |
| case GST_MPEG2ENC_QUANTISATION_MATRIX_DEFAULT: |
| hf_quant = 0; |
| hf_q_boost = 0; |
| break; |
| case GST_MPEG2ENC_QUANTISATION_MATRIX_HI_RES: |
| hf_quant = 2; |
| break; |
| case GST_MPEG2ENC_QUANTISATION_MATRIX_KVCD: |
| hf_quant = 3; |
| break; |
| case GST_MPEG2ENC_QUANTISATION_MATRIX_TMPGENC: |
| hf_quant = 4; |
| break; |
| } |
| break; |
| case ARG_BUFSIZE: |
| video_buffer_size = g_value_get_int (value); |
| break; |
| case ARG_VIDEO_NORM: |
| norm = g_value_get_enum (value); |
| break; |
| case ARG_SEQUENCE_LENGTH: |
| seq_length_limit = g_value_get_int (value); |
| break; |
| case ARG_3_2_PULLDOWN: |
| vid32_pulldown = g_value_get_boolean (value); |
| break; |
| case ARG_SEQUENCE_HEADER_EVERY_GOP: |
| seq_hdr_every_gop = g_value_get_boolean (value); |
| break; |
| case ARG_DUMMY_SVCD_SOF: |
| svcd_scan_data = g_value_get_boolean (value); |
| break; |
| case ARG_PLAYBACK_FIELD_ORDER: |
| force_interlacing = g_value_get_enum (value); |
| break; |
| case ARG_CORRECT_SVCD_HDS: |
| hack_svcd_hds_bug = !g_value_get_boolean (value); |
| break; |
| case ARG_ALTSCAN_MPEG2: |
| hack_altscan_bug = !g_value_get_boolean (value); |
| break; |
| case ARG_CONSTRAINTS: |
| ignore_constraints = !g_value_get_boolean (value); |
| break; |
| #if GST_MJPEGTOOLS_API >= 10800 |
| case ARG_DUALPRIME_MPEG2: |
| hack_dualprime = g_value_get_boolean (value); |
| break; |
| #endif |
| default: |
| break; |
| } |
| } |