mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-22 22:16:22 +00:00
aacparse: improve channel/rate handling
Keep track of the last parsed channels/rate fields so they can be used even if the element was not yet configured. https://bugzilla.gnome.org/show_bug.cgi?id=769278
This commit is contained in:
parent
740749ac55
commit
559546dd3a
2 changed files with 33 additions and 4 deletions
|
@ -97,7 +97,10 @@ static GstFlowReturn gst_aac_parse_handle_frame (GstBaseParse * parse,
|
||||||
GstBaseParseFrame * frame, gint * skipsize);
|
GstBaseParseFrame * frame, gint * skipsize);
|
||||||
static GstFlowReturn gst_aac_parse_pre_push_frame (GstBaseParse * parse,
|
static GstFlowReturn gst_aac_parse_pre_push_frame (GstBaseParse * parse,
|
||||||
GstBaseParseFrame * frame);
|
GstBaseParseFrame * frame);
|
||||||
|
static gboolean gst_aac_parse_src_event (GstBaseParse * parse,
|
||||||
|
GstEvent * event);
|
||||||
|
|
||||||
|
#define gst_aac_parse_parent_class parent_class
|
||||||
G_DEFINE_TYPE (GstAacParse, gst_aac_parse, GST_TYPE_BASE_PARSE);
|
G_DEFINE_TYPE (GstAacParse, gst_aac_parse, GST_TYPE_BASE_PARSE);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -128,6 +131,7 @@ gst_aac_parse_class_init (GstAacParseClass * klass)
|
||||||
parse_class->handle_frame = GST_DEBUG_FUNCPTR (gst_aac_parse_handle_frame);
|
parse_class->handle_frame = GST_DEBUG_FUNCPTR (gst_aac_parse_handle_frame);
|
||||||
parse_class->pre_push_frame =
|
parse_class->pre_push_frame =
|
||||||
GST_DEBUG_FUNCPTR (gst_aac_parse_pre_push_frame);
|
GST_DEBUG_FUNCPTR (gst_aac_parse_pre_push_frame);
|
||||||
|
parse_class->src_event = GST_DEBUG_FUNCPTR (gst_aac_parse_src_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -143,6 +147,9 @@ gst_aac_parse_init (GstAacParse * aacparse)
|
||||||
GST_DEBUG ("initialized");
|
GST_DEBUG ("initialized");
|
||||||
GST_PAD_SET_ACCEPT_INTERSECT (GST_BASE_PARSE_SINK_PAD (aacparse));
|
GST_PAD_SET_ACCEPT_INTERSECT (GST_BASE_PARSE_SINK_PAD (aacparse));
|
||||||
GST_PAD_SET_ACCEPT_TEMPLATE (GST_BASE_PARSE_SINK_PAD (aacparse));
|
GST_PAD_SET_ACCEPT_TEMPLATE (GST_BASE_PARSE_SINK_PAD (aacparse));
|
||||||
|
|
||||||
|
aacparse->last_parsed_sample_rate = 0;
|
||||||
|
aacparse->last_parsed_channels = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -251,6 +258,9 @@ gst_aac_parse_set_src_caps (GstAacParse * aacparse, GstCaps * sink_caps)
|
||||||
if (allowed)
|
if (allowed)
|
||||||
gst_caps_unref (allowed);
|
gst_caps_unref (allowed);
|
||||||
|
|
||||||
|
aacparse->last_parsed_channels = 0;
|
||||||
|
aacparse->last_parsed_sample_rate = 0;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (aacparse, "setting src caps: %" GST_PTR_FORMAT, src_caps);
|
GST_DEBUG_OBJECT (aacparse, "setting src caps: %" GST_PTR_FORMAT, src_caps);
|
||||||
|
|
||||||
res = gst_pad_set_caps (GST_BASE_PARSE (aacparse)->srcpad, src_caps);
|
res = gst_pad_set_caps (GST_BASE_PARSE (aacparse)->srcpad, src_caps);
|
||||||
|
@ -347,7 +357,6 @@ gst_aac_parse_sink_setcaps (GstBaseParse * parse, GstCaps * caps)
|
||||||
gst_base_parse_set_passthrough (parse, FALSE);
|
gst_base_parse_set_passthrough (parse, FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -524,6 +533,7 @@ gst_aac_parse_get_audio_sample_rate (GstAacParse * aacparse, GstBitReader * br,
|
||||||
if (!*sample_rate)
|
if (!*sample_rate)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
aacparse->last_parsed_sample_rate = *sample_rate;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -563,6 +573,7 @@ gst_aac_parse_read_loas_audio_specific_config (GstAacParse * aacparse,
|
||||||
"Need more code to parse humongous LOAS data, currently ignored");
|
"Need more code to parse humongous LOAS data, currently ignored");
|
||||||
if (bits)
|
if (bits)
|
||||||
*bits = 0;
|
*bits = 0;
|
||||||
|
aacparse->last_parsed_channels = *channels;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -589,13 +600,13 @@ gst_aac_parse_read_loas_config (GstAacParse * aacparse, const guint8 * data,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (u8) {
|
if (u8) {
|
||||||
GST_LOG_OBJECT (aacparse, "Frame uses previous config");
|
GST_LOG_OBJECT (aacparse, "Frame uses previous config");
|
||||||
if (!aacparse->sample_rate || !aacparse->channels) {
|
if (!aacparse->last_parsed_sample_rate || !aacparse->last_parsed_channels) {
|
||||||
GST_DEBUG_OBJECT (aacparse,
|
GST_DEBUG_OBJECT (aacparse,
|
||||||
"No previous config to use. We'll look for more data.");
|
"No previous config to use. We'll look for more data.");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
*sample_rate = aacparse->sample_rate;
|
*sample_rate = aacparse->last_parsed_sample_rate;
|
||||||
*channels = aacparse->channels;
|
*channels = aacparse->last_parsed_channels;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1439,6 +1450,8 @@ gst_aac_parse_start (GstBaseParse * parse)
|
||||||
aacparse->frame_samples = 1024;
|
aacparse->frame_samples = 1024;
|
||||||
gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), ADTS_MAX_SIZE);
|
gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), ADTS_MAX_SIZE);
|
||||||
aacparse->sent_codec_tag = FALSE;
|
aacparse->sent_codec_tag = FALSE;
|
||||||
|
aacparse->last_parsed_channels = 0;
|
||||||
|
aacparse->last_parsed_sample_rate = 0;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1586,3 +1599,16 @@ gst_aac_parse_sink_getcaps (GstBaseParse * parse, GstCaps * filter)
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_aac_parse_src_event (GstBaseParse * parse, GstEvent * event)
|
||||||
|
{
|
||||||
|
GstAacParse *aacparse = GST_AAC_PARSE (parse);
|
||||||
|
|
||||||
|
if (GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_STOP) {
|
||||||
|
aacparse->last_parsed_channels = 0;
|
||||||
|
aacparse->last_parsed_sample_rate = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return GST_BASE_PARSE_CLASS (parent_class)->src_event (parse, event);
|
||||||
|
}
|
||||||
|
|
|
@ -83,6 +83,9 @@ struct _GstAacParse {
|
||||||
GstAacHeaderType output_header_type;
|
GstAacHeaderType output_header_type;
|
||||||
|
|
||||||
gboolean sent_codec_tag;
|
gboolean sent_codec_tag;
|
||||||
|
|
||||||
|
gint last_parsed_sample_rate;
|
||||||
|
gint last_parsed_channels;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue