Commit 05bbc256 authored by Benjamin Otte's avatar Benjamin Otte

port to new caps branch. Includes complete rework of colorspace caps nego. (untested unfortunately)

Original commit message from CVS:
port to new caps branch. Includes complete rework of colorspace caps nego. (untested unfortunately)
parent d0b4ac40
common @ cd5507ae
Subproject commit 2c2bce01ed5ed1d1684bd76a334477398009ef4a
Subproject commit cd5507ae3df8dc48c07df9e37878846b6b79faa1
This diff is collapsed.
......@@ -31,7 +31,7 @@
* a certain CodecID for a pad with compressed data.
*/
GstCaps *
GstCaps2 *
gst_ffmpeg_codecid_to_caps (enum CodecID codec_id,
AVCodecContext *context);
......@@ -39,7 +39,7 @@ gst_ffmpeg_codecid_to_caps (enum CodecID codec_id,
* a certain CodecType for a pad with uncompressed data.
*/
GstCaps *
GstCaps2 *
gst_ffmpeg_codectype_to_caps (enum CodecType codec_type,
AVCodecContext *context);
......@@ -49,7 +49,7 @@ gst_ffmpeg_codectype_to_caps (enum CodecType codec_type,
*/
enum CodecID
gst_ffmpeg_caps_to_codecid (GstCaps *caps,
gst_ffmpeg_caps_to_codecid (const GstCaps2 *caps,
AVCodecContext *context);
/* caps_to_codectype () transforms a GstCaps that belongs to
......@@ -58,7 +58,7 @@ gst_ffmpeg_caps_to_codecid (GstCaps *caps,
void
gst_ffmpeg_caps_to_codectype (enum CodecType type,
GstCaps *caps,
const GstCaps2 *caps,
AVCodecContext *context);
/* _formatid_to_caps () is meant for muxers/demuxers, it
......@@ -67,7 +67,7 @@ gst_ffmpeg_caps_to_codectype (enum CodecType type,
* caps belonging to that mux-format
*/
GstCaps *
GstCaps2 *
gst_ffmpeg_formatid_to_caps (const gchar *format_name);
#endif /* __GST_FFMPEG_CODECMAP_H__ */
This diff is collapsed.
......@@ -59,7 +59,7 @@ typedef struct _GstFFMpegDecClassParams GstFFMpegDecClassParams;
struct _GstFFMpegDecClassParams {
AVCodec *in_plugin;
GstCaps *srccaps, *sinkcaps;
GstCaps2 *srccaps, *sinkcaps;
};
#define GST_TYPE_FFMPEGDEC \
......@@ -92,7 +92,7 @@ static void gst_ffmpegdec_init (GstFFMpegDec *ffmpegdec);
static void gst_ffmpegdec_dispose (GObject *object);
static GstPadLinkReturn gst_ffmpegdec_connect (GstPad *pad,
GstCaps *caps);
const GstCaps2 *caps);
static void gst_ffmpegdec_chain (GstPad *pad,
GstData *data);
......@@ -141,9 +141,9 @@ gst_ffmpegdec_base_init (GstFFMpegDecClass *klass)
/* pad templates */
sinktempl = gst_pad_template_new ("sink", GST_PAD_SINK,
GST_PAD_ALWAYS, params->sinkcaps, NULL);
GST_PAD_ALWAYS, params->sinkcaps);
srctempl = gst_pad_template_new ("src", GST_PAD_SRC,
GST_PAD_ALWAYS, params->srccaps, NULL);
GST_PAD_ALWAYS, params->srccaps);
gst_element_class_add_pad_template (element_class, srctempl);
gst_element_class_add_pad_template (element_class, sinktempl);
......@@ -206,15 +206,11 @@ gst_ffmpegdec_dispose (GObject *object)
static GstPadLinkReturn
gst_ffmpegdec_connect (GstPad *pad,
GstCaps *caps)
const GstCaps2 *caps)
{
GstFFMpegDec *ffmpegdec = (GstFFMpegDec *)(gst_pad_get_parent (pad));
GstFFMpegDecClass *oclass = (GstFFMpegDecClass*)(G_OBJECT_GET_CLASS (ffmpegdec));
/* we want fixed caps */
if (!GST_CAPS_IS_FIXED (caps))
return GST_PAD_LINK_DELAYED;
/* close old session */
if (ffmpegdec->opened) {
avcodec_close (ffmpegdec->context);
......@@ -407,7 +403,7 @@ gst_ffmpegdec_chain (GstPad *pad,
if (have_data) {
if (!GST_PAD_CAPS (ffmpegdec->srcpad)) {
GstCaps *caps;
GstCaps2 *caps;
caps = gst_ffmpeg_codectype_to_caps (oclass->in_plugin->type,
ffmpegdec->context);
if (caps == NULL ||
......@@ -475,7 +471,7 @@ gst_ffmpegdec_register (GstPlugin *plugin)
while (in_plugin) {
GstFFMpegDecClassParams *params;
GstCaps *srccaps, *sinkcaps;
GstCaps2 *srccaps, *sinkcaps;
gchar *type_name;
/* no quasi-codecs, please */
......
......@@ -51,7 +51,7 @@ struct _GstFFMpegDemux {
typedef struct _GstFFMpegDemuxClassParams {
AVInputFormat *in_plugin;
GstCaps *sinkcaps, *videosrccaps, *audiosrccaps;
GstCaps2 *sinkcaps, *videosrccaps, *audiosrccaps;
} GstFFMpegDemuxClassParams;
typedef struct _GstFFMpegDemuxClass GstFFMpegDemuxClass;
......@@ -133,15 +133,15 @@ gst_ffmpegdemux_base_init (GstFFMpegDemuxClass *klass)
sinktempl = gst_pad_template_new ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
params->sinkcaps, NULL);
params->sinkcaps);
videosrctempl = gst_pad_template_new ("video_%02d",
GST_PAD_SRC,
GST_PAD_SOMETIMES,
params->videosrccaps, NULL);
params->videosrccaps);
audiosrctempl = gst_pad_template_new ("audio_%02d",
GST_PAD_SRC,
GST_PAD_SOMETIMES,
params->audiosrccaps, NULL);
params->audiosrccaps);
gst_element_class_add_pad_template (element_class, videosrctempl);
gst_element_class_add_pad_template (element_class, audiosrctempl);
......@@ -217,12 +217,8 @@ gst_ffmpegdemux_type_find (GstTypeFind *tf, gpointer priv)
res = in_plugin->read_probe (&probe_data);
res = res * GST_TYPE_FIND_MAXIMUM / AVPROBE_SCORE_MAX;
if (res > 0) {
GstCaps *caps = params->sinkcaps;
/* make sure we still hold a refcount to this caps */
gst_caps_ref (caps);
gst_type_find_suggest (tf, res, caps);
}
if (res > 0)
gst_type_find_suggest (tf, res, params->sinkcaps);
}
}
......@@ -291,7 +287,7 @@ gst_ffmpegdemux_loop (GstElement *element)
/* create the pad/stream if we didn't do so already */
if (st->codec_info_state == 0) {
GstPadTemplate *templ = NULL;
GstCaps *caps;
GstCaps2 *caps;
gchar *padname;
gint num;
......@@ -386,6 +382,11 @@ gst_ffmpegdemux_change_state (GstElement *element)
gboolean
gst_ffmpegdemux_register (GstPlugin *plugin)
{
GType type;
AVInputFormat *in_plugin;
GstFFMpegDemuxClassParams *params;
AVCodec *in_codec;
gchar **extensions;
GTypeInfo typeinfo = {
sizeof(GstFFMpegDemuxClass),
(GBaseInitFunc)gst_ffmpegdemux_base_init,
......@@ -397,11 +398,7 @@ gst_ffmpegdemux_register (GstPlugin *plugin)
0,
(GInstanceInitFunc)gst_ffmpegdemux_init,
};
GType type;
AVInputFormat *in_plugin;
GstFFMpegDemuxClassParams *params;
AVCodec *in_codec;
gchar **extensions;
GstCaps2 *any_caps = gst_caps2_new_any ();
in_plugin = first_iformat;
......@@ -410,7 +407,7 @@ gst_ffmpegdemux_register (GstPlugin *plugin)
while (in_plugin) {
gchar *type_name, *typefind_name;
gchar *p;
GstCaps *sinkcaps, *audiosrccaps, *videosrccaps;
GstCaps2 *sinkcaps, *audiosrccaps, *videosrccaps;
/* Try to find the caps that belongs here */
sinkcaps = gst_ffmpeg_formatid_to_caps (in_plugin->name);
......@@ -424,19 +421,19 @@ gst_ffmpegdemux_register (GstPlugin *plugin)
videosrccaps = NULL;
for (in_codec = first_avcodec; in_codec != NULL;
in_codec = in_codec->next) {
GstCaps *temp = gst_ffmpeg_codecid_to_caps (in_codec->id, NULL);
GstCaps2 *temp = gst_ffmpeg_codecid_to_caps (in_codec->id, NULL);
if (!temp) {
continue;
}
switch (in_codec->type) {
case CODEC_TYPE_VIDEO:
videosrccaps = gst_caps_append (videosrccaps, temp);
gst_caps2_append (videosrccaps, temp);
break;
case CODEC_TYPE_AUDIO:
audiosrccaps = gst_caps_append (audiosrccaps, temp);
gst_caps2_append (audiosrccaps, temp);
break;
default:
gst_caps_unref (temp);
gst_caps2_free (temp);
break;
}
}
......@@ -480,13 +477,14 @@ gst_ffmpegdemux_register (GstPlugin *plugin)
if (!gst_element_register (plugin, type_name, GST_RANK_MARGINAL, type) ||
!gst_type_find_register (plugin, typefind_name, GST_RANK_MARGINAL,
gst_ffmpegdemux_type_find,
extensions, GST_CAPS_ANY, params))
extensions, any_caps, params))
return FALSE;
g_strfreev (extensions);
next:
in_plugin = in_plugin->next;
}
gst_caps2_free (any_caps);
g_hash_table_remove (global_plugins, GINT_TO_POINTER (0));
return TRUE;
......
......@@ -64,7 +64,7 @@ struct _GstFFMpegEncClass {
typedef struct {
AVCodec *in_plugin;
GstCaps *srccaps, *sinkcaps;
GstCaps2 *srccaps, *sinkcaps;
} GstFFMpegEncClassParams;
#define GST_TYPE_FFMPEGENC \
......@@ -123,7 +123,7 @@ static void gst_ffmpegenc_init (GstFFMpegEnc *ffmpegenc);
static void gst_ffmpegenc_dispose (GObject *object);
static GstPadLinkReturn
gst_ffmpegenc_connect (GstPad *pad, GstCaps *caps);
gst_ffmpegenc_connect (GstPad *pad, const GstCaps2 *caps);
static void gst_ffmpegenc_chain_video (GstPad *pad, GstData *_data);
static void gst_ffmpegenc_chain_audio (GstPad *pad, GstData *_data);
......@@ -175,9 +175,9 @@ gst_ffmpegenc_base_init (GstFFMpegEncClass *klass)
/* pad templates */
sinktempl = gst_pad_template_new ("sink", GST_PAD_SINK,
GST_PAD_ALWAYS, params->sinkcaps, NULL);
GST_PAD_ALWAYS, params->sinkcaps);
srctempl = gst_pad_template_new ("src", GST_PAD_SRC,
GST_PAD_ALWAYS, params->srccaps, NULL);
GST_PAD_ALWAYS, params->srccaps);
gst_element_class_add_pad_template (element_class, srctempl);
gst_element_class_add_pad_template (element_class, sinktempl);
......@@ -282,15 +282,13 @@ gst_ffmpegenc_dispose (GObject *object)
static GstPadLinkReturn
gst_ffmpegenc_connect (GstPad *pad,
GstCaps *caps)
const GstCaps2 *caps)
{
GstFFMpegEnc *ffmpegenc = (GstFFMpegEnc *) gst_pad_get_parent (pad);
GstFFMpegEncClass *oclass = (GstFFMpegEncClass*)(G_OBJECT_GET_CLASS(ffmpegenc));
GstCaps *ret_caps;
GstCaps2 *other_caps;
GstPadLinkReturn ret;
if (!GST_CAPS_IS_FIXED (caps))
return GST_PAD_LINK_DELAYED;
enum PixelFormat pix_fmt;
GstFFMpegEnc *ffmpegenc = (GstFFMpegEnc *) gst_pad_get_parent (pad);
GstFFMpegEncClass *oclass = (GstFFMpegEncClass *) G_OBJECT_GET_CLASS(ffmpegenc);
/* close old session */
if (ffmpegenc->opened) {
......@@ -315,47 +313,37 @@ gst_ffmpegenc_connect (GstPad *pad,
/* no edges */
ffmpegenc->context->flags |= CODEC_FLAG_EMU_EDGE;
for (ret_caps = caps; ret_caps != NULL; ret_caps = ret_caps->next) {
enum PixelFormat pix_fmt;
/* fetch pix_fmt and so on */
gst_ffmpeg_caps_to_codectype (oclass->in_plugin->type,
caps, ffmpegenc->context);
/* fetch pix_fmt and so on */
gst_ffmpeg_caps_to_codectype (oclass->in_plugin->type,
caps, ffmpegenc->context);
pix_fmt = ffmpegenc->context->pix_fmt;
pix_fmt = ffmpegenc->context->pix_fmt;
/* open codec */
if (avcodec_open (ffmpegenc->context, oclass->in_plugin) < 0) {
GST_DEBUG ("ffenc_%s: Failed to open FFMPEG codec",
oclass->in_plugin->name);
continue;
}
/* is the colourspace correct? */
if (pix_fmt != ffmpegenc->context->pix_fmt) {
avcodec_close (ffmpegenc->context);
GST_DEBUG ("ffenc_%s: AV wants different colourspace (%d given, %d wanted)",
oclass->in_plugin->name, pix_fmt, ffmpegenc->context->pix_fmt);
continue;
}
break;
/* open codec */
if (avcodec_open (ffmpegenc->context, oclass->in_plugin) < 0) {
GST_DEBUG ("ffenc_%s: Failed to open FFMPEG codec",
oclass->in_plugin->name);
return GST_PAD_LINK_REFUSED;
}
if (ret_caps == NULL) {
/* is the colourspace correct? */
if (pix_fmt != ffmpegenc->context->pix_fmt) {
avcodec_close (ffmpegenc->context);
GST_DEBUG ("ffenc_%s: AV wants different colourspace (%d given, %d wanted)",
oclass->in_plugin->name, pix_fmt, ffmpegenc->context->pix_fmt);
return GST_PAD_LINK_REFUSED;
}
/* try to set this caps on the other side */
ret_caps = gst_ffmpeg_codecid_to_caps (oclass->in_plugin->id,
other_caps = gst_ffmpeg_codecid_to_caps (oclass->in_plugin->id,
ffmpegenc->context);
if (!ret_caps) {
if (!other_caps) {
avcodec_close (ffmpegenc->context);
GST_DEBUG ("Unsupported codec - no caps found");
return GST_PAD_LINK_REFUSED;
}
if ((ret = gst_pad_try_set_caps (ffmpegenc->srcpad, ret_caps)) <= 0) {
if ((ret = gst_pad_try_set_caps (ffmpegenc->srcpad, other_caps)) <= 0) {
avcodec_close (ffmpegenc->context);
GST_DEBUG ("Failed to set caps on next element for ffmpeg encoder (%s)",
oclass->in_plugin->name);
......@@ -606,7 +594,7 @@ gst_ffmpegenc_register (GstPlugin *plugin)
while (in_plugin) {
gchar *type_name;
GstCaps *srccaps, *sinkcaps;
GstCaps2 *srccaps, *sinkcaps;
GstFFMpegEncClassParams *params;
/* no quasi codecs, please */
......
......@@ -51,7 +51,7 @@ struct _GstFFMpegMux {
typedef struct _GstFFMpegMuxClassParams {
AVOutputFormat *in_plugin;
GstCaps *srccaps, *videosinkcaps, *audiosinkcaps;
GstCaps2 *srccaps, *videosinkcaps, *audiosinkcaps;
} GstFFMpegMuxClassParams;
typedef struct _GstFFMpegMuxClass GstFFMpegMuxClass;
......@@ -96,7 +96,7 @@ static void gst_ffmpegmux_dispose (GObject *object);
static GstPadLinkReturn
gst_ffmpegmux_connect (GstPad *pad,
GstCaps *caps);
const GstCaps2 *caps);
static GstPad * gst_ffmpegmux_request_new_pad (GstElement *element,
GstPadTemplate *templ,
const gchar *name);
......@@ -138,15 +138,15 @@ gst_ffmpegmux_base_init (GstFFMpegMuxClass *klass)
/* pad templates */
srctempl = gst_pad_template_new ("sink", GST_PAD_SRC,
GST_PAD_ALWAYS,
params->srccaps, NULL);
params->srccaps);
audiosinktempl = gst_pad_template_new ("audio_%d",
GST_PAD_SINK,
GST_PAD_REQUEST,
params->audiosinkcaps, NULL);
params->audiosinkcaps);
videosinktempl = gst_pad_template_new ("video_%d",
GST_PAD_SINK,
GST_PAD_REQUEST,
params->videosinkcaps, NULL);
params->videosinkcaps);
gst_element_class_add_pad_template (element_class, srctempl);
gst_element_class_add_pad_template (element_class, videosinktempl);
......@@ -272,7 +272,7 @@ gst_ffmpegmux_request_new_pad (GstElement *element,
static GstPadLinkReturn
gst_ffmpegmux_connect (GstPad *pad,
GstCaps *caps)
const GstCaps2 *caps)
{
GstFFMpegMux *ffmpegmux = (GstFFMpegMux *)(gst_pad_get_parent (pad));
gint i;
......@@ -281,9 +281,6 @@ gst_ffmpegmux_connect (GstPad *pad,
g_return_val_if_fail (ffmpegmux->opened == FALSE,
GST_PAD_LINK_REFUSED);
if (!GST_CAPS_IS_FIXED (caps))
return GST_PAD_LINK_DELAYED;
for (i = 0; i < ffmpegmux->context->nb_streams; i++) {
if (pad == ffmpegmux->sinkpads[i]) {
break;
......@@ -297,12 +294,10 @@ gst_ffmpegmux_connect (GstPad *pad,
/* for the format-specific guesses, we'll go to
* our famous codec mapper */
for ( ; caps != NULL; caps = caps->next) {
if (gst_ffmpeg_caps_to_codecid (caps,
&st->codec) != CODEC_ID_NONE) {
ffmpegmux->eos[i] = FALSE;
return GST_PAD_LINK_OK;
}
if (gst_ffmpeg_caps_to_codecid (caps,
&st->codec) != CODEC_ID_NONE) {
ffmpegmux->eos[i] = FALSE;
return GST_PAD_LINK_OK;
}
return GST_PAD_LINK_REFUSED;
......@@ -463,7 +458,7 @@ gst_ffmpegmux_register (GstPlugin *plugin)
while (in_plugin) {
gchar *type_name;
gchar *p;
GstCaps *srccaps, *audiosinkcaps, *videosinkcaps;
GstCaps2 *srccaps, *audiosinkcaps, *videosinkcaps;
/* Try to find the caps that belongs here */
srccaps = gst_ffmpeg_formatid_to_caps (in_plugin->name);
......@@ -477,19 +472,19 @@ gst_ffmpegmux_register (GstPlugin *plugin)
videosinkcaps = NULL;
for (in_codec = first_avcodec; in_codec != NULL;
in_codec = in_codec->next) {
GstCaps *temp = gst_ffmpeg_codecid_to_caps (in_codec->id, NULL);
GstCaps2 *temp = gst_ffmpeg_codecid_to_caps (in_codec->id, NULL);
if (!temp) {
continue;
}
switch (in_codec->type) {
case CODEC_TYPE_VIDEO:
videosinkcaps = gst_caps_append (videosinkcaps, temp);
gst_caps2_append (videosinkcaps, temp);
break;
case CODEC_TYPE_AUDIO:
audiosinkcaps = gst_caps_append (audiosinkcaps, temp);
gst_caps2_append (audiosinkcaps, temp);
break;
default:
gst_caps_unref (temp);
gst_caps2_free (temp);
break;
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment