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 dnl find a compiler
AC_PROG_CC AC_PROG_CC
AC_PROG_CC_STDC 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 dnl check if the compiler supports '-c' and '-o' options
AM_PROG_CC_C_O 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) AC_PATH_PROG(VALGRIND_PATH, valgrind, no)
AM_CONDITIONAL(HAVE_VALGRIND, test ! "x$VALGRIND_PATH" = "xno") 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, GST_DEBUG_OBJECT (ogg_mux,
"got header buffer in control state, ignoring"); "got header buffer in control state, ignoring");
/* just ignore */ /* just ignore */
pad->map.n_header_packets_seen++;
gst_buffer_unref (buf); gst_buffer_unref (buf);
buf = NULL; buf = NULL;
} else { } else {

View file

@ -375,6 +375,8 @@ gst_text_overlay_class_init (GstTextOverlayClass * klass)
gstelement_class->change_state = gstelement_class->change_state =
GST_DEBUG_FUNCPTR (gst_text_overlay_change_state); GST_DEBUG_FUNCPTR (gst_text_overlay_change_state);
klass->pango_lock = g_mutex_new ();
klass->get_text = gst_text_overlay_get_text; klass->get_text = gst_text_overlay_get_text;
fontmap = pango_cairo_font_map_get_default (); fontmap = pango_cairo_font_map_get_default ();
klass->pango_context = klass->pango_context =
@ -1235,6 +1237,8 @@ gst_text_overlay_render_pangocairo (GstTextOverlay * overlay,
double scalef = 1.0; double scalef = 1.0;
double a, r, g, b; double a, r, g, b;
g_mutex_lock (GST_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
if (overlay->auto_adjust_size) { if (overlay->auto_adjust_size) {
/* 640 pixel is default */ /* 640 pixel is default */
scalef = (double) (overlay->width) / DEFAULT_SCALE_BASIS; scalef = (double) (overlay->width) / DEFAULT_SCALE_BASIS;
@ -1298,6 +1302,8 @@ gst_text_overlay_render_pangocairo (GstTextOverlay * overlay,
cairo_matrix_init_scale (&cairo_matrix, scalef, scalef); cairo_matrix_init_scale (&cairo_matrix, scalef, scalef);
} }
g_mutex_unlock (GST_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
/* reallocate surface */ /* reallocate surface */
overlay->text_image = g_realloc (overlay->text_image, 4 * width * height); overlay->text_image = g_realloc (overlay->text_image, 4 * width * height);

View file

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

View file

@ -443,6 +443,15 @@ uridecodebin_pad_added_cb (GstElement * uridecodebin, GstPad * pad,
{ {
PrivateStream *ps; PrivateStream *ps;
GstPad *sinkpad = NULL; 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)); 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->sink, "silent", TRUE, NULL);
g_object_set (ps->queue, "max-size-buffers", 1, "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); gst_bin_add_many (dc->priv->pipeline, ps->queue, ps->sink, NULL);
if (!gst_element_link_pads_full (ps->queue, "src", ps->sink, "sink", 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 we're not active, we can deactivate the previous profile */
if (ebin->profile) if (ebin->profile) {
gst_encoding_profile_unref (ebin->profile); gst_encode_bin_tear_down_profile (ebin);
ebin->profile = NULL; }
return gst_encode_bin_setup_profile (ebin, profile); return gst_encode_bin_setup_profile (ebin, profile);
} }

View file

@ -2696,10 +2696,12 @@ gst_decode_group_new (GstDecodeBin * dbin, GstDecodeChain * parent)
if (G_UNLIKELY (!group->multiqueue)) if (G_UNLIKELY (!group->multiqueue))
goto missing_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) { if (dbin->use_buffering) {
g_object_set (mq, "low-percent", dbin->low_percent, NULL); g_object_set (mq,
g_object_set (mq, "high-percent", dbin->high_percent, NULL); "use-buffering", TRUE,
"low-percent", dbin->low_percent,
"high-percent", dbin->high_percent, NULL);
} }
/* configure queue sizes for preroll */ /* configure queue sizes for preroll */

View file

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

View file

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

View file

@ -810,6 +810,66 @@ GST_START_TEST (test_encodebin_impossible_element_combination)
GST_END_TEST; 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 * static Suite *
encodebin_suite (void) 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_static);
tcase_add_test (tc_chain, test_encodebin_render_audio_video_dynamic); 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_impossible_element_combination);
tcase_add_test (tc_chain, test_encodebin_reuse);
return s; return s;
} }

View file

@ -2,6 +2,7 @@
audio audio
cddabasesrc cddabasesrc
fft fft
gstlibscpp
mixer mixer
navigation navigation
netbuffer 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);