Merge branch 'master' into 0.11

Conflicts:
	gst-libs/gst/interfaces/propertyprobe.c
	sys/xvimage/xvimagesink.c
This commit is contained in:
Sebastian Dröge 2012-01-25 11:50:54 +01:00
commit 68c0790817
16 changed files with 153 additions and 35 deletions

View file

@ -60,6 +60,7 @@ GST_PLUGINS_BASE_BUILT_SOURCES := \
ifneq ($(NDK_BUILD), true)
GST_PLUGINS_BASE_BUILT_SOURCES += ext/vorbis/Android.mk
ZLIB_CFLAGS = -I $(abspath $(GST_PLUGINS_BASE_TOP)/../../zlib)
endif
GST_PLUGINS_BASE_BUILT_SOURCES := $(patsubst %, $(abspath $(GST_PLUGINS_BASE_TOP))/%, $(GST_PLUGINS_BASE_BUILT_SOURCES))
@ -78,6 +79,7 @@ gst-plugins-base-configure:
PKG_CONFIG_TOP_BUILD_DIR=/ \
IVORBIS_CFLAGS="-I$(TOP)/external/tremolo -DTREMOR" \
IVORBIS_LIBS="-lvorbisidec" \
ZLIB_CFLAGS="$(ZLIB_CFLAGS)" \
$(abspath $(GST_PLUGINS_BASE_TOP))/$(CONFIGURE) --host=arm-linux-androideabi \
--prefix=/system --disable-orc --disable-gio --enable-ivorbis \
--disable-valgrind --disable-gtk-doc && \

View file

