diff --git a/ext/ogg/gstoggmux.c b/ext/ogg/gstoggmux.c index ae3a1730d8..80281e542c 100644 --- a/ext/ogg/gstoggmux.c +++ b/ext/ogg/gstoggmux.c @@ -848,7 +848,18 @@ gst_ogg_mux_queue_pads (GstOggMux * ogg_mux) /* if we're not yet in data mode, ensure we're setup on the first packet */ if (!pad->have_type) { - pad->have_type = gst_ogg_stream_setup_map (&pad->map, &packet); + /* Use headers in caps, if any; this will allow us to be resilient + * to starting streams on the fly, and some streams (like VP8 + * at least) do not send headers packets, as other muxers don't + * expect/need them. */ + pad->have_type = + gst_ogg_stream_setup_map_from_caps_headers (&pad->map, + GST_BUFFER_CAPS (buf)); + + if (!pad->have_type) { + /* fallback on the packet */ + pad->have_type = gst_ogg_stream_setup_map (&pad->map, &packet); + } if (!pad->have_type) { GST_ERROR_OBJECT (pad, "mapper didn't recognise input stream " "(pad caps: %" GST_PTR_FORMAT ")", GST_PAD_CAPS (pad)); diff --git a/ext/ogg/gstoggstream.c b/ext/ogg/gstoggstream.c index 6102bcb7ca..eb611a9312 100644 --- a/ext/ogg/gstoggstream.c +++ b/ext/ogg/gstoggstream.c @@ -2044,3 +2044,58 @@ gst_ogg_stream_setup_map (GstOggStream * pad, ogg_packet * packet) return FALSE; } + +gboolean +gst_ogg_stream_setup_map_from_caps_headers (GstOggStream * pad, + const GstCaps * caps) +{ + const GstStructure *structure; + const GstBuffer *buf; + const GValue *streamheader; + const GValue *first_element; + ogg_packet packet; + + GST_INFO ("Checking streamheader on caps %" GST_PTR_FORMAT, caps); + + if (caps == NULL) + return FALSE; + + structure = gst_caps_get_structure (caps, 0); + streamheader = gst_structure_get_value (structure, "streamheader"); + + if (streamheader == NULL) { + GST_LOG ("no streamheader field in caps %" GST_PTR_FORMAT, caps); + return FALSE; + } + + if (!GST_VALUE_HOLDS_ARRAY (streamheader)) { + GST_ERROR ("streamheader field not an array, caps: %" GST_PTR_FORMAT, caps); + return FALSE; + } + + if (gst_value_array_get_size (streamheader) == 0) { + GST_ERROR ("empty streamheader field in caps %" GST_PTR_FORMAT, caps); + return FALSE; + } + + first_element = gst_value_array_get_value (streamheader, 0); + + if (!GST_VALUE_HOLDS_BUFFER (first_element)) { + GST_ERROR ("first streamheader not a buffer, caps: %" GST_PTR_FORMAT, caps); + return FALSE; + } + + buf = gst_value_get_buffer (first_element); + if (buf == NULL || GST_BUFFER_SIZE (buf) == 0) { + GST_ERROR ("invalid first streamheader buffer"); + return FALSE; + } + + GST_MEMDUMP ("streamheader", GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + + packet.packet = GST_BUFFER_DATA (buf); + packet.bytes = GST_BUFFER_SIZE (buf); + + GST_INFO ("Found headers on caps, using those to determine type"); + return gst_ogg_stream_setup_map (pad, &packet); +} diff --git a/ext/ogg/gstoggstream.h b/ext/ogg/gstoggstream.h index 94c8f05504..f843692eaf 100644 --- a/ext/ogg/gstoggstream.h +++ b/ext/ogg/gstoggstream.h @@ -106,6 +106,8 @@ struct _GstOggStream gboolean gst_ogg_stream_setup_map (GstOggStream * pad, ogg_packet *packet); +gboolean gst_ogg_stream_setup_map_from_caps_headers (GstOggStream * pad, + const GstCaps * caps); GstClockTime gst_ogg_stream_get_end_time_for_granulepos (GstOggStream *pad, gint64 granulepos); GstClockTime gst_ogg_stream_get_start_time_for_granulepos (GstOggStream *pad, diff --git a/gst-libs/gst/app/Makefile.am b/gst-libs/gst/app/Makefile.am index ac078fad86..aff14702a5 100644 --- a/gst-libs/gst/app/Makefile.am +++ b/gst-libs/gst/app/Makefile.am @@ -40,6 +40,7 @@ gir_cincludes=$(patsubst %,--c-include='gst/app/%',$(libgstapp_@GST_MAJORMINOR@i GstApp-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstapp-@GST_MAJORMINOR@.la $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \ + GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \ $(INTROSPECTION_SCANNER) -v --namespace GstApp \ --nsversion=@GST_MAJORMINOR@ \ --strip-prefix=Gst \ diff --git a/gst-libs/gst/audio/Makefile.am b/gst-libs/gst/audio/Makefile.am index 65a9928db4..e531e73526 100644 --- a/gst-libs/gst/audio/Makefile.am +++ b/gst-libs/gst/audio/Makefile.am @@ -69,6 +69,7 @@ gir_cincludes+=$(patsubst %,--c-include='gst/audio/%',$(nodist_libgstaudio_@GST_ GstAudio-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstaudio-@GST_MAJORMINOR@.la $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \ + GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \ $(INTROSPECTION_SCANNER) -v --namespace GstAudio \ --nsversion=@GST_MAJORMINOR@ \ --strip-prefix=Gst \ diff --git a/gst-libs/gst/cdda/Makefile.am b/gst-libs/gst/cdda/Makefile.am index 264f942099..26706f47eb 100644 --- a/gst-libs/gst/cdda/Makefile.am +++ b/gst-libs/gst/cdda/Makefile.am @@ -24,6 +24,7 @@ gir_cincludes=$(patsubst %,--c-include='gst/cdda/%',$(libgstcdda_@GST_MAJORMINOR GstCdda-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstcdda-@GST_MAJORMINOR@.la $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \ + GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \ $(INTROSPECTION_SCANNER) -v --namespace GstCdda \ --nsversion=@GST_MAJORMINOR@ \ --strip-prefix=Gst \ diff --git a/gst-libs/gst/fft/Makefile.am b/gst-libs/gst/fft/Makefile.am index b95c78d17b..18e72670a6 100644 --- a/gst-libs/gst/fft/Makefile.am +++ b/gst-libs/gst/fft/Makefile.am @@ -53,6 +53,7 @@ gir_cincludes=$(patsubst %,--c-include='gst/fft/%',$(libgstfft_@GST_MAJORMINOR@_ GstFft-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstfft-@GST_MAJORMINOR@.la $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \ + GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \ $(INTROSPECTION_SCANNER) -v --namespace GstFft \ --nsversion=@GST_MAJORMINOR@ \ --strip-prefix=Gst \ diff --git a/gst-libs/gst/interfaces/Makefile.am b/gst-libs/gst/interfaces/Makefile.am index 827438b0cb..a51b029aea 100644 --- a/gst-libs/gst/interfaces/Makefile.am +++ b/gst-libs/gst/interfaces/Makefile.am @@ -82,6 +82,7 @@ gir_cincludes+=$(patsubst %,--c-include='gst/interfaces/%',$(nodist_libgstinterf GstInterfaces-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstinterfaces-@GST_MAJORMINOR@.la $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \ + GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \ $(INTROSPECTION_SCANNER) -v --namespace GstInterfaces \ --nsversion=@GST_MAJORMINOR@ \ --strip-prefix=Gst \ diff --git a/gst-libs/gst/netbuffer/Makefile.am b/gst-libs/gst/netbuffer/Makefile.am index 17c40074d2..086a86b173 100644 --- a/gst-libs/gst/netbuffer/Makefile.am +++ b/gst-libs/gst/netbuffer/Makefile.am @@ -18,6 +18,7 @@ gir_cincludes=$(patsubst %,--c-include='gst/netbuffer/%',$(libgstnetbufferinclud GstNetbuffer-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstnetbuffer-@GST_MAJORMINOR@.la $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \ + GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \ $(INTROSPECTION_SCANNER) -v --namespace GstNetbuffer \ --nsversion=@GST_MAJORMINOR@ \ --strip-prefix=Gst \ diff --git a/gst-libs/gst/pbutils/Makefile.am b/gst-libs/gst/pbutils/Makefile.am index 5748ed4932..fab6523559 100644 --- a/gst-libs/gst/pbutils/Makefile.am +++ b/gst-libs/gst/pbutils/Makefile.am @@ -76,6 +76,7 @@ gir_cincludes+=$(patsubst %,--c-include='gst/pbutils/%',$(nodist_libgstpbutils_@ GstPbutils-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstpbutils-@GST_MAJORMINOR@.la $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \ + GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \ $(INTROSPECTION_SCANNER) -v --namespace GstPbutils \ --nsversion=@GST_MAJORMINOR@ \ --strip-prefix=Gst \ diff --git a/gst-libs/gst/riff/Makefile.am b/gst-libs/gst/riff/Makefile.am index c060a3913e..b22fcdef5b 100644 --- a/gst-libs/gst/riff/Makefile.am +++ b/gst-libs/gst/riff/Makefile.am @@ -28,6 +28,7 @@ gir_cincludes=$(patsubst %,--c-include='gst/riff/%',$(libgstriff_@GST_MAJORMINOR GstRiff-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstriff-@GST_MAJORMINOR@.la $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \ + GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \ $(INTROSPECTION_SCANNER) -v --namespace GstRiff \ --nsversion=@GST_MAJORMINOR@ \ --strip-prefix=Gst \ diff --git a/gst-libs/gst/rtp/Makefile.am b/gst-libs/gst/rtp/Makefile.am index b71292145b..5e327ae753 100644 --- a/gst-libs/gst/rtp/Makefile.am +++ b/gst-libs/gst/rtp/Makefile.am @@ -29,6 +29,7 @@ gir_cincludes=$(patsubst %,--c-include='gst/rtp/%',$(libgstrtpinclude_HEADERS)) GstRtp-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstrtp-@GST_MAJORMINOR@.la $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \ + GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \ $(INTROSPECTION_SCANNER) -v --namespace GstRtp \ --nsversion=@GST_MAJORMINOR@ \ --strip-prefix=Gst \ diff --git a/gst-libs/gst/rtsp/Makefile.am b/gst-libs/gst/rtsp/Makefile.am index fa03f7874b..bd27a4086a 100644 --- a/gst-libs/gst/rtsp/Makefile.am +++ b/gst-libs/gst/rtsp/Makefile.am @@ -61,6 +61,7 @@ gir_cincludes+=$(patsubst %,--c-include='gst/rtsp/%',$(nodist_libgstrtspinclude_ GstRtsp-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstrtsp-@GST_MAJORMINOR@.la $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \ + GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \ $(INTROSPECTION_SCANNER) -v --namespace GstRtsp \ --nsversion=@GST_MAJORMINOR@ \ --strip-prefix=Gst \ diff --git a/gst-libs/gst/sdp/Makefile.am b/gst-libs/gst/sdp/Makefile.am index 9e4a04e6a8..8f8d9b7fe5 100644 --- a/gst-libs/gst/sdp/Makefile.am +++ b/gst-libs/gst/sdp/Makefile.am @@ -20,6 +20,7 @@ gir_cincludes=$(patsubst %,--c-include='gst/sdp/%',$(libgstsdpinclude_HEADERS)) GstSdp-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstsdp-@GST_MAJORMINOR@.la $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \ + GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \ $(INTROSPECTION_SCANNER) -v --namespace GstSdp \ --nsversion=@GST_MAJORMINOR@ \ --strip-prefix=Gst \ diff --git a/gst-libs/gst/tag/Makefile.am b/gst-libs/gst/tag/Makefile.am index 3c555b6f29..9977d66432 100644 --- a/gst-libs/gst/tag/Makefile.am +++ b/gst-libs/gst/tag/Makefile.am @@ -27,6 +27,7 @@ gir_cincludes=$(patsubst %,--c-include='gst/tag/%',$(libgsttaginclude_HEADERS)) GstTag-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgsttag-@GST_MAJORMINOR@.la $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \ + GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \ $(INTROSPECTION_SCANNER) -v --namespace GstTag \ --nsversion=@GST_MAJORMINOR@ \ --strip-prefix=Gst \ diff --git a/gst-libs/gst/video/Makefile.am b/gst-libs/gst/video/Makefile.am index a89dbae6db..21ce6e48bc 100644 --- a/gst-libs/gst/video/Makefile.am +++ b/gst-libs/gst/video/Makefile.am @@ -39,6 +39,7 @@ gir_cincludes+=$(patsubst %,--c-include='gst/video/%',$(nodist_libgstvideo_@GST_ GstVideo-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstvideo-@GST_MAJORMINOR@.la $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \ + GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \ $(INTROSPECTION_SCANNER) -v --namespace GstVideo \ --nsversion=@GST_MAJORMINOR@ \ --strip-prefix=Gst \