Merge branch 'master' into 0.11-fdo

This commit is contained in:
Wim Taymans 2011-03-15 11:11:56 +01:00
commit 95f7fd8edf
14 changed files with 289 additions and 34 deletions

View file

@ -135,18 +135,20 @@ dnl *** checks for programs ***
dnl find a compiler
AC_PROG_CC
AC_PROG_CC_STDC
AC_PROG_CXX
dnl determine if c++ is available on this system
AC_CHECK_PROG(HAVE_CXX, $CXX, yes, no)
dnl determine c++ preprocessor
dnl FIXME: do we need this ?
AC_PROG_CXXCPP
dnl check if the compiler supports '-c' and '-o' options
AM_PROG_CC_C_O
dnl determine if c++ is available on this system
AC_PROG_CXX
dnl CXX may be set to some default even if no c++ compiler is available
dnl (thanks autotools!), so just try to compile some c++ code to make sure
AC_LANG_PUSH([C++])
AC_TRY_COMPILE([ class Foo { int bar; };], , working_cxx=yes, working_cxx=no)
AC_LANG_POP([C++])
AC_MSG_NOTICE([working c++ compiler found: $working_cxx])
AM_CONDITIONAL(HAVE_CXX, test "x$working_cxx" = "xyes")
AC_PATH_PROG(VALGRIND_PATH, valgrind, no)
AM_CONDITIONAL(HAVE_VALGRIND, test ! "x$VALGRIND_PATH" = "xno")

View file

