static gboolean gst_mss_demux_stream_select_bitrate (GstAdaptiveDemuxStream * stream, guint64 bitrate) { GstMssDemuxStream *mssstream = (GstMssDemuxStream *) stream; gboolean ret = FALSE; GST_DEBUG_OBJECT (stream->pad, "Using stream download bitrate %" G_GUINT64_FORMAT, bitrate); if (gst_mss_stream_select_bitrate (mssstream->manifest_stream, bitrate)) { GstCaps *caps; GstCaps *msscaps; caps = gst_mss_stream_get_caps (mssstream->manifest_stream); GST_DEBUG_OBJECT (stream->pad, "Starting streams reconfiguration due to bitrate changes"); msscaps = create_mss_caps (mssstream, caps); GST_DEBUG_OBJECT (stream->pad, "Stream changed bitrate to %" G_GUINT64_FORMAT " caps: %" GST_PTR_FORMAT, gst_mss_stream_get_current_bitrate (mssstream->manifest_stream), caps); gst_caps_unref (caps); gst_adaptive_demux_stream_set_caps (stream, msscaps); ret = TRUE; GST_DEBUG_OBJECT (stream->pad, "Finished streams reconfiguration"); } return ret; }
/* Handles decrypted buffers only */ static GstFlowReturn gst_hls_demux_handle_buffer (GstAdaptiveDemux * demux, GstAdaptiveDemuxStream * stream, GstBuffer * buffer, gboolean force) { GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (demux); if (G_UNLIKELY (hlsdemux->do_typefind && buffer != NULL)) { GstCaps *caps = NULL; GstMapInfo info; guint buffer_size; GstTypeFindProbability prob = GST_TYPE_FIND_NONE; if (hlsdemux->pending_typefind_buffer) buffer = gst_buffer_append (hlsdemux->pending_typefind_buffer, buffer); hlsdemux->pending_typefind_buffer = NULL; gst_buffer_map (buffer, &info, GST_MAP_READ); buffer_size = info.size; /* Typefind could miss if buffer is too small. In this case we * will retry later */ if (buffer_size >= (2 * 1024)) { caps = gst_type_find_helper_for_data (GST_OBJECT_CAST (hlsdemux), info.data, info.size, &prob); } gst_buffer_unmap (buffer, &info); if (G_UNLIKELY (!caps)) { /* Only fail typefinding if we already a good amount of data * and we still don't know the type */ if (buffer_size > (2 * 1024 * 1024) || force) { GST_ELEMENT_ERROR (hlsdemux, STREAM, TYPE_NOT_FOUND, ("Could not determine type of stream"), (NULL)); gst_buffer_unref (buffer); return GST_FLOW_NOT_NEGOTIATED; } else { hlsdemux->pending_typefind_buffer = buffer; return GST_FLOW_OK; } } GST_DEBUG_OBJECT (hlsdemux, "Typefind result: %" GST_PTR_FORMAT " prob:%d", caps, prob); gst_adaptive_demux_stream_set_caps (stream, caps); hlsdemux->do_typefind = FALSE; } g_assert (hlsdemux->pending_typefind_buffer == NULL); if (buffer) { buffer = gst_buffer_make_writable (buffer); GST_BUFFER_OFFSET (buffer) = hlsdemux->current_offset; hlsdemux->current_offset += gst_buffer_get_size (buffer); GST_BUFFER_OFFSET_END (buffer) = hlsdemux->current_offset; return gst_adaptive_demux_stream_push_buffer (stream, buffer); } return GST_FLOW_OK; }
static gboolean gst_mss_demux_setup_streams (GstAdaptiveDemux * demux) { GstMssDemux *mssdemux = GST_MSS_DEMUX_CAST (demux); GSList *streams = gst_mss_manifest_get_streams (mssdemux->manifest); GSList *iter; GSList *active_streams = NULL; if (streams == NULL) { GST_INFO_OBJECT (mssdemux, "No streams found in the manifest"); GST_ELEMENT_ERROR (mssdemux, STREAM, DEMUX, (_("This file contains no playable streams.")), ("no streams found at the Manifest")); return FALSE; } GST_INFO_OBJECT (mssdemux, "Activating streams"); for (iter = streams; iter; iter = g_slist_next (iter)) { GstPad *srcpad = NULL; GstMssDemuxStream *stream = NULL; GstMssStream *manifeststream = iter->data; srcpad = _create_pad (mssdemux, manifeststream); if (!srcpad) { continue; } stream = (GstMssDemuxStream *) gst_adaptive_demux_stream_new (GST_ADAPTIVE_DEMUX_CAST (mssdemux), srcpad); stream->manifest_stream = manifeststream; gst_mss_stream_set_active (manifeststream, TRUE); active_streams = g_slist_prepend (active_streams, stream); } GST_INFO_OBJECT (mssdemux, "Changing max bitrate to %u", demux->connection_speed); gst_mss_manifest_change_bitrate (mssdemux->manifest, demux->connection_speed); for (iter = active_streams; iter; iter = g_slist_next (iter)) { GstMssDemuxStream *stream = iter->data; GstCaps *caps; const gchar *lang; caps = gst_mss_stream_get_caps (stream->manifest_stream); gst_adaptive_demux_stream_set_caps (GST_ADAPTIVE_DEMUX_STREAM_CAST (stream), create_mss_caps (stream, caps)); gst_caps_unref (caps); lang = gst_mss_stream_get_lang (stream->manifest_stream); if (lang != NULL) { GstTagList *tags; tags = gst_tag_list_new (GST_TAG_LANGUAGE_CODE, lang, NULL); gst_adaptive_demux_stream_set_tags (GST_ADAPTIVE_DEMUX_STREAM_CAST (stream), tags); } } g_slist_free (active_streams); return TRUE; }