mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-16 11:15:31 +00:00
flacdec: parse stream headers from caps in set_format function
Not that this seems to be actually needed, libflac happily decodes stuff even if we just drop all headers and never feed it to the library.
This commit is contained in:
parent
ab591b6d53
commit
a49818f876
1 changed files with 41 additions and 14 deletions
|
@ -234,21 +234,48 @@ gst_flac_dec_stop (GstAudioDecoder * dec)
|
|||
static gboolean
|
||||
gst_flac_dec_set_format (GstAudioDecoder * dec, GstCaps * caps)
|
||||
{
|
||||
/* if stream headers are present we could process them here already */
|
||||
#if 0
|
||||
///gst_adapter_push (dec->adapter, gst_buffer_ref (buf)); // for all stream headers
|
||||
/* The first time we get audio data, we know we got all the headers.
|
||||
* We then loop until all the metadata is processed, then do an extra
|
||||
* "process_single" step for the audio frame. */
|
||||
GST_DEBUG_OBJECT (dec,
|
||||
"First audio frame, ensuring all metadata is processed");
|
||||
if (!FLAC__stream_decoder_process_until_end_of_metadata (dec->decoder)) {
|
||||
GST_DEBUG_OBJECT (dec, "process_until_end_of_metadata failed");
|
||||
}
|
||||
GST_DEBUG_OBJECT (dec, "All headers and metadata are now processed");
|
||||
#endif
|
||||
/* FIXME: refuse caps is there are no stream headers */
|
||||
const GValue *headers;
|
||||
GstFlacDec *flacdec;
|
||||
GstStructure *s;
|
||||
guint i, num;
|
||||
|
||||
flacdec = GST_FLAC_DEC (dec);
|
||||
|
||||
GST_LOG_OBJECT (dec, "sink caps: %" GST_PTR_FORMAT, caps);
|
||||
|
||||
s = gst_caps_get_structure (caps, 0);
|
||||
headers = gst_structure_get_value (s, "streamheader");
|
||||
if (headers == NULL || !GST_VALUE_HOLDS_ARRAY (headers)) {
|
||||
GST_WARNING_OBJECT (dec, "no 'streamheader' field in input caps, try "
|
||||
"adding a flacparse element upstream");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (gst_adapter_available (flacdec->adapter) > 0) {
|
||||
GST_WARNING_OBJECT (dec, "unexpected data left in adapter");
|
||||
gst_adapter_clear (flacdec->adapter);
|
||||
}
|
||||
|
||||
num = gst_value_array_get_size (headers);
|
||||
for (i = 0; i < num; ++i) {
|
||||
const GValue *header_val;
|
||||
GstBuffer *header_buf;
|
||||
|
||||
header_val = gst_value_array_get_value (headers, i);
|
||||
if (header_val == NULL || !GST_VALUE_HOLDS_BUFFER (header_val))
|
||||
return FALSE;
|
||||
|
||||
header_buf = g_value_dup_boxed (header_val);
|
||||
GST_INFO_OBJECT (dec, "pushing header buffer of %d bytes into adapter",
|
||||
gst_buffer_get_size (header_buf));
|
||||
gst_adapter_push (flacdec->adapter, header_buf);
|
||||
}
|
||||
|
||||
GST_DEBUG_OBJECT (dec, "Processing headers and metadata");
|
||||
if (!FLAC__stream_decoder_process_until_end_of_metadata (flacdec->decoder)) {
|
||||
GST_WARNING_OBJECT (dec, "process_until_end_of_metadata failed");
|
||||
}
|
||||
GST_INFO_OBJECT (dec, "headers and metadata are now processed");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue