ffmpeg: Add codec mapping for AAC LATM/LOAS

Also add the stream-format fields to the CODEC_ID_AAC caps.

Fixes bug #650695.
This commit is contained in:
Rafael Diniz 2011-05-25 10:08:06 +02:00 committed by Sebastian Dröge
parent 5ad61c55a6
commit df40381a83
2 changed files with 36 additions and 4 deletions

View file

@ -440,6 +440,7 @@ gst_ff_aud_caps_new (AVCodecContext * context, enum CodecID codec_id,
case CODEC_ID_AC3: case CODEC_ID_AC3:
case CODEC_ID_EAC3: case CODEC_ID_EAC3:
case CODEC_ID_AAC: case CODEC_ID_AAC:
case CODEC_ID_AAC_LATM:
case CODEC_ID_DTS: case CODEC_ID_DTS:
maxchannels = 6; maxchannels = 6;
break; break;
@ -957,8 +958,36 @@ gst_ffmpeg_codecid_to_caps (enum CodecID codec_id,
break; break;
case CODEC_ID_AAC: case CODEC_ID_AAC:
{
caps = gst_ff_aud_caps_new (context, codec_id, "audio/mpeg", caps = gst_ff_aud_caps_new (context, codec_id, "audio/mpeg",
"mpegversion", G_TYPE_INT, 4, NULL); "mpegversion", G_TYPE_INT, 4, NULL);
if (!encode) {
GValue arr = { 0, };
GValue item = { 0, };
g_value_init (&arr, GST_TYPE_LIST);
g_value_init (&item, G_TYPE_STRING);
g_value_set_string (&item, "raw");
gst_value_list_append_value (&arr, &item);
g_value_set_string (&item, "adts");
gst_value_list_append_value (&arr, &item);
g_value_set_string (&item, "adif");
gst_value_list_append_value (&arr, &item);
g_value_unset (&item);
gst_caps_set_value (caps, "stream-format", &arr);
g_value_unset (&arr);
} else {
gst_caps_set_simple (caps, "stream-format", G_TYPE_STRING, "raw", NULL);
}
break;
}
case CODEC_ID_AAC_LATM: /* LATM/LOAS AAC syntax */
caps = gst_ff_aud_caps_new (context, codec_id, "audio/mpeg",
"mpegversion", G_TYPE_INT, 4, "stream-format", G_TYPE_STRING, "loas",
NULL);
break; break;
case CODEC_ID_ASV1: case CODEC_ID_ASV1:

View file

@ -827,11 +827,13 @@ gst_ffmpegdec_setcaps (GstPad * pad, GstCaps * caps)
ffmpegdec->context->flags |= CODEC_FLAG_EMU_EDGE; ffmpegdec->context->flags |= CODEC_FLAG_EMU_EDGE;
} }
/* for AAC we only use av_parse if not on raw caps */ /* for AAC we only use av_parse if not on stream-format==raw or ==loas */
if (oclass->in_plugin->id == CODEC_ID_AAC) { if (oclass->in_plugin->id == CODEC_ID_AAC
|| oclass->in_plugin->id == CODEC_ID_AAC_LATM) {
const gchar *format = gst_structure_get_string (structure, "stream-format"); const gchar *format = gst_structure_get_string (structure, "stream-format");
if (format == NULL || strcmp (format, "raw") == 0) { if (format == NULL || strcmp (format, "raw") == 0 ||
oclass->in_plugin->id == CODEC_ID_AAC_LATM) {
ffmpegdec->turnoff_parser = TRUE; ffmpegdec->turnoff_parser = TRUE;
} }
} }
@ -2134,7 +2136,8 @@ gst_ffmpegdec_audio_frame (GstFFMpegDec * ffmpegdec,
/* If we don't error out after the first failed read with the AAC decoder, /* If we don't error out after the first failed read with the AAC decoder,
* we must *not* carry on pushing data, else we'll cause segfaults... */ * we must *not* carry on pushing data, else we'll cause segfaults... */
if (len == -1 && in_plugin->id == CODEC_ID_AAC) { if (len == -1 && (in_plugin->id == CODEC_ID_AAC
|| in_plugin->id == CODEC_ID_AAC_LATM)) {
GST_ELEMENT_ERROR (ffmpegdec, STREAM, DECODE, (NULL), GST_ELEMENT_ERROR (ffmpegdec, STREAM, DECODE, (NULL),
("Decoding of AAC stream by FFMPEG failed.")); ("Decoding of AAC stream by FFMPEG failed."));
*ret = GST_FLOW_ERROR; *ret = GST_FLOW_ERROR;