ffmpeg: port to new audio caps

This commit is contained in:
Wim Taymans 2011-08-19 18:33:11 +02:00
parent 7ae8b453ca
commit dd56c2c7ea
4 changed files with 76 additions and 126 deletions

View file

@ -71,14 +71,18 @@ static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
GST_STATIC_CAPS
("audio/x-raw-int, endianness = (int) BYTE_ORDER, signed = (boolean) true, width = (int) 16, depth = (int) 16, channels = (int) { 1 , 2 }, rate = (int) [1, MAX ]")
("audio/x-raw,"
"format = (string) " GST_AUDIO_NE (S16) ","
"channels = (int) { 1 , 2 }, rate = (int) [1, MAX ]")
);
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
GST_STATIC_CAPS
("audio/x-raw-int, endianness = (int) BYTE_ORDER, signed = (boolean) true, width = (int) 16, depth = (int) 16, channels = (int) [ 1 , 6 ], rate = (int) [1, MAX ]")
("audio/x-raw,"
"format = (string) " GST_AUDIO_NE (S16) ","
"channels = (int) { 1 , 2 }, rate = (int) [1, MAX ]")
);
GST_BOILERPLATE (GstFFMpegAudioResample, gst_ffmpegaudioresample,

View file

@ -34,6 +34,7 @@
#include "gstffmpegcodecmap.h"
#include <gst/video/video.h>
#include <gst/audio/audio.h>
#include <gst/pbutils/codec-utils.h>
/*
@ -434,7 +435,7 @@ gst_ff_aud_caps_new (AVCodecContext * context, enum CodecID codec_id,
* Unfortunately no encoder uses this yet....
*/
}
#if 0
/* regardless of encode/decode, open up channels if applicable */
/* Until decoders/encoders expose the maximum number of channels
* they support, we whitelist them here. */
@ -453,6 +454,7 @@ gst_ff_aud_caps_new (AVCodecContext * context, enum CodecID codec_id,
default:
break;
}
#endif
if (maxchannels == 1)
caps = gst_caps_new_simple (mimetype,
@ -1283,56 +1285,34 @@ gst_ffmpeg_codecid_to_caps (enum CodecID codec_id,
case CODEC_ID_PCM_S8:
case CODEC_ID_PCM_U8:
{
gint width = 0, depth = 0, endianness = 0;
gboolean signedness = FALSE; /* blabla */
GstAudioFormat format;
switch (codec_id) {
case CODEC_ID_PCM_S16LE:
width = 16;
depth = 16;
endianness = G_LITTLE_ENDIAN;
signedness = TRUE;
format = GST_AUDIO_FORMAT_S16_LE;
break;
case CODEC_ID_PCM_S16BE:
width = 16;
depth = 16;
endianness = G_BIG_ENDIAN;
signedness = TRUE;
format = GST_AUDIO_FORMAT_S16_BE;
break;
case CODEC_ID_PCM_U16LE:
width = 16;
depth = 16;
endianness = G_LITTLE_ENDIAN;
signedness = FALSE;
format = GST_AUDIO_FORMAT_U16_LE;
break;
case CODEC_ID_PCM_U16BE:
width = 16;
depth = 16;
endianness = G_BIG_ENDIAN;
signedness = FALSE;
format = GST_AUDIO_FORMAT_U16_BE;
break;
case CODEC_ID_PCM_S8:
width = 8;
depth = 8;
endianness = G_BYTE_ORDER;
signedness = TRUE;
format = GST_AUDIO_FORMAT_S8;
break;
case CODEC_ID_PCM_U8:
width = 8;
depth = 8;
endianness = G_BYTE_ORDER;
signedness = FALSE;
format = GST_AUDIO_FORMAT_U8;
break;
default:
g_assert (0); /* don't worry, we never get here */
break;
}
caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-raw-int",
"width", G_TYPE_INT, width,
"depth", G_TYPE_INT, depth,
"endianness", G_TYPE_INT, endianness,
"signed", G_TYPE_BOOLEAN, signedness, NULL);
caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-raw",
"format", G_TYPE_STRING, gst_audio_format_to_string (format), NULL);
}
break;
@ -1799,50 +1779,30 @@ gst_ffmpeg_smpfmt_to_caps (enum SampleFormat sample_fmt,
AVCodecContext * context, enum CodecID codec_id)
{
GstCaps *caps = NULL;
int bpp = 0;
gboolean integer = TRUE;
gboolean signedness = FALSE;
GstAudioFormat format;
switch (sample_fmt) {
case SAMPLE_FMT_S16:
signedness = TRUE;
bpp = 16;
format = GST_AUDIO_FORMAT_S16;
break;
case SAMPLE_FMT_S32:
signedness = TRUE;
bpp = 32;
format = GST_AUDIO_FORMAT_S32;
break;
case SAMPLE_FMT_FLT:
integer = FALSE;
bpp = 32;
format = GST_AUDIO_FORMAT_F32;
break;
case SAMPLE_FMT_DBL:
integer = FALSE;
bpp = 64;
format = GST_AUDIO_FORMAT_F64;
break;
default:
/* .. */
format = GST_AUDIO_FORMAT_UNKNOWN;
break;
}
if (bpp) {
if (integer) {
caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-raw-int",
"signed", G_TYPE_BOOLEAN, signedness,
"endianness", G_TYPE_INT, G_BYTE_ORDER,
"width", G_TYPE_INT, bpp, "depth", G_TYPE_INT, bpp, NULL);
} else {
caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-raw-float",
"endianness", G_TYPE_INT, G_BYTE_ORDER,
"width", G_TYPE_INT, bpp, NULL);
}
}
if (caps != NULL) {
if (format != GST_AUDIO_FORMAT_UNKNOWN) {
caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-raw",
"format", G_TYPE_STRING, gst_audio_format_to_string (format), NULL);
GST_LOG ("caps for sample_fmt=%d: %" GST_PTR_FORMAT, sample_fmt, caps);
} else {
GST_LOG ("No caps found for sample_fmt=%d", sample_fmt);
@ -1964,11 +1924,11 @@ gst_ffmpeg_caps_to_smpfmt (const GstCaps * caps,
AVCodecContext * context, gboolean raw)
{
GstStructure *structure;
gint depth = 0, width = 0, endianness = 0;
gboolean signedness = FALSE;
const gchar *name;
const gchar *fmt;
GstAudioFormat format = GST_AUDIO_FORMAT_UNKNOWN;
g_return_if_fail (gst_caps_get_size (caps) == 1);
structure = gst_caps_get_structure (caps, 0);
gst_structure_get_int (structure, "channels", &context->channels);
@ -1979,35 +1939,29 @@ gst_ffmpeg_caps_to_smpfmt (const GstCaps * caps,
if (!raw)
return;
name = gst_structure_get_name (structure);
if (gst_structure_has_name (structure, "audio/x-raw")) {
if ((fmt = gst_structure_get_string (structure, "format"))) {
format = gst_audio_format_from_string (fmt);
}
}
if (!strcmp (name, "audio/x-raw-float")) {
/* FLOAT */
if (gst_structure_get_int (structure, "width", &width) &&
gst_structure_get_int (structure, "endianness", &endianness)) {
if (endianness == G_BYTE_ORDER) {
if (width == 32)
switch (format) {
case GST_AUDIO_FORMAT_F32:
context->sample_fmt = SAMPLE_FMT_FLT;
else if (width == 64)
break;
case GST_AUDIO_FORMAT_F64:
context->sample_fmt = SAMPLE_FMT_DBL;
}
}
} else {
/* INT */
if (gst_structure_get_int (structure, "width", &width) &&
gst_structure_get_int (structure, "depth", &depth) &&
gst_structure_get_boolean (structure, "signed", &signedness) &&
gst_structure_get_int (structure, "endianness", &endianness)) {
if ((endianness == G_BYTE_ORDER) && (signedness == TRUE)) {
if ((width == 16) && (depth == 16))
context->sample_fmt = SAMPLE_FMT_S16;
else if ((width == 32) && (depth == 32))
break;
case GST_AUDIO_FORMAT_S32:
context->sample_fmt = SAMPLE_FMT_S32;
break;
case GST_AUDIO_FORMAT_S16:
context->sample_fmt = SAMPLE_FMT_S16;
break;
default:
break;
}
}
}
}
/* Convert a GstCaps (video/raw) to a FFMPEG PixFmt
* and other video properties in a AVCodecContext.
@ -2808,39 +2762,30 @@ gst_ffmpeg_caps_to_codecid (const GstCaps * caps, AVCodecContext * context)
if (!strcmp (mimetype, "video/x-raw")) {
id = CODEC_ID_RAWVIDEO;
video = TRUE;
} else if (!strcmp (mimetype, "audio/x-raw-int")) {
gint depth, width, endianness;
gboolean signedness;
} else if (!strcmp (mimetype, "audio/x-raw")) {
GstAudioInfo info;
if (gst_structure_get_int (structure, "endianness", &endianness) &&
gst_structure_get_boolean (structure, "signed", &signedness) &&
gst_structure_get_int (structure, "width", &width) &&
gst_structure_get_int (structure, "depth", &depth) && depth == width) {
switch (depth) {
case 8:
if (signedness) {
if (gst_audio_info_from_caps (&info, caps)) {
switch (GST_AUDIO_INFO_FORMAT (&info)) {
case GST_AUDIO_FORMAT_S8:
id = CODEC_ID_PCM_S8;
} else {
break;
case GST_AUDIO_FORMAT_U8:
id = CODEC_ID_PCM_U8;
}
break;
case 16:
switch (endianness) {
case G_BIG_ENDIAN:
if (signedness) {
id = CODEC_ID_PCM_S16BE;
} else {
id = CODEC_ID_PCM_U16BE;
}
break;
case G_LITTLE_ENDIAN:
if (signedness) {
case GST_AUDIO_FORMAT_S16_LE:
id = CODEC_ID_PCM_S16LE;
} else {
id = CODEC_ID_PCM_U16LE;
}
break;
}
case GST_AUDIO_FORMAT_S16_BE:
id = CODEC_ID_PCM_S16BE;
break;
case GST_AUDIO_FORMAT_U16_LE:
id = CODEC_ID_PCM_U16LE;
break;
case GST_AUDIO_FORMAT_U16_BE:
id = CODEC_ID_PCM_U16BE;
break;
default:
break;
}
if (id != CODEC_ID_NONE)

View file

@ -1152,8 +1152,10 @@ gst_ffmpegdec_bufferpool (GstFFMpegDec * ffmpegdec, GstCaps * caps)
/* and store */
gst_buffer_pool_set_config (pool, config);
if (ffmpegdec->pool)
if (ffmpegdec->pool) {
gst_buffer_pool_set_active (ffmpegdec->pool, FALSE);
gst_object_unref (ffmpegdec->pool);
}
ffmpegdec->pool = pool;
/* and activate */

View file

@ -265,8 +265,7 @@ gst_ffmpegmux_base_init (gpointer g_class)
if (videosinkcaps)
gst_caps_unref (videosinkcaps);
videosinkcaps =
gst_caps_from_string ("video/x-raw-rgb, bpp=(int)24, depth=(int)24");
videosinkcaps = gst_caps_from_string ("video/x-raw, format=(string)RGB");
}
/* pad templates */