aacparse: Skip LOAS AAC until a valid config is seen.
It's normal when dropping into the middle of a stream to not always have the config available immediately, so skip LOAS until a valid config is seen without either setting invalid caps or erroring out. https://bugzilla.gnome.org/show_bug.cgi?id=751386
This commit is contained in:
parent
b7b244f356
commit
c919548e2c
@ -581,9 +581,11 @@ gst_aac_parse_read_loas_config (GstAacParse * aacparse, const guint8 * data,
|
|||||||
if (!gst_bit_reader_get_bits_uint8 (&br, &u8, 1))
|
if (!gst_bit_reader_get_bits_uint8 (&br, &u8, 1))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (u8) {
|
if (u8) {
|
||||||
GST_DEBUG_OBJECT (aacparse, "Frame uses previous config");
|
GST_LOG_OBJECT (aacparse, "Frame uses previous config");
|
||||||
if (!aacparse->sample_rate || !aacparse->channels) {
|
if (!aacparse->sample_rate || !aacparse->channels) {
|
||||||
GST_WARNING_OBJECT (aacparse, "No previous config to use");
|
GST_DEBUG_OBJECT (aacparse,
|
||||||
|
"No previous config to use. We'll look for more data.");
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
*sample_rate = aacparse->sample_rate;
|
*sample_rate = aacparse->sample_rate;
|
||||||
*channels = aacparse->channels;
|
*channels = aacparse->channels;
|
||||||
@ -876,7 +878,9 @@ gst_aac_parse_detect_stream (GstAacParse * aacparse,
|
|||||||
|
|
||||||
if (!gst_aac_parse_read_loas_config (aacparse, data, avail, &rate,
|
if (!gst_aac_parse_read_loas_config (aacparse, data, avail, &rate,
|
||||||
&channels, &aacparse->mpegversion)) {
|
&channels, &aacparse->mpegversion)) {
|
||||||
GST_WARNING_OBJECT (aacparse, "Error reading LOAS config");
|
/* This is pretty normal when skipping data at the start of
|
||||||
|
* random stream (MPEG-TS capture for example) */
|
||||||
|
GST_LOG_OBJECT (aacparse, "Error reading LOAS config");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -884,10 +888,10 @@ gst_aac_parse_detect_stream (GstAacParse * aacparse,
|
|||||||
gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse), rate,
|
gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse), rate,
|
||||||
aacparse->frame_samples, 2, 2);
|
aacparse->frame_samples, 2, 2);
|
||||||
|
|
||||||
|
/* Don't store the sample rate and channels yet -
|
||||||
|
* this is just format detection. */
|
||||||
GST_DEBUG ("LOAS: samplerate %d, channels %d, objtype %d, version %d",
|
GST_DEBUG ("LOAS: samplerate %d, channels %d, objtype %d, version %d",
|
||||||
rate, channels, aacparse->object_type, aacparse->mpegversion);
|
rate, channels, aacparse->object_type, aacparse->mpegversion);
|
||||||
aacparse->sample_rate = rate;
|
|
||||||
aacparse->channels = channels;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_base_parse_set_syncable (GST_BASE_PARSE (aacparse), TRUE);
|
gst_base_parse_set_syncable (GST_BASE_PARSE (aacparse), TRUE);
|
||||||
@ -1293,9 +1297,15 @@ gst_aac_parse_handle_frame (GstBaseParse * parse,
|
|||||||
frame->overhead = 3;
|
frame->overhead = 3;
|
||||||
|
|
||||||
if (!gst_aac_parse_read_loas_config (aacparse, map.data, map.size, &rate,
|
if (!gst_aac_parse_read_loas_config (aacparse, map.data, map.size, &rate,
|
||||||
&channels, NULL)) {
|
&channels, NULL) || !rate || !channels) {
|
||||||
GST_WARNING_OBJECT (aacparse, "Error reading LOAS config");
|
/* This is pretty normal when skipping data at the start of
|
||||||
} else if (G_UNLIKELY (rate != aacparse->sample_rate
|
* random stream (MPEG-TS capture for example) */
|
||||||
|
GST_DEBUG_OBJECT (aacparse, "Error reading LOAS config. Skipping.");
|
||||||
|
*skipsize = map.size;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (G_UNLIKELY (rate != aacparse->sample_rate
|
||||||
|| channels != aacparse->channels)) {
|
|| channels != aacparse->channels)) {
|
||||||
aacparse->sample_rate = rate;
|
aacparse->sample_rate = rate;
|
||||||
aacparse->channels = channels;
|
aacparse->channels = channels;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user