@ -835,6 +835,7 @@ gst_ogg_mux_queue_pads (GstOggMux * ogg_mux)
GST_DEBUG_OBJECT (ogg_mux,
"got header buffer in control state, ignoring");
/* just ignore */
pad->map.n_header_packets_seen++;
gst_buffer_unref (buf);
buf = NULL;
} else {

View file

@ -32,7 +32,7 @@
* the text set via the "text" property will be rendered. If the text sink
* pad is linked, text will be rendered as it is received on that pad,
* honouring and matching the buffer timestamps of both input streams.
*
*
* The text can contain newline characters and text wrapping is enabled by
* default.
*
@ -41,7 +41,7 @@
* |[
* gst-launch -v videotestsrc ! textoverlay text="Room A" valign=top halign=left ! xvimagesink
* ]| Here is a simple pipeline that displays a static text in the top left
* corner of the video picture
* corner of the video picture
* |[
* gst-launch -v filesrc location=subtitles.srt ! subparse ! txt. videotestsrc ! timeoverlay ! textoverlay name=txt shaded-background=yes ! xvimagesink
* ]| Here is another pipeline that displays subtitles from an .srt subtitle
@ -54,12 +54,12 @@
* 1
* 00:00:03,000 --> 00:00:05,000
* Hello? (3-5s)
*
*
* 2
* 00:00:08,000 --> 00:00:13,000
* Yes, this is a subtitle. Don't
* you like it? (8-13s)
*
*
* 3
* 00:00:18,826 --> 00:01:02,886
* Uh? What are you talking about?
@ -375,6 +375,8 @@ gst_text_overlay_class_init (GstTextOverlayClass * klass)
gstelement_class->change_state =
GST_DEBUG_FUNCPTR (gst_text_overlay_change_state);
klass->pango_lock = g_mutex_new ();
klass->get_text = gst_text_overlay_get_text;
fontmap = pango_cairo_font_map_get_default ();
klass->pango_context =
@ -1235,6 +1237,8 @@ gst_text_overlay_render_pangocairo (GstTextOverlay * overlay,
double scalef = 1.0;
double a, r, g, b;
g_mutex_lock (GST_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
if (overlay->auto_adjust_size) {
/* 640 pixel is default */
scalef = (double) (overlay->width) / DEFAULT_SCALE_BASIS;
@ -1250,8 +1254,8 @@ gst_text_overlay_render_pangocairo (GstTextOverlay * overlay,
if (width + overlay->deltax >
(overlay->use_vertical_render ? overlay->height : overlay->width)) {
/*
* subtitle image width is larger then overlay width
/*
* subtitle image width is larger then overlay width
* so rearrange overlay wrap mode.
*/
gst_text_overlay_update_wrap_mode (overlay);
@ -1298,6 +1302,8 @@ gst_text_overlay_render_pangocairo (GstTextOverlay * overlay,
cairo_matrix_init_scale (&cairo_matrix, scalef, scalef);
}
g_mutex_unlock (GST_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
/* reallocate surface */
overlay->text_image = g_realloc (overlay->text_image, 4 * width * height);

View file

@ -155,6 +155,7 @@ struct _GstTextOverlayClass {
GstElementClass parent_class;
PangoContext *pango_context;
GMutex *pango_lock;
gchar * (*get_text) (GstTextOverlay *overlay, GstBuffer *video_frame);
};

View file

@ -443,6 +443,15 @@ uridecodebin_pad_added_cb (GstElement * uridecodebin, GstPad * pad,
{
PrivateStream *ps;
GstPad *sinkpad = NULL;
GstCaps *caps;
static GstCaps *subs_caps = NULL;
if (!subs_caps) {
subs_caps = gst_caps_from_string ("text/plain; text/x-pango-markup; "
"subpicture/x-pgs; subpicture/x-dvb; application/x-subtitle-unknown; "
"application/x-ssa; application/x-ass; subtitle/x-kate; "
"video/x-dvd-subpicture; ");
}
GST_DEBUG_OBJECT (dc, "pad %s:%s", GST_DEBUG_PAD_NAME (pad));
@ -459,6 +468,16 @@ uridecodebin_pad_added_cb (GstElement * uridecodebin, GstPad * pad,
g_object_set (ps->sink, "silent", TRUE, NULL);
g_object_set (ps->queue, "max-size-buffers", 1, "silent", TRUE, NULL);
caps = gst_pad_get_caps_reffed (pad);
if (gst_caps_can_intersect (caps, subs_caps)) {
/* Subtitle streams are sparse and don't provide any information - don't
* wait for data to preroll */
g_object_set (ps->sink, "async", FALSE, NULL);
}
gst_caps_unref (caps);
gst_bin_add_many (dc->priv->pipeline, ps->queue, ps->sink, NULL);
if (!gst_element_link_pads_full (ps->queue, "src", ps->sink, "sink",

View file

@ -1698,9 +1698,9 @@ gst_encode_bin_set_profile (GstEncodeBin * ebin, GstEncodingProfile * profile)
}
/* If we're not active, we can deactivate the previous profile */
if (ebin->profile)
gst_encoding_profile_unref (ebin->profile);
ebin->profile = NULL;
if (ebin->profile) {
gst_encode_bin_tear_down_profile (ebin);
}
return gst_encode_bin_setup_profile (ebin, profile);
}

View file

@ -678,7 +678,7 @@ gst_decode_bin_class_init (GstDecodeBinClass * klass)
* If this function returns NULL, @pad will be exposed as a final caps.
*
* If this function returns an empty array, the pad will be considered as
* having an unhandled type media type.
* having an unhandled type media type.
*
* <note>
* Only the signal handler that is connected first will ever by invoked.
@ -2696,10 +2696,12 @@ gst_decode_group_new (GstDecodeBin * dbin, GstDecodeChain * parent)
if (G_UNLIKELY (!group->multiqueue))
goto missing_multiqueue;
g_object_set (mq, "use-buffering", dbin->use_buffering, NULL);
/* default is for use-buffering is FALSE */
if (dbin->use_buffering) {
g_object_set (mq, "low-percent", dbin->low_percent, NULL);
g_object_set (mq, "high-percent", dbin->high_percent, NULL);
g_object_set (mq,
"use-buffering", TRUE,
"low-percent", dbin->low_percent,
"high-percent", dbin->high_percent, NULL);
}
/* configure queue sizes for preroll */

View file

@ -705,7 +705,7 @@ queue_threshold_reached (GstElement * queue, GstPlayBaseBin * play_base_bin)
}
/* this signal will be fired when one of the queues with raw
* data is filled. This means that the group building stage is over
* data is filled. This means that the group building stage is over
* and playback of the new queued group should start. This is a rather unusual
* situation because normally the group is commited when the "no_more_pads"
* signal is fired.
@ -843,7 +843,7 @@ gen_preroll_element (GstPlayBaseBin * play_base_bin,
/* the overrun signal is always attached and serves two purposes:
*
* 1) when we are building a group and the overrun is called, we commit the
* 1) when we are building a group and the overrun is called, we commit the
* group. The reason being that if we fill the entire queue without a
* normal group commit (with _no_more_pads()) we can assume the
* audio/video is completely wacked or the element just does not know when
@ -1252,7 +1252,7 @@ probe_triggered (GstPad * pad, GstEvent * event, gpointer user_data)
/* This function will be called when the sinkpad of the preroll element
* is unlinked, we have to connect something to the sinkpad or else the
* state change will fail..
* state change will fail..
*/
static void
preroll_unlinked (GstPad * pad, GstPad * peerpad,
@ -1315,8 +1315,8 @@ silence_stream (GstPad * pad, GstMiniObject * data, gpointer user_data)
return FALSE;
}
/* Called by the signal handlers when a decodebin (main or subtitle) has
* found a new raw pad. We create a preroll element if needed and the
/* Called by the signal handlers when a decodebin (main or subtitle) has
* found a new raw pad. We create a preroll element if needed and the
* appropriate streaminfo. Commits the group if there will be no more pads
* from decodebin */
static void
@ -1936,7 +1936,7 @@ analyse_source (GstPlayBaseBin * play_base_bin, gboolean * is_raw,
if (GST_PAD_TEMPLATE_DIRECTION (templ) == GST_PAD_SRC) {
if (GST_PAD_TEMPLATE_PRESENCE (templ) == GST_PAD_SOMETIMES) {
*is_dynamic = TRUE;
break; /* only break out if we found a sometimes src pad
break; /* only break out if we found a sometimes src pad
continue walking through if say a request src pad is found
elements such as mpegtsparse and dvbbasebin have request
and sometimes src pads */

View file

@ -2426,7 +2426,7 @@ notify_tags_cb (GObject * object, GParamSpec * pspec, gpointer user_data)
}
/* this function is called when a new pad is added to decodebin. We check the
* type of the pad and add it to the selector element of the group.
* type of the pad and add it to the selector element of the group.
*/
static void
pad_added_cb (GstElement * decodebin, GstPad * pad, GstSourceGroup * group)
@ -3431,7 +3431,7 @@ deactivate_group (GstPlayBin * playbin, GstSourceGroup * group)
}
/* setup the next group to play, this assumes the next_group is valid and
* configured. It swaps out the current_group and activates the valid
* configured. It swaps out the current_group and activates the valid
* next_group. */
static gboolean
setup_next_source (GstPlayBin * playbin, GstState target)

View file

@ -1333,7 +1333,7 @@ static GstStaticCaps dts_caps = GST_STATIC_CAPS ("audio/x-dts");
static gboolean
dts_parse_frame_header (DataScanCtx * c, guint * frame_size,
guint * sample_rate, guint * channels)
guint * sample_rate, guint * channels, guint * depth, guint * endianness)
{
static const int sample_rates[16] = { 0, 8000, 16000, 32000, 0, 0, 11025,
22050, 44100, 0, 0, 12000, 24000, 48000, 96000, 192000
@ -1349,11 +1349,13 @@ dts_parse_frame_header (DataScanCtx * c, guint * frame_size,
/* raw big endian or 14-bit big endian */
if (marker == 0x7FFE8001 || marker == 0x1FFFE800) {
*endianness = G_BIG_ENDIAN;
for (i = 0; i < G_N_ELEMENTS (hdr); ++i)
hdr[i] = GST_READ_UINT16_BE (c->data + (i * sizeof (guint16)));
} else
/* raw little endian or 14-bit little endian */
if (marker == 0xFE7F0180 || marker == 0xFF1F00E8) {
*endianness = G_LITTLE_ENDIAN;
for (i = 0; i < G_N_ELEMENTS (hdr); ++i)
hdr[i] = GST_READ_UINT16_LE (c->data + (i * sizeof (guint16)));
} else {
@ -1376,6 +1378,9 @@ dts_parse_frame_header (DataScanCtx * c, guint * frame_size,
hdr[5] = (hdr[5] << 12) | ((hdr[6] >> 2) & 0x0FFF);
hdr[6] = (hdr[6] << 14) | ((hdr[7] >> 0) & 0x3FFF);
g_assert (hdr[0] == 0x7FFE && hdr[1] == 0x8001);
*depth = 14;
} else {
*depth = 16;
}
GST_LOG ("frame header: %04x%04x%04x%04x", hdr[2], hdr[3], hdr[4], hdr[5]);
@ -1409,12 +1414,13 @@ dts_type_find (GstTypeFind * tf, gpointer unused)
* a lower probability if not found right at the start. Check that the
* frame is followed by a second frame at the expected offset. */
while (c.offset <= DTS_MAX_FRAMESIZE) {
guint frame_size = 0, rate = 0, chans = 0;
guint frame_size = 0, rate = 0, chans = 0, depth = 0, endianness = 0;
if (G_UNLIKELY (!data_scan_ctx_ensure_data (tf, &c, DTS_MIN_FRAMESIZE)))
return;
if (G_UNLIKELY (dts_parse_frame_header (&c, &frame_size, &rate, &chans))) {
if (G_UNLIKELY (dts_parse_frame_header (&c, &frame_size, &rate, &chans,
&depth, &endianness))) {
GstTypeFindProbability prob;
DataScanCtx next_c;
@ -1433,10 +1439,13 @@ dts_type_find (GstTypeFind * tf, gpointer unused)
if (chans > 0) {
gst_type_find_suggest_simple (tf, prob, "audio/x-dts",
"rate", G_TYPE_INT, rate, "channels", G_TYPE_INT, chans,
"depth", G_TYPE_INT, depth, "endianness", G_TYPE_INT, endianness,
"framed", G_TYPE_BOOLEAN, FALSE, NULL);
} else {
gst_type_find_suggest_simple (tf, prob, "audio/x-dts",
"rate", G_TYPE_INT, rate, "framed", G_TYPE_BOOLEAN, FALSE, NULL);
"rate", G_TYPE_INT, rate, "depth", G_TYPE_INT, depth,
"endianness", G_TYPE_INT, endianness,
"framed", G_TYPE_BOOLEAN, FALSE, NULL);
}
return;

View file

@ -99,6 +99,12 @@ else
check_orc =
endif
if HAVE_CXX
cxx_checks = libs/gstlibscpp
else
cxx_checks =
endif
check_PROGRAMS = \
$(check_alsa) \
$(check_gnomevfs) \
@ -144,6 +150,7 @@ check_PROGRAMS = \
libs/rtsp \
libs/tag \
libs/video \
$(cxx_checks) \
$(check_orc) \
pipelines/simple-launch-lines \
pipelines/streamheader \
@ -170,7 +177,12 @@ noinst_HEADERS = \
# libs/struct_sparc.h \
# libs/struct_x86_64.h
AM_CFLAGS = $(GST_CFLAGS) $(GST_CHECK_CFLAGS) \
AM_CFLAGS = -I$(top_srcdir)/gst-libs -I$(top_builddir)/gst-libs \
$(GST_CFLAGS) $(GST_CHECK_CFLAGS) \
-DGST_TEST_FILES_PATH="\"$(TEST_FILES_DIRECTORY)\"" \
-UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS
AM_CXXFLAGS = -I$(top_srcdir)/gst-libs -I$(top_builddir)/gst-libs \
$(GST_CXXFLAGS) $(GST_CHECK_CFLAGS) \
-DGST_TEST_FILES_PATH="\"$(TEST_FILES_DIRECTORY)\"" \
-UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS
LDADD = $(GST_LIBS) $(GST_CHECK_LIBS)
@ -295,6 +307,8 @@ libs_profile_CFLAGS = \
libs_profile_LDADD = \
$(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la $(LDADD)
libs_gstlibscpp_SOURCES = libs/gstlibscpp.cc
elements_appsink_CFLAGS = \
$(GST_PLUGINS_BASE_CFLAGS) \
$(AM_CFLAGS)

View file

@ -810,6 +810,66 @@ GST_START_TEST (test_encodebin_impossible_element_combination)
GST_END_TEST;
static void
_test_encodebin_reuse (GstEncodingProfile * prof1, GstEncodingProfile * prof2)
{
GstElement *ebin;
ebin = gst_element_factory_make ("encodebin", NULL);
/* Set a profile on encodebin... */
if (prof1)
g_object_set (ebin, "profile", prof1, NULL);
/* Make sure we can go to PAUSED */
fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_PAUSED),
GST_STATE_CHANGE_SUCCESS);
/* Set back to NULL */
fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_NULL),
GST_STATE_CHANGE_SUCCESS);
if (prof2)
g_object_set (ebin, "profile", prof2, NULL);
/* Make sure we can go to PLAYING */
fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_PAUSED),
GST_STATE_CHANGE_SUCCESS);
/* Set back to NULL */
fail_unless_equals_int (gst_element_set_state (ebin, GST_STATE_NULL),
GST_STATE_CHANGE_SUCCESS);
gst_object_unref (ebin);
}
GST_START_TEST (test_encodebin_reuse)
{
GstEncodingProfile *prof1;
GstEncodingProfile *prof2;
GstEncodingProfile *prof3;
GstCaps *caps;
caps = gst_caps_new_simple ("application/ogg", NULL);
prof1 = (GstEncodingProfile *) gst_encoding_container_profile_new ((gchar *)
"myprofile", NULL, caps, NULL);
gst_caps_unref (caps);
prof2 = create_ogg_theora_vorbis_profile (1, 1);
prof3 = create_vorbis_only_profile ();
_test_encodebin_reuse (prof1, NULL);
_test_encodebin_reuse (prof1, prof1);
_test_encodebin_reuse (prof1, prof2);
_test_encodebin_reuse (prof2, prof3);
gst_encoding_profile_unref (prof1);
};
GST_END_TEST;
static Suite *
encodebin_suite (void)
@ -831,6 +891,7 @@ encodebin_suite (void)
tcase_add_test (tc_chain, test_encodebin_render_audio_video_static);
tcase_add_test (tc_chain, test_encodebin_render_audio_video_dynamic);
tcase_add_test (tc_chain, test_encodebin_impossible_element_combination);
tcase_add_test (tc_chain, test_encodebin_reuse);
return s;
}

View file

@ -2,6 +2,7 @@
audio
cddabasesrc
fft
gstlibscpp
mixer
navigation
netbuffer

View file

@ -0,0 +1,139 @@
/* GStreamer
* Copyright (C) 2011 Tim-Philipp Müller <tim centricular net>
*
* 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., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <gst/gst.h>
#include <gst/check/gstcheck.h>
#include <gst/app/gstappbuffer.h>
#include <gst/app/gstapp-marshal.h>
#include <gst/app/gstappsink.h>
#include <gst/app/gstappsrc.h>
#include <gst/audio/audio-enumtypes.h>
#include <gst/audio/audio.h>
#include <gst/audio/gstaudioclock.h>
#include <gst/audio/gstaudiofilter.h>
#include <gst/audio/gstaudiosink.h>
#include <gst/audio/gstaudiosrc.h>
#include <gst/audio/gstbaseaudiosink.h>
#include <gst/audio/gstbaseaudiosrc.h>
#include <gst/audio/gstringbuffer.h>
#include <gst/audio/mixerutils.h>
#include <gst/audio/multichannel.h>
#include <gst/cdda/gstcddabasesrc.h>
#include <gst/fft/gstfftf32.h>
#include <gst/fft/gstfftf64.h>
#include <gst/fft/gstfft.h>
#include <gst/fft/gstffts16.h>
#include <gst/fft/gstffts32.h>
#include <gst/floatcast/floatcast.h>
#include <gst/interfaces/colorbalancechannel.h>
#include <gst/interfaces/colorbalance.h>
#include <gst/interfaces/interfaces-enumtypes.h>
#include <gst/interfaces/interfaces-marshal.h>
#include <gst/interfaces/mixer.h>
#include <gst/interfaces/mixeroptions.h>
#include <gst/interfaces/mixertrack.h>
#include <gst/interfaces/navigation.h>
#include <gst/interfaces/propertyprobe.h>
#include <gst/interfaces/streamvolume.h>
#include <gst/interfaces/tunerchannel.h>
#include <gst/interfaces/tuner.h>
#include <gst/interfaces/tunernorm.h>
#include <gst/interfaces/videoorientation.h>
#include <gst/interfaces/xoverlay.h>
#include <gst/netbuffer/gstnetbuffer.h>
#include <gst/pbutils/codec-utils.h>
#include <gst/pbutils/descriptions.h>
#include <gst/pbutils/encoding-profile.h>
#include <gst/pbutils/encoding-target.h>
#include <gst/pbutils/gstdiscoverer.h>
#include <gst/pbutils/gstpluginsbaseversion.h>
#include <gst/pbutils/install-plugins.h>
#include <gst/pbutils/missing-plugins.h>
#include <gst/pbutils/pbutils-enumtypes.h>
#include <gst/pbutils/pbutils.h>
#include <gst/pbutils/pbutils-marshal.h>
#include <gst/riff/riff-ids.h>
#include <gst/riff/riff-media.h>
#include <gst/riff/riff-read.h>
#include <gst/rtp/gstbasertpaudiopayload.h>
#include <gst/rtp/gstbasertpdepayload.h>
#include <gst/rtp/gstbasertppayload.h>
#include <gst/rtp/gstrtcpbuffer.h>
#include <gst/rtp/gstrtpbuffer.h>
#include <gst/rtp/gstrtppayloads.h>
#include <gst/rtsp/gstrtspbase64.h>
#include <gst/rtsp/gstrtspconnection.h>
#include <gst/rtsp/gstrtspdefs.h>
#include <gst/rtsp/gstrtsp-enumtypes.h>
#include <gst/rtsp/gstrtspextension.h>
#include <gst/rtsp/gstrtsp.h>
#include <gst/rtsp/gstrtsp-marshal.h>
#include <gst/rtsp/gstrtspmessage.h>
#include <gst/rtsp/gstrtsprange.h>
#include <gst/rtsp/gstrtsptransport.h>
#include <gst/rtsp/gstrtspurl.h>
#include <gst/sdp/gstsdp.h>
#include <gst/sdp/gstsdpmessage.h>
#include <gst/tag/gsttagdemux.h>
#include <gst/tag/tag.h>
#include <gst/video/gstvideofilter.h>
#include <gst/video/gstvideosink.h>
#include <gst/video/video-enumtypes.h>
#include <gst/video/video.h>
/* we mostly just want to make sure that our library headers don't
* contain anything a C++ compiler might not like */
GST_START_TEST (test_nothing)
{
gst_init (NULL, NULL);
}
GST_END_TEST;
static Suite *
libscpp_suite (void)
{
Suite *s = suite_create ("GstLibsCpp");
TCase *tc_chain = tcase_create ("C++ libs header tests");
suite_add_tcase (s, tc_chain);
tcase_add_test (tc_chain, test_nothing);
return s;
}
GST_CHECK_MAIN (libscpp);