mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-06 22:42:35 +00:00
ffmpeg: add support for G721
Add support for g721, which is like G726 but with 1 channel, 8KHz and a bitrate of 32000. Fixes #594454
This commit is contained in:
parent
595de04316
commit
669a0e359a
1 changed files with 34 additions and 6 deletions
|
@ -309,7 +309,6 @@ gst_ff_vid_caps_new (AVCodecContext * context, enum CodecID codec_id,
|
||||||
|
|
||||||
/* same for audio - now with channels/sample rate
|
/* same for audio - now with channels/sample rate
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static GstCaps *
|
static GstCaps *
|
||||||
gst_ff_aud_caps_new (AVCodecContext * context, enum CodecID codec_id,
|
gst_ff_aud_caps_new (AVCodecContext * context, enum CodecID codec_id,
|
||||||
const char *mimetype, const char *fieldname, ...)
|
const char *mimetype, const char *fieldname, ...)
|
||||||
|
@ -1165,6 +1164,23 @@ gst_ffmpeg_codecid_to_caps (enum CodecID codec_id,
|
||||||
caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-alaw", NULL);
|
caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-alaw", NULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CODEC_ID_ADPCM_G726:
|
||||||
|
{
|
||||||
|
/* the G726 decoder can also handle G721 */
|
||||||
|
caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-adpcm",
|
||||||
|
"layout", G_TYPE_STRING, "g726", NULL);
|
||||||
|
if (context)
|
||||||
|
gst_caps_set_simple (caps,
|
||||||
|
"block_align", G_TYPE_INT, context->block_align,
|
||||||
|
"bitrate", G_TYPE_INT, context->bit_rate, NULL);
|
||||||
|
|
||||||
|
if (!encode) {
|
||||||
|
gst_caps_append (caps, gst_caps_new_simple ("audio/x-adpcm",
|
||||||
|
"layout", G_TYPE_STRING, "g721",
|
||||||
|
"channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, 8000, NULL));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case CODEC_ID_ADPCM_IMA_QT:
|
case CODEC_ID_ADPCM_IMA_QT:
|
||||||
case CODEC_ID_ADPCM_IMA_WAV:
|
case CODEC_ID_ADPCM_IMA_WAV:
|
||||||
case CODEC_ID_ADPCM_IMA_DK3:
|
case CODEC_ID_ADPCM_IMA_DK3:
|
||||||
|
@ -1180,7 +1196,6 @@ gst_ffmpeg_codecid_to_caps (enum CodecID codec_id,
|
||||||
case CODEC_ID_ADPCM_XA:
|
case CODEC_ID_ADPCM_XA:
|
||||||
case CODEC_ID_ADPCM_ADX:
|
case CODEC_ID_ADPCM_ADX:
|
||||||
case CODEC_ID_ADPCM_EA:
|
case CODEC_ID_ADPCM_EA:
|
||||||
case CODEC_ID_ADPCM_G726:
|
|
||||||
case CODEC_ID_ADPCM_CT:
|
case CODEC_ID_ADPCM_CT:
|
||||||
case CODEC_ID_ADPCM_SWF:
|
case CODEC_ID_ADPCM_SWF:
|
||||||
case CODEC_ID_ADPCM_YAMAHA:
|
case CODEC_ID_ADPCM_YAMAHA:
|
||||||
|
@ -1242,9 +1257,6 @@ gst_ffmpeg_codecid_to_caps (enum CodecID codec_id,
|
||||||
case CODEC_ID_ADPCM_EA:
|
case CODEC_ID_ADPCM_EA:
|
||||||
layout = "ea";
|
layout = "ea";
|
||||||
break;
|
break;
|
||||||
case CODEC_ID_ADPCM_G726:
|
|
||||||
layout = "g726";
|
|
||||||
break;
|
|
||||||
case CODEC_ID_ADPCM_CT:
|
case CODEC_ID_ADPCM_CT:
|
||||||
layout = "ct";
|
layout = "ct";
|
||||||
break;
|
break;
|
||||||
|
@ -1794,6 +1806,7 @@ gst_ffmpeg_caps_to_smpfmt (const GstCaps * caps,
|
||||||
GstStructure *structure;
|
GstStructure *structure;
|
||||||
gint depth = 0, width = 0, endianness = 0;
|
gint depth = 0, width = 0, endianness = 0;
|
||||||
gboolean signedness = FALSE;
|
gboolean signedness = FALSE;
|
||||||
|
const gchar *name;
|
||||||
|
|
||||||
g_return_if_fail (gst_caps_get_size (caps) == 1);
|
g_return_if_fail (gst_caps_get_size (caps) == 1);
|
||||||
structure = gst_caps_get_structure (caps, 0);
|
structure = gst_caps_get_structure (caps, 0);
|
||||||
|
@ -1806,7 +1819,9 @@ gst_ffmpeg_caps_to_smpfmt (const GstCaps * caps,
|
||||||
if (!raw)
|
if (!raw)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!strcmp (gst_structure_get_name (structure), "audio/x-raw-float")) {
|
name = gst_structure_get_name (structure);
|
||||||
|
|
||||||
|
if (!strcmp (name, "audio/x-raw-float")) {
|
||||||
/* FLOAT */
|
/* FLOAT */
|
||||||
if (gst_structure_get_int (structure, "width", &width) &&
|
if (gst_structure_get_int (structure, "width", &width) &&
|
||||||
gst_structure_get_int (structure, "endianness", &endianness)) {
|
gst_structure_get_int (structure, "endianness", &endianness)) {
|
||||||
|
@ -2273,7 +2288,18 @@ gst_ffmpeg_caps_with_codecid (enum CodecID codec_id,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case CODEC_ID_ADPCM_G726:
|
case CODEC_ID_ADPCM_G726:
|
||||||
|
{
|
||||||
|
const gchar *layout;
|
||||||
|
|
||||||
|
if ((layout = gst_structure_get_string (str, "layout"))) {
|
||||||
|
if (!strcmp (layout, "g721")) {
|
||||||
|
context->sample_rate = 8000;
|
||||||
|
context->channels = 1;
|
||||||
|
context->bit_rate = 32000;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2925,6 +2951,8 @@ gst_ffmpeg_caps_to_codecid (const GstCaps * caps, AVCodecContext * context)
|
||||||
id = CODEC_ID_ADPCM_EA;
|
id = CODEC_ID_ADPCM_EA;
|
||||||
} else if (!strcmp (layout, "g726")) {
|
} else if (!strcmp (layout, "g726")) {
|
||||||
id = CODEC_ID_ADPCM_G726;
|
id = CODEC_ID_ADPCM_G726;
|
||||||
|
} else if (!strcmp (layout, "g721")) {
|
||||||
|
id = CODEC_ID_ADPCM_G726;
|
||||||
} else if (!strcmp (layout, "ct")) {
|
} else if (!strcmp (layout, "ct")) {
|
||||||
id = CODEC_ID_ADPCM_CT;
|
id = CODEC_ID_ADPCM_CT;
|
||||||
} else if (!strcmp (layout, "swf")) {
|
} else if (!strcmp (layout, "swf")) {
|
||||||
|
|
Loading…
Reference in a new issue