@ -78,6 +78,8 @@ AG_GST_GETTEXT([gst-plugins-base-$GST_MAJORMINOR])
dnl *** check for arguments to configure ***
AG_GST_ARG_DISABLE_FATAL_WARNINGS
AG_GST_ARG_DEBUG
AG_GST_ARG_PROFILING
AG_GST_ARG_VALGRIND
@ -330,14 +332,14 @@ AG_GST_CHECK_GST_DEBUG_DISABLED([NO_WARNINGS="-Wno-unused"], [NO_WARNINGS=""])
dnl define an ERROR_CFLAGS Makefile variable
dnl -Wformat-nonliteral - see ext/pango/gstclockoverlay.c and http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39438
AG_GST_SET_ERROR_CFLAGS($GST_GIT, [
AG_GST_SET_ERROR_CFLAGS($FATAL_WARNINGS, [
-Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wundef
-Wwrite-strings -Wformat-nonliteral -Wformat-security
-Winit-self -Wmissing-include-dirs -Waddress -Waggregate-return
-Wno-multichar -Wnested-externs $NO_WARNINGS])
dnl define an ERROR_CXXFLAGS Makefile variable
AG_GST_SET_ERROR_CXXFLAGS($GST_GIT, [
AG_GST_SET_ERROR_CXXFLAGS($FATAL_WARNINGS, [
-Wmissing-declarations -Wredundant-decls -Wundef
-Wwrite-strings -Wformat-nonliteral -Wformat-security
-Winit-self -Wmissing-include-dirs -Waddress -Waggregate-return

View file

@ -256,9 +256,11 @@ gst_alsasink_init (GstAlsaSink * alsasink)
}
#define CHECK(call, error) \
G_STMT_START { \
if ((err = call) < 0) \
goto error; \
G_STMT_START { \
if ((err = call) < 0) { \
GST_WARNING_OBJECT (alsa, "Error %d (%s) calling " #call, err, snd_strerror (err)); \
goto error; \
} \
} G_STMT_END;
static GstCaps *
@ -355,8 +357,6 @@ retry:
rrate = alsa->rate;
CHECK (snd_pcm_hw_params_set_rate_near (alsa->handle, params, &rrate, NULL),
no_rate);
if (rrate != alsa->rate)
goto rate_match;
#ifndef GST_DISABLE_GST_DEBUG
/* get and dump some limits */
@ -486,13 +486,6 @@ no_rate:
alsa->rate, snd_strerror (err)));
return err;
}
rate_match:
{
GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),
("Rate doesn't match (requested %iHz, get %iHz)", alsa->rate, err));
snd_pcm_hw_params_free (params);
return -EINVAL;
}
buffer_size:
{
GST_ELEMENT_ERROR (alsa, RESOURCE, SETTINGS, (NULL),

View file

@ -1874,7 +1874,7 @@ packet_duration_opus (GstOggStream * pad, ogg_packet * packet)
gint64 duration;
gint64 frame_duration;
gint nframes;
gint nframes = 0;
guint8 toc;
if (packet->bytes < 1)

View file

@ -401,7 +401,7 @@ vorbis_handle_header_packet (GstVorbisDec * vd, ogg_packet * packet)
/* Packetno = 0 if the first byte is exactly 0x01 */
packet->b_o_s = ((gst_ogg_packet_data (packet))[0] == 0x1) ? 1 : 0;
#ifdef USE_TREMELO
#ifdef USE_TREMOLO
if ((ret = vorbis_dsp_headerin (&vd->vi, &vd->vc, packet)))
#else
if ((ret = vorbis_synthesis_headerin (&vd->vi, &vd->vc, packet)))
@ -510,7 +510,7 @@ static GstFlowReturn
vorbis_handle_data_packet (GstVorbisDec * vd, ogg_packet * packet,
GstClockTime timestamp, GstClockTime duration)
{
#ifdef USE_TREMELO
#ifdef USE_TREMOLO
vorbis_sample_t *pcm;
#else
vorbis_sample_t **pcm;
@ -534,8 +534,8 @@ vorbis_handle_data_packet (GstVorbisDec * vd, ogg_packet * packet,
* throw away too much. For now we decode everything and clip right
* before pushing data. */
#ifdef USE_TREMELO
if (G_UNLIKELY (vorbis_dsp_synthesis (&vd->vb, packet, 1)))
#ifdef USE_TREMOLO
if (G_UNLIKELY (vorbis_dsp_synthesis (&vd->vd, packet, 1)))
goto could_not_read;
#else
if (G_UNLIKELY (vorbis_synthesis (&vd->vb, packet)))

View file

@ -1642,7 +1642,7 @@ gst_audio_base_sink_render (GstBaseSink * bsink, GstBuffer * buf)
" Using render_start=%" G_GUINT64_FORMAT, size, render_start);
/* we don't have a start so we don't know stop either */
stop = -1;
goto no_sync;
goto no_align;
}
/* let's calc stop based on the number of samples in the buffer instead
@ -1717,7 +1717,7 @@ gst_audio_base_sink_render (GstBaseSink * bsink, GstBuffer * buf)
render_stop = render_start + samples;
GST_DEBUG_OBJECT (sink,
"no sync needed. Using render_start=%" G_GUINT64_FORMAT, render_start);
goto no_sync;
goto no_align;
}
/* bring buffer start and stop times to running time */
@ -1838,7 +1838,6 @@ no_align:
/* number of target samples is difference between start and stop */
out_samples = render_stop - render_start;
no_sync:
/* we render the first or last sample first, depending on the rate */
if (bsink->segment.rate >= 0.0)
sample_offset = render_start;

View file

@ -344,7 +344,8 @@ gst_audio_decoder_class_init (GstAudioDecoderClass * klass)
gobject_class->get_property = gst_audio_decoder_get_property;
gobject_class->finalize = gst_audio_decoder_finalize;
element_class->change_state = gst_audio_decoder_change_state;
element_class->change_state =
GST_DEBUG_FUNCPTR (gst_audio_decoder_change_state);
/* Properties */
g_object_class_install_property (gobject_class, PROP_LATENCY,

View file

@ -1681,6 +1681,7 @@ parse_exif_ifd (GstExifReader * exif_reader, gint buf_offset,
case EXIF_TYPE_UNDEFINED:
parse_exif_undefined_tag (exif_reader, &tag_map[map_index],
tagdata.count, tagdata.offset, tagdata.offset_as_data);
break;
case EXIF_TYPE_LONG:
parse_exif_long_tag (exif_reader, &tag_map[map_index],
tagdata.count, tagdata.offset, tagdata.offset_as_data);

View file

@ -435,6 +435,7 @@ static gboolean gst_decode_chain_is_complete (GstDecodeChain * chain);
static gboolean gst_decode_chain_expose (GstDecodeChain * chain,
GList ** endpads, gboolean * missing_plugin);
static gboolean gst_decode_chain_is_drained (GstDecodeChain * chain);
static void gst_decode_chain_prune (GstDecodeChain * chain);
static gboolean gst_decode_group_is_complete (GstDecodeGroup * group);
static GstPad *gst_decode_group_control_demuxer_pad (GstDecodeGroup * group,
GstPad * pad);
@ -2314,6 +2315,16 @@ pad_event_cb (GstPad * pad, GstPadProbeInfo * info, gpointer data)
return GST_PAD_PROBE_OK;
}
static void
demuxer_pad_blocked_cb (GstPad * pad, gboolean blocked, GstDecodeChain * chain)
{
GstDecodeBin *dbin;
dbin = chain->dbin;
if (!blocked)
gst_decode_chain_prune (dbin->decode_chain);
}
static void
pad_added_cb (GstElement * element, GstPad * pad, GstDecodeChain * chain)
{
@ -2330,6 +2341,27 @@ pad_added_cb (GstElement * element, GstPad * pad, GstDecodeChain * chain)
gst_caps_unref (caps);
EXPOSE_LOCK (dbin);
CHAIN_MUTEX_LOCK (chain);
if (chain->demuxer &&
((GstDecodeElement *) chain->elements->data)->element == element) {
GList *l;
for (l = chain->next_groups; l; l = l->next) {
GstDecodeGroup *group = l->data;
GList *l2;
for (l2 = group->children; l2; l2 = l2->next) {
GstDecodeChain *child_chain = l2->data;
if (!gst_pad_is_blocked (child_chain->pad)) {
GST_DEBUG_OBJECT (pad, "blocking next group's pad %p", pad);
gst_pad_set_blocked_async (child_chain->pad, TRUE,
(GstPadBlockCallback) demuxer_pad_blocked_cb, chain);
}
}
}
}
CHAIN_MUTEX_UNLOCK (chain);
if (gst_decode_chain_is_complete (dbin->decode_chain)) {
GST_LOG_OBJECT (dbin,
"That was the last dynamic object, now attempting to expose the group");
@ -2860,6 +2892,76 @@ gst_decode_group_hide (GstDecodeGroup * group)
gst_decode_group_free_internal (group, TRUE);
}
static void
gst_decode_group_prune (GstDecodeGroup * group)
{
GList *l;
GST_DEBUG_OBJECT (group->dbin, "Pruning group %p", group);
for (l = group->children; l; l = l->next) {
GstDecodeChain *chain = (GstDecodeChain *) l->data;
gst_decode_chain_prune (chain);
}
GST_DEBUG_OBJECT (group->dbin, "Pruned group %p", group);
}
static void
gst_decode_chain_prune (GstDecodeChain * chain)
{
GList *l;
CHAIN_MUTEX_LOCK (chain);
GST_DEBUG_OBJECT (chain->dbin, "Pruning chain %p", chain);
if (chain->active_group)
gst_decode_group_prune (chain->active_group);
for (l = chain->next_groups; l; l = l->next) {
gst_decode_group_prune ((GstDecodeGroup *) l->data);
}
for (l = chain->old_groups; l; l = l->next) {
GstDecodeGroup *group = l->data;
/* This calls set_state(NULL) on the old elements and we're
* the streaming thread but this is one of the few cases
* when this is possible. It's guaranteed at this point
* that *this* streaming thread is not inside the elements
* currently, because it's *here* now or a different streaming
* thread is used for the elements.
*/
gst_decode_group_free (group);
}
g_list_free (chain->old_groups);
chain->old_groups = NULL;
GST_DEBUG_OBJECT (chain->dbin, "Pruned chain %p", chain);
CHAIN_MUTEX_UNLOCK (chain);
}
static void
unblock_demuxer_pads (GstDecodeChain * chain)
{
GList *l;
GST_DEBUG_OBJECT (chain->dbin, "Unblocking demuxer pad for chain %p", chain);
if (gst_pad_is_blocked (chain->pad))
gst_pad_set_blocked_async (chain->pad, FALSE,
(GstPadBlockCallback) demuxer_pad_blocked_cb, chain);
if (chain->active_group) {
for (l = chain->active_group->children; l; l = l->next) {
GstDecodeChain *child_chain = l->data;
unblock_demuxer_pads (child_chain);
}
}
}
/* configure queue sizes, this depends on the buffering method and if we are
* playing or prerolling. */
static void
@ -3235,6 +3337,7 @@ gst_decode_pad_handle_eos (GstDecodePad * pad)
EXPOSE_LOCK (dbin);
if (gst_decode_chain_is_complete (dbin->decode_chain))
gst_decode_bin_expose (dbin);
unblock_demuxer_pads (dbin->decode_chain);
EXPOSE_UNLOCK (dbin);
}

View file

@ -3851,7 +3851,7 @@ save_current_group (GstPlayBin * playbin)
/* see if there is a current group */
GST_PLAY_BIN_LOCK (playbin);
curr_group = playbin->curr_group;
if (curr_group && curr_group->valid) {
if (curr_group && curr_group->valid && curr_group->active) {
/* unlink our pads with the sink */
deactivate_group (playbin, curr_group);
}

View file

@ -1521,7 +1521,7 @@ gen_text_chain (GstPlaySink * playsink)
chain->queue = NULL;
}
/* try to set sync to true but it's no biggie when we can't */
if ((elem =
if (chain->sink && (elem =
gst_play_sink_find_property_sinks (playsink, chain->sink,
"sync", G_TYPE_BOOLEAN)))
g_object_set (elem, "sync", TRUE, NULL);
@ -1594,10 +1594,18 @@ gen_text_chain (GstPlaySink * playsink)
"max-size-bytes", 0, "max-size-time", (gint64) 0,
"silent", TRUE, NULL);
gst_bin_add (bin, element);
gst_element_link_pads_full (element, "src", chain->overlay,
"subtitle_sink", GST_PAD_LINK_CHECK_TEMPLATE_CAPS);
textsinkpad = gst_element_get_static_pad (element, "sink");
srcpad = gst_element_get_static_pad (chain->overlay, "src");
if (gst_element_link_pads_full (element, "src", chain->overlay,
"subtitle_sink", GST_PAD_LINK_CHECK_TEMPLATE_CAPS)) {
textsinkpad = gst_element_get_static_pad (element, "sink");
srcpad = gst_element_get_static_pad (chain->overlay, "src");
} else {
gst_bin_remove (bin, chain->sink);
gst_bin_remove (bin, chain->overlay);
chain->sink = NULL;
chain->overlay = NULL;
gst_object_unref (videosinkpad);
videosinkpad = NULL;
}
}
}
}

View file

@ -543,7 +543,8 @@ gst_stream_synchronizer_sink_chain (GstPad * pad, GstObject * parent,
GST_STREAM_SYNCHRONIZER_LOCK (self);
stream = gst_pad_get_element_private (pad);
stream->seen_data = TRUE;
if (stream)
stream->seen_data = TRUE;
if (stream && stream->drop_discont) {
buffer = gst_buffer_make_writable (buffer);
GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_DISCONT);

View file

@ -1398,6 +1398,15 @@ gst_subtitle_overlay_change_state (GstElement * element,
break;
case GST_STATE_CHANGE_PAUSED_TO_READY:
GST_DEBUG_OBJECT (self, "State change PAUSED->READY");
/* Set the pads back to blocking state */
GST_SUBTITLE_OVERLAY_LOCK (self);
gst_pad_set_blocked_async_full (self->video_block_pad, TRUE,
_pad_blocked_cb, self, NULL);
gst_pad_set_blocked_async_full (self->subtitle_block_pad, TRUE,
_pad_blocked_cb, self, NULL);
GST_SUBTITLE_OVERLAY_UNLOCK (self);
do_async_done (self);
break;

View file

@ -394,8 +394,8 @@ vs_fill_borders_AYUV64 (const VSImage * dest, const uint8_t * val)
uint8_t *data;
uint64_t v;
v = (val[0] << 8) | (val[1] << 24) | (((guint64) val[2]) << 40) | (((guint64)
val[3]) << 56);
v = (((guint32) val[0]) << 8) | (((guint32) val[1]) << 24) |
(((guint64) val[2]) << 40) | (((guint64) val[3]) << 56);
data = dest->real_pixels;
for (i = 0; i < top; i++) {

View file

@ -333,6 +333,8 @@ gst_xvimage_meta_free (GstXvImageMeta * meta, GstBuffer * buffer)
shmdt (meta->SHMInfo.shmaddr);
}
#endif
if (meta->xvimage)
XFree (meta->xvimage);
goto beach;
}

View file

@ -413,7 +413,6 @@ process_file (GstDiscoverer * dc, const gchar * filename)
GDir *dir;
gchar *uri, *path;
GstDiscovererInfo *info;
GstStructure *st = NULL;
if (!gst_uri_is_valid (filename)) {
/* Recurse into directories */
@ -461,8 +460,6 @@ process_file (GstDiscoverer * dc, const gchar * filename)
if (err)
g_error_free (err);
gst_discoverer_info_unref (info);
if (st)
gst_structure_free (st);
} else {
gst_discoverer_discover_uri_async (dc, uri);
}