mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-26 19:51:11 +00:00
configure.ac: Clean up detection of different mjpegtoolsAPI versions.
Original commit message from CVS: Patch by: Mark Nauwelaerts <manauw at skynet dot be> * configure.ac: Clean up detection of different mjpegtoolsAPI versions. * ext/mpeg2enc/gstmpeg2enc.cc: * ext/mpeg2enc/gstmpeg2enc.hh: * ext/mpeg2enc/gstmpeg2encoder.cc: * ext/mpeg2enc/gstmpeg2encoptions.cc: * ext/mpeg2enc/gstmpeg2encpicturereader.cc: * ext/mpeg2enc/gstmpeg2encpicturereader.hh: * ext/mpeg2enc/gstmpeg2encstreamwriter.cc: * ext/mpeg2enc/gstmpeg2encstreamwriter.hh: Streamline conditional code for evolving mjpegtools API, optimize and fix/prevent crash in log handling, use names/nicks for enums in the usual way andm inor updates in code and properties/settings. Partially fixes bug #520329.
This commit is contained in:
parent
15ac9f5a13
commit
646ac4cdf2
10 changed files with 179 additions and 131 deletions
20
ChangeLog
20
ChangeLog
|
@ -1,3 +1,23 @@
|
|||
2008-03-05 Sebastian Dröge <slomo@circular-chaos.org>
|
||||
|
||||
Patch by: Mark Nauwelaerts <manauw at skynet dot be>
|
||||
|
||||
* configure.ac:
|
||||
Clean up detection of different mjpegtoolsAPI versions.
|
||||
|
||||
* ext/mpeg2enc/gstmpeg2enc.cc:
|
||||
* ext/mpeg2enc/gstmpeg2enc.hh:
|
||||
* ext/mpeg2enc/gstmpeg2encoder.cc:
|
||||
* ext/mpeg2enc/gstmpeg2encoptions.cc:
|
||||
* ext/mpeg2enc/gstmpeg2encpicturereader.cc:
|
||||
* ext/mpeg2enc/gstmpeg2encpicturereader.hh:
|
||||
* ext/mpeg2enc/gstmpeg2encstreamwriter.cc:
|
||||
* ext/mpeg2enc/gstmpeg2encstreamwriter.hh:
|
||||
Streamline conditional code for evolving mjpegtools API,
|
||||
optimize and fix/prevent crash in log handling, use
|
||||
names/nicks for enums in the usual way andm inor updates
|
||||
in code and properties/settings. Partially fixes bug #520329.
|
||||
|
||||
2008-03-04 Zaheer Abbas Merali <zaheerabbas at merali dot org>
|
||||
|
||||
* gst/mpegtsparse/gstmpegdesc.h:
|
||||
|
|
50
configure.ac
50
configure.ac
|
@ -608,18 +608,34 @@ AC_SUBST(LIBMMS_LIBS)
|
|||
dnl *** mjpegtools version info ***
|
||||
dnl some may prefer older version (given quirks above)
|
||||
dnl hm, no version info seems available within mjpegtools headers
|
||||
|
||||
PKG_CHECK_EXISTS(mjpegtools >= 1.9.0 mjpegtools < 1.10.0, [
|
||||
AC_DEFINE(GST_MJPEGTOOLS_19x, 1, [mjpegtools >= 1.9.0 is used])
|
||||
have_mpjegtools_19x=yes
|
||||
dnl and API really moves along
|
||||
echo
|
||||
PKG_CHECK_EXISTS(mjpegtools >= 1.6.1.93 mjpegtools < 1.8.0, [
|
||||
mjpegtools_api=10601
|
||||
], [
|
||||
PKG_CHECK_EXISTS(mjpegtools >= 1.8.0 mjpegtools < 1.9.0, [
|
||||
mjpegtools_api=10800
|
||||
], [
|
||||
have_mpjegtools_19x=no])
|
||||
|
||||
PKG_CHECK_EXISTS(mjpegtools >= 1.8.0, [
|
||||
AC_DEFINE(GST_MJPEGTOOLS_18x, 1, [mjpegtools >= 1.8.0 is used])
|
||||
have_mpjegtools_18x=yes
|
||||
], [
|
||||
have_mpjegtools_18x=no])
|
||||
PKG_CHECK_MODULES(MJPEG, mjpegtools >= 1.9.0, [
|
||||
dnl logging API changed in release candidates
|
||||
OLD_CFLAGS="$CFLAGS"
|
||||
OLD_LIBS="$LIBS"
|
||||
CFLAGS="$MJPEG_CFLAGS"
|
||||
LIBS="$LIBS $MJPEG_LIBS -lmjpegutils -lm -lpthread"
|
||||
AC_CHECK_FUNC(mjpeg_loglev_t, [
|
||||
mjpegtools_api=10903
|
||||
], [
|
||||
mjpegtools_api=10900
|
||||
])
|
||||
CFLAGS="$OLD_CFLAGS"
|
||||
LIBS="$OLD_LIBS"
|
||||
], [
|
||||
mjpegtools_api=0
|
||||
])
|
||||
])
|
||||
])
|
||||
AC_DEFINE_UNQUOTED(GST_MJPEGTOOLS_API, $mjpegtools_api,
|
||||
[mjpegtools API evolution])
|
||||
|
||||
dnl *** mpeg2enc ***
|
||||
translit(dnm, m, l) AM_CONDITIONAL(USE_MPEG2ENC, true)
|
||||
|
@ -665,21 +681,15 @@ AG_GST_CHECK_FEATURE(MPEG2ENC, [mpeg2enc], mpeg2enc, [
|
|||
dnl mpeg2syntaxcodes.h header by default, and a new release
|
||||
dnl is not in sight, so check for this oversight in case
|
||||
dnl distros or folks have fixed this themselves
|
||||
if test "x$have_mpjegtools_18x" = "xyes"; then
|
||||
if test "$mjpegtools_api" -ge "10800"; then
|
||||
AC_CHECK_HEADER([mpeg2syntaxcodes.h], [
|
||||
mpeg2enc_headers_ok=yes
|
||||
], [
|
||||
mpeg2enc_headers_ok=no
|
||||
])
|
||||
else
|
||||
mpeg2enc_headers_ok=yes
|
||||
else
|
||||
mpeg2enc_headers_ok=yes
|
||||
fi
|
||||
|
||||
if test "x$have_mpjegtools_19x" = "xyes"; then
|
||||
AG_GST_CHECK_LIBHEADER(MJPEGTOOLS_19rc3, mpeg2encpp, mjpeg_loglev_t, $MPEG2ENC_LIBS, mjpeg_logging.h,
|
||||
AC_DEFINE(GST_MJPEGTOOLS_19rc3, 1, [mjpegtools >= 1.9.3rc3 is used]))
|
||||
fi
|
||||
|
||||
if test "x$mpeg2enc_headers_ok" = "xyes"; then
|
||||
HAVE_MPEG2ENC="yes"
|
||||
fi
|
||||
|
|
|
@ -90,6 +90,7 @@ static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
|
|||
"mpegversion = (int) { 1, 2 }, " COMMON_VIDEO_CAPS)
|
||||
);
|
||||
|
||||
|
||||
static void gst_mpeg2enc_finalize (GObject * object);
|
||||
static void gst_mpeg2enc_reset (GstMpeg2enc * enc);
|
||||
static gboolean gst_mpeg2enc_setcaps (GstPad * pad, GstCaps * caps);
|
||||
|
@ -158,6 +159,7 @@ gst_mpeg2enc_finalize (GObject * object)
|
|||
|
||||
g_mutex_free (enc->tlock);
|
||||
g_cond_free (enc->cond);
|
||||
g_queue_free (enc->time);
|
||||
|
||||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||
}
|
||||
|
@ -195,6 +197,7 @@ gst_mpeg2enc_init (GstMpeg2enc * enc, GstMpeg2encClass * g_class)
|
|||
enc->buffer = NULL;
|
||||
enc->tlock = g_mutex_new ();
|
||||
enc->cond = g_cond_new ();
|
||||
enc->time = g_queue_new ();
|
||||
|
||||
gst_mpeg2enc_reset (enc);
|
||||
}
|
||||
|
@ -202,6 +205,8 @@ gst_mpeg2enc_init (GstMpeg2enc * enc, GstMpeg2encClass * g_class)
|
|||
static void
|
||||
gst_mpeg2enc_reset (GstMpeg2enc * enc)
|
||||
{
|
||||
GstBuffer *buf;
|
||||
|
||||
enc->eos = FALSE;
|
||||
enc->srcresult = GST_FLOW_OK;
|
||||
|
||||
|
@ -209,6 +214,8 @@ gst_mpeg2enc_reset (GstMpeg2enc * enc)
|
|||
if (enc->buffer)
|
||||
gst_buffer_unref (enc->buffer);
|
||||
enc->buffer = NULL;
|
||||
while ((buf = (GstBuffer *) g_queue_pop_head (enc->time)))
|
||||
gst_buffer_unref (buf);
|
||||
|
||||
if (enc->encoder) {
|
||||
delete enc->encoder;
|
||||
|
@ -548,6 +555,7 @@ gst_mpeg2enc_chain (GstPad * pad, GstBuffer * buffer)
|
|||
while (enc->buffer)
|
||||
GST_MPEG2ENC_WAIT (enc);
|
||||
enc->buffer = buffer;
|
||||
g_queue_push_tail (enc->time, gst_buffer_ref (buffer));
|
||||
GST_MPEG2ENC_SIGNAL (enc);
|
||||
GST_MPEG2ENC_MUTEX_UNLOCK (enc);
|
||||
|
||||
|
@ -573,13 +581,15 @@ eos:
|
|||
}
|
||||
ignore:
|
||||
{
|
||||
GstFlowReturn ret = enc->srcresult;
|
||||
|
||||
GST_DEBUG_OBJECT (enc,
|
||||
"ignoring buffer because encoding task encountered %s",
|
||||
gst_flow_get_name (enc->srcresult));
|
||||
GST_MPEG2ENC_MUTEX_UNLOCK (enc);
|
||||
|
||||
gst_buffer_unref (buffer);
|
||||
return enc->srcresult;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -649,44 +659,37 @@ done:
|
|||
static mjpeg_log_handler_t old_handler = NULL;
|
||||
|
||||
/* note that this will affect all mjpegtools elements/threads */
|
||||
|
||||
static void
|
||||
gst_mpeg2enc_log_callback (log_level_t level, const char *message)
|
||||
{
|
||||
GstDebugLevel gst_level;
|
||||
|
||||
#ifndef GST_MJPEGTOOLS_19rc3
|
||||
switch (level) {
|
||||
case LOG_NONE:
|
||||
gst_level = GST_LEVEL_NONE;
|
||||
break;
|
||||
case LOG_ERROR:
|
||||
gst_level = GST_LEVEL_ERROR;
|
||||
break;
|
||||
case LOG_INFO:
|
||||
gst_level = GST_LEVEL_INFO;
|
||||
break;
|
||||
case LOG_DEBUG:
|
||||
gst_level = GST_LEVEL_DEBUG;
|
||||
break;
|
||||
default:
|
||||
gst_level = GST_LEVEL_INFO;
|
||||
break;
|
||||
}
|
||||
#if GST_MJPEGTOOLS_API >= 10903
|
||||
static const gint mjpeg_log_error = mjpeg_loglev_t ("error");
|
||||
static const gint mjpeg_log_warn = mjpeg_loglev_t ("warn");
|
||||
static const gint mjpeg_log_info = mjpeg_loglev_t ("info");
|
||||
static const gint mjpeg_log_debug = mjpeg_loglev_t ("debug");
|
||||
#else
|
||||
if (level == mjpeg_loglev_t ("debug"))
|
||||
gst_level = GST_LEVEL_DEBUG;
|
||||
else if (level == mjpeg_loglev_t ("info"))
|
||||
gst_level = GST_LEVEL_INFO;
|
||||
else if (level == mjpeg_loglev_t ("warn"))
|
||||
gst_level = GST_LEVEL_WARNING;
|
||||
else if (level == mjpeg_loglev_t ("error"))
|
||||
gst_level = GST_LEVEL_ERROR;
|
||||
else
|
||||
gst_level = GST_LEVEL_INFO;
|
||||
static const gint mjpeg_log_error = LOG_ERROR;
|
||||
static const gint mjpeg_log_warn = LOG_WARN;
|
||||
static const gint mjpeg_log_info = LOG_INFO;
|
||||
static const gint mjpeg_log_debug = LOG_DEBUG;
|
||||
#endif
|
||||
|
||||
gst_debug_log (mpeg2enc_debug, gst_level, "", "", 0, NULL, message);
|
||||
if (level == mjpeg_log_error) {
|
||||
gst_level = GST_LEVEL_ERROR;
|
||||
} else if (level == mjpeg_log_warn) {
|
||||
gst_level = GST_LEVEL_WARNING;
|
||||
} else if (level == mjpeg_log_info) {
|
||||
gst_level = GST_LEVEL_INFO;
|
||||
} else if (level == mjpeg_log_debug) {
|
||||
gst_level = GST_LEVEL_DEBUG;
|
||||
} else {
|
||||
gst_level = GST_LEVEL_INFO;
|
||||
}
|
||||
|
||||
/* message could have a % in it, do not segfault in such case */
|
||||
gst_debug_log (mpeg2enc_debug, gst_level, "", "", 0, NULL, "%s", message);
|
||||
|
||||
/* chain up to the old handler;
|
||||
* this could actually be a handler from another mjpegtools based
|
||||
|
|
|
@ -88,6 +88,8 @@ typedef struct _GstMpeg2enc {
|
|||
GstFlowReturn srcresult;
|
||||
/* buffer for encoding task */
|
||||
GstBuffer *buffer;
|
||||
/* timestamps for output */
|
||||
GQueue *time;
|
||||
|
||||
} GstMpeg2enc;
|
||||
|
||||
|
|
|
@ -26,8 +26,10 @@
|
|||
|
||||
#include <mpegconsts.h>
|
||||
#include <quantize.hh>
|
||||
#ifdef GST_MJPEGTOOLS_19x
|
||||
#if GST_MJPEGTOOLS_API >= 10900
|
||||
#include <ontheflyratectl.hh>
|
||||
#include <pass1ratectl.hh>
|
||||
#include <pass2ratectl.hh>
|
||||
#else
|
||||
#include <ratectl.hh>
|
||||
#endif
|
||||
|
@ -57,18 +59,19 @@ GstMpeg2Encoder::~GstMpeg2Encoder ()
|
|||
gst_object_unref (element);
|
||||
}
|
||||
|
||||
gboolean
|
||||
GstMpeg2Encoder::setup ()
|
||||
gboolean GstMpeg2Encoder::setup ()
|
||||
{
|
||||
MPEG2EncInVidParams strm;
|
||||
GstMpeg2enc *enc;
|
||||
MPEG2EncInVidParams
|
||||
strm;
|
||||
GstMpeg2enc *
|
||||
enc;
|
||||
|
||||
enc = GST_MPEG2ENC (element);
|
||||
|
||||
/* I/O */
|
||||
reader = new GstMpeg2EncPictureReader (element, caps, &parms);
|
||||
reader->StreamPictureParams (strm);
|
||||
#if defined(GST_MJPEGTOOLS_18x) && !defined(GST_MJPEGTOOLS_19x)
|
||||
#if GST_MJPEGTOOLS_API == 10800
|
||||
/* chain thread caters for reading, do not need another thread for this */
|
||||
options.allow_parallel_read = FALSE;
|
||||
#endif
|
||||
|
@ -79,22 +82,20 @@ GstMpeg2Encoder::setup ()
|
|||
|
||||
/* encoding internals */
|
||||
quantizer = new Quantizer (parms);
|
||||
#ifdef GST_MJPEGTOOLS_19x
|
||||
#if GST_MJPEGTOOLS_API < 10900
|
||||
bitrate_controller = new OnTheFlyRateCtl (parms);
|
||||
#else
|
||||
pass1ratectl = new OnTheFlyPass1 (parms);
|
||||
pass2ratectl = new OnTheFlyPass2 (parms);
|
||||
#else
|
||||
bitrate_controller = new OnTheFlyRateCtl (parms);
|
||||
#endif
|
||||
|
||||
#ifdef GST_MJPEGTOOLS_18x
|
||||
#if GST_MJPEGTOOLS_API >= 10900
|
||||
/* sequencer */
|
||||
# ifdef GST_MJPEGTOOLS_19x
|
||||
seqencoder = new SeqEncoder (parms, *reader, *quantizer,
|
||||
*writer, *pass1ratectl, *pass2ratectl);
|
||||
# else
|
||||
#elif GST_MJPEGTOOLS_API >= 10800
|
||||
/* sequencer */
|
||||
seqencoder = new SeqEncoder (parms, *reader, *quantizer,
|
||||
*writer, *bitrate_controller);
|
||||
# endif
|
||||
#else
|
||||
coder = new MPEG2Coder (parms, *writer);
|
||||
/* sequencer */
|
||||
|
@ -112,7 +113,7 @@ GstMpeg2Encoder::init ()
|
|||
parms.Init (options);
|
||||
reader->Init ();
|
||||
quantizer->Init ();
|
||||
#ifdef GST_MJPEGTOOLS_18x
|
||||
#if GST_MJPEGTOOLS_API >= 10800
|
||||
seqencoder->Init ();
|
||||
#endif
|
||||
init_done = TRUE;
|
||||
|
@ -127,7 +128,7 @@ void
|
|||
GstMpeg2Encoder::encode ()
|
||||
{
|
||||
/* hm, this is all... eek! */
|
||||
#ifdef GST_MJPEGTOOLS_18x
|
||||
#if GST_MJPEGTOOLS_API >= 10800
|
||||
seqencoder->EncodeStream ();
|
||||
#else
|
||||
seqencoder->Encode ();
|
||||
|
|
|
@ -88,16 +88,16 @@ gst_mpeg2enc_format_get_type (void)
|
|||
|
||||
if (!mpeg2enc_format_type) {
|
||||
static const GEnumValue mpeg2enc_formats[] = {
|
||||
{0, "0", "Generic MPEG-1"},
|
||||
{1, "1", "Standard VCD"},
|
||||
{2, "2", "User VCD"},
|
||||
{3, "3", "Generic MPEG-2"},
|
||||
{4, "4", "Standard SVCD"},
|
||||
{5, "5", "User SVCD"},
|
||||
{6, "6", "VCD Stills sequences"},
|
||||
{7, "7", "SVCD Stills sequences"},
|
||||
{8, "8", "DVD MPEG-2 for dvdauthor"},
|
||||
{9, "9", "DVD MPEG-2"},
|
||||
{0, "Generic MPEG-1", "0"},
|
||||
{1, "Standard VCD", "1"},
|
||||
{2, "User VCD", "2"},
|
||||
{3, "Generic MPEG-2", "3"},
|
||||
{4, "Standard SVCD", "4"},
|
||||
{5, "User SVCD", "5"},
|
||||
{6, "VCD Stills sequences", "6"},
|
||||
{7, "SVCD Stills sequences", "7"},
|
||||
{8, "DVD MPEG-2 for dvdauthor", "8"},
|
||||
{9, "DVD MPEG-2", "9"},
|
||||
{0, NULL, NULL},
|
||||
};
|
||||
|
||||
|
@ -118,15 +118,15 @@ gst_mpeg2enc_framerate_get_type (void)
|
|||
|
||||
if (!mpeg2enc_framerate_type) {
|
||||
static const GEnumValue mpeg2enc_framerates[] = {
|
||||
{0, "0", "Same as input"},
|
||||
{1, "1", "24/1.001 (NTSC 3:2 pulldown converted film)"},
|
||||
{2, "2", "24 (native film)"},
|
||||
{3, "3", "25 (PAL/SECAM video)"},
|
||||
{4, "4", "30/1.001 (NTSC video)"},
|
||||
{5, "5", "30"},
|
||||
{6, "6", "50 (PAL/SECAM fields)"},
|
||||
{7, "7", "60/1.001 (NTSC fields)"},
|
||||
{8, "8", "60"},
|
||||
{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},
|
||||
};
|
||||
|
||||
|
@ -147,11 +147,11 @@ gst_mpeg2enc_aspect_get_type (void)
|
|||
|
||||
if (!mpeg2enc_aspect_type) {
|
||||
static const GEnumValue mpeg2enc_aspects[] = {
|
||||
{0, "0", "Deduce from input"},
|
||||
{1, "1", "1:1"},
|
||||
{2, "2", "4:3"},
|
||||
{3, "3", "16:9"},
|
||||
{4, "4", "2.21:1"},
|
||||
{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},
|
||||
};
|
||||
|
||||
|
@ -172,10 +172,10 @@ gst_mpeg2enc_interlace_mode_get_type (void)
|
|||
|
||||
if (!mpeg2enc_interlace_mode_type) {
|
||||
static const GEnumValue mpeg2enc_interlace_modes[] = {
|
||||
{-1, "-1", "Format default mode"},
|
||||
{0, "0", "Progressive"},
|
||||
{1, "1", "Interlaced, per-frame encoding"},
|
||||
{2, "2", "Interlaced, per-field-encoding"},
|
||||
{-1, "Format default mode", "-1"},
|
||||
{0, "Progressive", "0"},
|
||||
{1, "Interlaced, per-frame encoding", "1"},
|
||||
{2, "Interlaced, per-field-encoding", "2"},
|
||||
{0, NULL, NULL},
|
||||
};
|
||||
|
||||
|
@ -203,13 +203,13 @@ gst_mpeg2enc_quantisation_matrix_get_type (void)
|
|||
if (!mpeg2enc_quantisation_matrix_type) {
|
||||
static const GEnumValue mpeg2enc_quantisation_matrixes[] = {
|
||||
{GST_MPEG2ENC_QUANTISATION_MATRIX_DEFAULT,
|
||||
"0", "Default"},
|
||||
"Default", "9"},
|
||||
{GST_MPEG2ENC_QUANTISATION_MATRIX_HI_RES,
|
||||
"1", "High resolution"},
|
||||
"High resolution", "1"},
|
||||
{GST_MPEG2ENC_QUANTISATION_MATRIX_KVCD,
|
||||
"2", "KVCD"},
|
||||
"KVCD", "2"},
|
||||
{GST_MPEG2ENC_QUANTISATION_MATRIX_TMPGENC,
|
||||
"3", "TMPGEnc"},
|
||||
"TMPGEnc", "3"},
|
||||
{0, NULL, NULL},
|
||||
};
|
||||
|
||||
|
@ -231,10 +231,10 @@ gst_mpeg2enc_video_norm_get_type (void)
|
|||
|
||||
if (!mpeg2enc_video_norm_type) {
|
||||
static const GEnumValue mpeg2enc_video_norms[] = {
|
||||
{0, "0", "Unspecified"},
|
||||
{'p', "p", "PAL"},
|
||||
{'n', "n", "NTSC"},
|
||||
{'s', "s", "SECAM"},
|
||||
{0, "Unspecified", "0"},
|
||||
{'p', "PAL", "p"},
|
||||
{'n', "NTSC", "n"},
|
||||
{'s', "SECAM", "s"},
|
||||
{0, NULL, NULL},
|
||||
};
|
||||
|
||||
|
@ -255,9 +255,9 @@ gst_mpeg2enc_playback_field_order_get_type (void)
|
|||
|
||||
if (!mpeg2enc_playback_field_order_type) {
|
||||
static const GEnumValue mpeg2enc_playback_field_orders[] = {
|
||||
{Y4M_UNKNOWN, "0", "Unspecified"},
|
||||
{Y4M_ILACE_TOP_FIRST, "1", "Top-field first"},
|
||||
{Y4M_ILACE_BOTTOM_FIRST, "2", "Bottom-field first"},
|
||||
{Y4M_UNKNOWN, "Unspecified", "0"},
|
||||
{Y4M_ILACE_TOP_FIRST, "Top-field first", "1"},
|
||||
{Y4M_ILACE_BOTTOM_FIRST, "Bottom-field first", "2"},
|
||||
{0, NULL, NULL},
|
||||
};
|
||||
|
||||
|
@ -322,8 +322,8 @@ GstMpeg2EncOptions::initProperties (GObjectClass * klass)
|
|||
0, 10 * 1024, 0, (GParamFlags) G_PARAM_READWRITE));
|
||||
g_object_class_install_property (klass, ARG_QUANTISATION,
|
||||
g_param_spec_int ("quantisation", "Quantisation",
|
||||
"Quantisation factor (0=default, 1=best, 31=worst)",
|
||||
0, 31, 0, (GParamFlags) G_PARAM_READWRITE));
|
||||
"Quantisation factor (-1=cbr, 0=default, 1=best, 31=worst)",
|
||||
-1, 31, 0, (GParamFlags) G_PARAM_READWRITE));
|
||||
|
||||
/* stills options */
|
||||
g_object_class_install_property (klass, ARG_VCD_STILL_SIZE,
|
||||
|
@ -449,7 +449,7 @@ GstMpeg2EncOptions::initProperties (GObjectClass * klass)
|
|||
g_param_spec_boolean ("constraints", "Constraints",
|
||||
"Use strict video resolution and bitrate checks",
|
||||
TRUE, (GParamFlags) G_PARAM_READWRITE));
|
||||
#ifdef GST_MJPEGTOOLS_18x
|
||||
#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 "
|
||||
|
@ -485,7 +485,7 @@ GstMpeg2EncOptions::getProperty (guint prop_id, GValue * value)
|
|||
g_value_set_int (value, nonvid_bitrate / 1024);
|
||||
break;
|
||||
case ARG_QUANTISATION:
|
||||
g_value_set_int (value, quant);
|
||||
g_value_set_int (value, force_cbr ? -1 : quant);
|
||||
break;
|
||||
case ARG_VCD_STILL_SIZE:
|
||||
g_value_set_int (value, still_size / 1024);
|
||||
|
@ -578,7 +578,7 @@ GstMpeg2EncOptions::getProperty (guint prop_id, GValue * value)
|
|||
case ARG_CONSTRAINTS:
|
||||
g_value_set_boolean (value, !ignore_constraints);
|
||||
break;
|
||||
#ifdef GST_MJPEGTOOLS_18x
|
||||
#if GST_MJPEGTOOLS_API >= 10800
|
||||
case ARG_DUALPRIME_MPEG2:
|
||||
g_value_set_boolean (value, hack_dualprime);
|
||||
break;
|
||||
|
@ -612,6 +612,10 @@ GstMpeg2EncOptions::setProperty (guint prop_id, const GValue * 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;
|
||||
|
@ -707,7 +711,7 @@ GstMpeg2EncOptions::setProperty (guint prop_id, const GValue * value)
|
|||
case ARG_CONSTRAINTS:
|
||||
ignore_constraints = !g_value_get_boolean (value);
|
||||
break;
|
||||
#ifdef GST_MJPEGTOOLS_18x
|
||||
#if GST_MJPEGTOOLS_API >= 10800
|
||||
case ARG_DUALPRIME_MPEG2:
|
||||
hack_dualprime = g_value_get_boolean (value);
|
||||
break;
|
||||
|
|
|
@ -25,10 +25,6 @@
|
|||
|
||||
#include <encoderparams.hh>
|
||||
|
||||
#ifdef GST_MJPEGTOOLS_19x
|
||||
#include <imageplanes.hh>
|
||||
#endif
|
||||
|
||||
#include "gstmpeg2enc.hh"
|
||||
#include "gstmpeg2encpicturereader.hh"
|
||||
|
||||
|
@ -107,14 +103,13 @@ GstMpeg2EncPictureReader::StreamPictureParams (MPEG2EncInVidParams & strm)
|
|||
*/
|
||||
|
||||
bool
|
||||
#ifdef GST_MJPEGTOOLS_19x
|
||||
#if GST_MJPEGTOOLS_API >= 10900
|
||||
GstMpeg2EncPictureReader::LoadFrame (ImagePlanes & image)
|
||||
#else
|
||||
GstMpeg2EncPictureReader::LoadFrame ()
|
||||
#endif
|
||||
{
|
||||
|
||||
#ifndef GST_MJPEGTOOLS_19x
|
||||
#if GST_MJPEGTOOLS_API < 10900
|
||||
gint n;
|
||||
#endif
|
||||
gint i, x, y;
|
||||
|
@ -136,27 +131,27 @@ bool
|
|||
}
|
||||
|
||||
frame = GST_BUFFER_DATA (enc->buffer);
|
||||
#ifndef GST_MJPEGTOOLS_19x
|
||||
#if GST_MJPEGTOOLS_API < 10900
|
||||
n = frames_read % input_imgs_buf_size;
|
||||
#endif
|
||||
x = encparams.horizontal_size;
|
||||
y = encparams.vertical_size;
|
||||
|
||||
for (i = 0; i < y; i++) {
|
||||
#ifdef GST_MJPEGTOOLS_19x
|
||||
#if GST_MJPEGTOOLS_API >= 10900
|
||||
memcpy (image.Plane (0) + i * encparams.phy_width, frame, x);
|
||||
#else
|
||||
memcpy (input_imgs_buf[n][0] + i * encparams.phy_width, frame, x);
|
||||
#endif
|
||||
frame += x;
|
||||
}
|
||||
#ifndef GST_MJPEGTOOLS_19x
|
||||
#if GST_MJPEGTOOLS_API < 10900
|
||||
lum_mean[n] = LumMean (input_imgs_buf[n][0]);
|
||||
#endif
|
||||
x >>= 1;
|
||||
y >>= 1;
|
||||
for (i = 0; i < y; i++) {
|
||||
#ifdef GST_MJPEGTOOLS_19x
|
||||
#if GST_MJPEGTOOLS_API >= 10900
|
||||
memcpy (image.Plane (1) + i * encparams.phy_chrom_width, frame, x);
|
||||
#else
|
||||
memcpy (input_imgs_buf[n][1] + i * encparams.phy_chrom_width, frame, x);
|
||||
|
@ -164,7 +159,7 @@ bool
|
|||
frame += x;
|
||||
}
|
||||
for (i = 0; i < y; i++) {
|
||||
#ifdef GST_MJPEGTOOLS_19x
|
||||
#if GST_MJPEGTOOLS_API >= 10900
|
||||
memcpy (image.Plane (2) + i * encparams.phy_chrom_width, frame, x);
|
||||
#else
|
||||
memcpy (input_imgs_buf[n][2] + i * encparams.phy_chrom_width, frame, x);
|
||||
|
|
|
@ -25,6 +25,10 @@
|
|||
#include <gst/gst.h>
|
||||
|
||||
#include <picturereader.hh>
|
||||
#if GST_MJPEGTOOLS_API >= 10900
|
||||
#include <imageplanes.hh>
|
||||
#endif
|
||||
|
||||
|
||||
class GstMpeg2EncPictureReader : public PictureReader {
|
||||
public:
|
||||
|
@ -37,7 +41,7 @@ public:
|
|||
|
||||
protected:
|
||||
/* read a frame */
|
||||
#ifdef GST_MJPEGTOOLS_19x
|
||||
#if GST_MJPEGTOOLS_API >= 10900
|
||||
bool LoadFrame (ImagePlanes &image);
|
||||
#else
|
||||
bool LoadFrame ();
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
#include "gstmpeg2encstreamwriter.hh"
|
||||
#include <string.h>
|
||||
|
||||
#ifdef GST_MJPEGTOOLS_18x
|
||||
#if GST_MJPEGTOOLS_API >= 10800
|
||||
|
||||
/*
|
||||
* Class init stuff.
|
||||
|
@ -51,7 +51,7 @@ void
|
|||
GstMpeg2EncStreamWriter::WriteOutBufferUpto (const guint8 * buffer,
|
||||
const guint32 flush_upto)
|
||||
{
|
||||
GstBuffer *buf;
|
||||
GstBuffer *buf, *inbuf;
|
||||
GstMpeg2enc *enc = GST_MPEG2ENC (GST_PAD_PARENT (pad));
|
||||
|
||||
buf = gst_buffer_new_and_alloc (flush_upto);
|
||||
|
@ -62,12 +62,21 @@ GstMpeg2EncStreamWriter::WriteOutBufferUpto (const guint8 * buffer,
|
|||
/* this should not block anything else (e.g. chain), but if it does,
|
||||
* it's ok as mpeg2enc is not really a loop-based element, but push-based */
|
||||
GST_MPEG2ENC_MUTEX_LOCK (enc);
|
||||
/* best effort at giving output some meaningful time metadata
|
||||
* no mpeg2enc specs on this though, but it might help getting the output
|
||||
* into container formats that really do like timestamps (unlike mplex) */
|
||||
if ((inbuf = (GstBuffer *) g_queue_pop_head (enc->time))) {
|
||||
GST_BUFFER_TIMESTAMP (buf) = GST_BUFFER_TIMESTAMP (inbuf);
|
||||
GST_BUFFER_DURATION (buf) = GST_BUFFER_DURATION (inbuf);
|
||||
gst_buffer_unref (inbuf);
|
||||
}
|
||||
gst_buffer_set_caps (buf, GST_PAD_CAPS (pad));
|
||||
enc->srcresult = gst_pad_push (pad, buf);
|
||||
GST_MPEG2ENC_MUTEX_UNLOCK (enc);
|
||||
}
|
||||
|
||||
guint64 GstMpeg2EncStreamWriter::BitCount ()
|
||||
guint64
|
||||
GstMpeg2EncStreamWriter::BitCount ()
|
||||
{
|
||||
return flushed * 8ll;
|
||||
}
|
||||
|
@ -157,4 +166,4 @@ void
|
|||
GstMpeg2EncStreamWriter::FrameDiscard ()
|
||||
{
|
||||
}
|
||||
#endif /* GST_MJPEGTOOLS_18x */
|
||||
#endif /* GST_MJPEGTOOLS_API >= 10800 */
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
|
||||
#include <elemstrmwriter.hh>
|
||||
|
||||
#ifdef GST_MJPEGTOOLS_18x
|
||||
#if GST_MJPEGTOOLS_API >= 10800
|
||||
|
||||
class GstMpeg2EncStreamWriter : public ElemStrmWriter {
|
||||
public:
|
||||
|
@ -61,6 +61,6 @@ private:
|
|||
GstPad *pad;
|
||||
GstBuffer *buf;
|
||||
};
|
||||
#endif /* GST_MJPEGTOOLS_18x */
|
||||
#endif /* GST_MJPEGTOOLS_API >= 10800 */
|
||||
|
||||
#endif /* __GST_MPEG2ENCSTREAMWRITER_H__ */
|
||||
|
|
Loading…
Reference in a new issue