avauddec: Add support for planar audio formats
[platform/upstream/gst-libav.git] / ext / libav / gstavcodecmap.c
1 /* GStreamer
2  * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
3  * This file:
4  * Copyright (c) 2002-2004 Ronald Bultje <rbultje@ronald.bitfreak.net>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public
17  * License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  */
21
22 #ifdef HAVE_CONFIG_H
23 #include "config.h"
24 #endif
25
26 #include <string.h>
27
28 #include <gst/gst.h>
29 #include <libavcodec/avcodec.h>
30 #include <libavutil/channel_layout.h>
31
32 #include "gstav.h"
33 #include "gstavcodecmap.h"
34
35 #include <gst/video/video.h>
36 #include <gst/audio/audio.h>
37 #include <gst/pbutils/codec-utils.h>
38
39 /* IMPORTANT: Keep this sorted by the ffmpeg channel masks */
40 static const struct
41 {
42   guint64 ff;
43   GstAudioChannelPosition gst;
44 } _ff_to_gst_layout[] = {
45   {
46   AV_CH_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT}, {
47   AV_CH_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}, {
48   AV_CH_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER}, {
49   AV_CH_LOW_FREQUENCY, GST_AUDIO_CHANNEL_POSITION_LFE1}, {
50   AV_CH_BACK_LEFT, GST_AUDIO_CHANNEL_POSITION_REAR_LEFT}, {
51   AV_CH_BACK_RIGHT, GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, {
52   AV_CH_FRONT_LEFT_OF_CENTER, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER}, {
53   AV_CH_FRONT_RIGHT_OF_CENTER,
54         GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER}, {
55   AV_CH_BACK_CENTER, GST_AUDIO_CHANNEL_POSITION_REAR_CENTER}, {
56   AV_CH_SIDE_LEFT, GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT}, {
57   AV_CH_SIDE_RIGHT, GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT}, {
58   AV_CH_TOP_CENTER, GST_AUDIO_CHANNEL_POSITION_TOP_CENTER}, {
59   AV_CH_TOP_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_LEFT}, {
60   AV_CH_TOP_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_CENTER}, {
61   AV_CH_TOP_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_RIGHT}, {
62   AV_CH_TOP_BACK_LEFT, GST_AUDIO_CHANNEL_POSITION_TOP_REAR_LEFT}, {
63   AV_CH_TOP_BACK_CENTER, GST_AUDIO_CHANNEL_POSITION_TOP_REAR_CENTER}, {
64   AV_CH_TOP_BACK_RIGHT, GST_AUDIO_CHANNEL_POSITION_TOP_REAR_RIGHT}, {
65   AV_CH_STEREO_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT}, {
66   AV_CH_STEREO_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}
67 };
68
69 gboolean
70 gst_ffmpeg_channel_layout_to_gst (AVCodecContext * context,
71     GstAudioChannelPosition * pos)
72 {
73   guint nchannels = 0, channels = context->channels;
74   guint64 channel_layout = context->channel_layout;
75   gboolean none_layout = FALSE;
76
77   if (channel_layout == 0) {
78     nchannels = channels;
79     none_layout = TRUE;
80   } else {
81     guint i, j;
82
83     for (i = 0; i < 64; i++) {
84       if ((channel_layout & (G_GUINT64_CONSTANT (1) << i)) != 0) {
85         nchannels++;
86       }
87     }
88
89     if (nchannels != channels) {
90       GST_ERROR ("Number of channels is different (%u != %u)", channels,
91           nchannels);
92       nchannels = channels;
93       none_layout = TRUE;
94     } else {
95
96       for (i = 0, j = 0; i < G_N_ELEMENTS (_ff_to_gst_layout); i++) {
97         if ((channel_layout & _ff_to_gst_layout[i].ff) != 0) {
98           pos[j++] = _ff_to_gst_layout[i].gst;
99
100           if (_ff_to_gst_layout[i].gst == GST_AUDIO_CHANNEL_POSITION_NONE)
101             none_layout = TRUE;
102         }
103       }
104
105       if (j != nchannels) {
106         GST_WARNING
107             ("Unknown channels in channel layout - assuming NONE layout");
108         none_layout = TRUE;
109       }
110     }
111   }
112
113   if (!none_layout
114       && !gst_audio_check_valid_channel_positions (pos, nchannels, FALSE)) {
115     GST_ERROR ("Invalid channel layout %" G_GUINT64_FORMAT
116         " - assuming NONE layout", channel_layout);
117     none_layout = TRUE;
118   }
119
120   if (none_layout) {
121     if (nchannels == 1) {
122       pos[0] = GST_AUDIO_CHANNEL_POSITION_MONO;
123     } else if (nchannels == 2) {
124       pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
125       pos[1] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
126     } else {
127       guint i;
128
129       for (i = 0; i < nchannels; i++)
130         pos[i] = GST_AUDIO_CHANNEL_POSITION_NONE;
131     }
132   }
133
134   return TRUE;
135 }
136
137 /* this macro makes a caps width fixed or unfixed width/height
138  * properties depending on whether we've got a context.
139  *
140  * See below for why we use this.
141  *
142  * We should actually do this stuff at the end, like in riff-media.c,
143  * but I'm too lazy today. Maybe later.
144  */
145 static GstCaps *
146 gst_ff_vid_caps_new (AVCodecContext * context, enum CodecID codec_id,
147     gboolean encode, const char *mimetype, const char *fieldname, ...)
148 {
149   GstStructure *structure = NULL;
150   GstCaps *caps = NULL;
151   va_list var_args;
152   gint i;
153
154   GST_LOG ("context:%p, codec_id:%d, mimetype:%s", context, codec_id, mimetype);
155
156   /* fixed, non probing context */
157   if (context != NULL && context->width != -1) {
158     gint num, denom;
159
160     caps = gst_caps_new_simple (mimetype,
161         "width", G_TYPE_INT, context->width,
162         "height", G_TYPE_INT, context->height, NULL);
163
164     num = context->time_base.den / context->ticks_per_frame;
165     denom = context->time_base.num;
166
167     if (!denom) {
168       GST_LOG ("invalid framerate: %d/0, -> %d/1", num, num);
169       denom = 1;
170     }
171     if (gst_util_fraction_compare (num, denom, 1000, 1) > 0) {
172       GST_LOG ("excessive framerate: %d/%d, -> 0/1", num, denom);
173       num = 0;
174       denom = 1;
175     }
176     GST_LOG ("setting framerate: %d/%d", num, denom);
177     gst_caps_set_simple (caps,
178         "framerate", GST_TYPE_FRACTION, num, denom, NULL);
179   } else if (encode) {
180     /* so we are after restricted caps in this case */
181     switch (codec_id) {
182       case CODEC_ID_H261:
183       {
184         caps = gst_caps_new_simple (mimetype,
185             "width", G_TYPE_INT, 352,
186             "height", G_TYPE_INT, 288,
187             "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
188         gst_caps_append (caps, gst_caps_new_simple (mimetype,
189                 "width", G_TYPE_INT, 176,
190                 "height", G_TYPE_INT, 144,
191                 "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL));
192         break;
193       }
194       case CODEC_ID_H263:
195       {
196         /* 128x96, 176x144, 352x288, 704x576, and 1408x1152. slightly reordered
197          * because we want automatic negotiation to go as close to 320x240 as
198          * possible. */
199         const static gint widths[] = { 352, 704, 176, 1408, 128 };
200         const static gint heights[] = { 288, 576, 144, 1152, 96 };
201         GstCaps *temp;
202         gint n_sizes = G_N_ELEMENTS (widths);
203
204         caps = gst_caps_new_empty ();
205         for (i = 0; i < n_sizes; i++) {
206           temp = gst_caps_new_simple (mimetype,
207               "width", G_TYPE_INT, widths[i],
208               "height", G_TYPE_INT, heights[i],
209               "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
210
211           gst_caps_append (caps, temp);
212         }
213         break;
214       }
215       case CODEC_ID_DVVIDEO:
216       {
217         static struct
218         {
219           guint32 csp;
220           gint width, height;
221           gint par_n, par_d;
222           gint framerate_n, framerate_d;
223         } profiles[] = {
224           {
225           GST_MAKE_FOURCC ('Y', '4', '1', 'B'), 720, 480, 10, 11, 30000, 1001}, {
226           GST_MAKE_FOURCC ('Y', '4', '1', 'B'), 720, 480, 40, 33, 30000, 1001}, {
227           GST_MAKE_FOURCC ('I', '4', '2', '0'), 720, 576, 59, 54, 25, 1}, {
228           GST_MAKE_FOURCC ('I', '4', '2', '0'), 720, 576, 118, 81, 25, 1}, {
229           GST_MAKE_FOURCC ('Y', '4', '1', 'B'), 720, 576, 59, 54, 25, 1}, {
230           GST_MAKE_FOURCC ('Y', '4', '1', 'B'), 720, 576, 118, 81, 25, 1}
231         };
232         GstCaps *temp;
233         gint n_sizes = G_N_ELEMENTS (profiles);
234
235         caps = gst_caps_new_empty ();
236         for (i = 0; i < n_sizes; i++) {
237           temp = gst_caps_new_simple (mimetype,
238               "width", G_TYPE_INT, profiles[i].width,
239               "height", G_TYPE_INT, profiles[i].height,
240               "framerate", GST_TYPE_FRACTION, profiles[i].framerate_n,
241               profiles[i].framerate_d, "pixel-aspect-ratio", GST_TYPE_FRACTION,
242               profiles[i].par_n, profiles[i].par_d, NULL);
243
244           gst_caps_append (caps, temp);
245         }
246         break;
247       }
248       case CODEC_ID_DNXHD:
249       {
250         caps = gst_caps_new_simple (mimetype,
251             "width", G_TYPE_INT, 1920,
252             "height", G_TYPE_INT, 1080,
253             "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
254         gst_caps_append (caps, gst_caps_new_simple (mimetype,
255                 "width", G_TYPE_INT, 1280,
256                 "height", G_TYPE_INT, 720,
257                 "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL));
258         break;
259       }
260       default:
261         break;
262     }
263   }
264
265   /* no fixed caps or special restrictions applied;
266    * default unfixed setting */
267   if (!caps) {
268     GST_DEBUG ("Creating default caps");
269     caps = gst_caps_new_simple (mimetype, NULL, NULL, NULL);
270   }
271
272   for (i = 0; i < gst_caps_get_size (caps); i++) {
273     va_start (var_args, fieldname);
274     structure = gst_caps_get_structure (caps, i);
275     gst_structure_set_valist (structure, fieldname, var_args);
276     va_end (var_args);
277   }
278
279   return caps;
280 }
281
282 /* same for audio - now with channels/sample rate
283  */
284 static GstCaps *
285 gst_ff_aud_caps_new (AVCodecContext * context, enum CodecID codec_id,
286     gboolean encode, const char *mimetype, const char *fieldname, ...)
287 {
288   GstCaps *caps = NULL;
289   GstStructure *structure = NULL;
290   gint i;
291   va_list var_args;
292
293   /* fixed, non-probing context */
294   if (context != NULL && context->channels != -1) {
295     GstAudioChannelPosition pos[64];
296
297     caps = gst_caps_new_simple (mimetype,
298         "rate", G_TYPE_INT, context->sample_rate,
299         "channels", G_TYPE_INT, context->channels, NULL);
300
301     if (gst_ffmpeg_channel_layout_to_gst (context, pos)) {
302       guint64 mask;
303
304       if (gst_audio_channel_positions_to_mask (pos, context->channels, FALSE,
305               &mask)) {
306         gst_caps_set_simple (caps, "channel-mask", GST_TYPE_BITMASK, mask,
307             NULL);
308       }
309     }
310   } else if (encode) {
311     gint maxchannels = 2;
312     const gint *rates = NULL;
313     gint n_rates = 0;
314
315     /* so we must be after restricted caps in this case */
316     switch (codec_id) {
317       case CODEC_ID_AAC:
318       case CODEC_ID_AAC_LATM:
319       case CODEC_ID_DTS:
320         maxchannels = 6;
321         break;
322       case CODEC_ID_MP2:
323       {
324         const static gint l_rates[] =
325             { 48000, 44100, 32000, 24000, 22050, 16000 };
326         n_rates = G_N_ELEMENTS (l_rates);
327         rates = l_rates;
328         break;
329       }
330       case CODEC_ID_EAC3:
331       case CODEC_ID_AC3:
332       {
333         const static gint l_rates[] = { 48000, 44100, 32000 };
334         maxchannels = 6;
335         n_rates = G_N_ELEMENTS (l_rates);
336         rates = l_rates;
337         break;
338       }
339       case CODEC_ID_ADPCM_G722:
340       {
341         const static gint l_rates[] = { 16000 };
342         n_rates = G_N_ELEMENTS (l_rates);
343         rates = l_rates;
344         maxchannels = 1;
345         break;
346       }
347       case CODEC_ID_ADPCM_G726:
348       {
349         const static gint l_rates[] = { 8000 };
350         n_rates = G_N_ELEMENTS (l_rates);
351         rates = l_rates;
352         maxchannels = 1;
353         break;
354       }
355       case CODEC_ID_ADPCM_SWF:
356       {
357         const static gint l_rates[] = { 11025, 22050, 44100 };
358         n_rates = G_N_ELEMENTS (l_rates);
359         rates = l_rates;
360         break;
361       }
362       case CODEC_ID_ROQ_DPCM:
363       {
364         const static gint l_rates[] = { 22050 };
365         n_rates = G_N_ELEMENTS (l_rates);
366         rates = l_rates;
367         break;
368       }
369       case CODEC_ID_AMR_NB:
370       {
371         const static gint l_rates[] = { 8000 };
372         maxchannels = 1;
373         n_rates = G_N_ELEMENTS (l_rates);
374         rates = l_rates;
375         break;
376       }
377       case CODEC_ID_AMR_WB:
378       {
379         const static gint l_rates[] = { 16000 };
380         maxchannels = 1;
381         n_rates = G_N_ELEMENTS (l_rates);
382         rates = l_rates;
383         break;
384       }
385       default:
386         break;
387     }
388
389     /* TODO: handle context->channel_layouts here to set
390      * the list of channel layouts supported by the encoder.
391      * Unfortunately no encoder uses this yet....
392      */
393     /* regardless of encode/decode, open up channels if applicable */
394     /* Until decoders/encoders expose the maximum number of channels
395      * they support, we whitelist them here. */
396     switch (codec_id) {
397       case CODEC_ID_WMAPRO:
398       case CODEC_ID_TRUEHD:
399         maxchannels = 8;
400         break;
401       default:
402         break;
403     }
404
405     if (maxchannels == 1)
406       caps = gst_caps_new_simple (mimetype,
407           "channels", G_TYPE_INT, maxchannels, NULL);
408     else
409       caps = gst_caps_new_simple (mimetype,
410           "channels", GST_TYPE_INT_RANGE, 1, maxchannels, NULL);
411     if (n_rates) {
412       GValue list = { 0, };
413       GstStructure *structure;
414
415       g_value_init (&list, GST_TYPE_LIST);
416       for (i = 0; i < n_rates; i++) {
417         GValue v = { 0, };
418
419         g_value_init (&v, G_TYPE_INT);
420         g_value_set_int (&v, rates[i]);
421         gst_value_list_append_value (&list, &v);
422         g_value_unset (&v);
423       }
424       structure = gst_caps_get_structure (caps, 0);
425       gst_structure_set_value (structure, "rate", &list);
426       g_value_unset (&list);
427     } else
428       gst_caps_set_simple (caps, "rate", GST_TYPE_INT_RANGE, 4000, 96000, NULL);
429   } else {
430     caps = gst_caps_new_empty_simple (mimetype);
431   }
432
433   for (i = 0; i < gst_caps_get_size (caps); i++) {
434     va_start (var_args, fieldname);
435     structure = gst_caps_get_structure (caps, i);
436     gst_structure_set_valist (structure, fieldname, var_args);
437     va_end (var_args);
438   }
439
440   return caps;
441 }
442
443 /* Convert a FFMPEG codec ID and optional AVCodecContext
444  * to a GstCaps. If the context is ommitted, no fixed values
445  * for video/audio size will be included in the GstCaps
446  *
447  * CodecID is primarily meant for compressed data GstCaps!
448  *
449  * encode is a special parameter. gstffmpegdec will say
450  * FALSE, gstffmpegenc will say TRUE. The output caps
451  * depends on this, in such a way that it will be very
452  * specific, defined, fixed and correct caps for encoders,
453  * yet very wide, "forgiving" caps for decoders. Example
454  * for mp3: decode: audio/mpeg,mpegversion=1,layer=[1-3]
455  * but encode: audio/mpeg,mpegversion=1,layer=3,bitrate=x,
456  * rate=x,channels=x.
457  */
458
459 GstCaps *
460 gst_ffmpeg_codecid_to_caps (enum CodecID codec_id,
461     AVCodecContext * context, gboolean encode)
462 {
463   GstCaps *caps = NULL;
464   gboolean buildcaps = FALSE;
465
466   GST_LOG ("codec_id:%d, context:%p, encode:%d", codec_id, context, encode);
467
468   switch (codec_id) {
469     case CODEC_ID_MPEG1VIDEO:
470       /* FIXME: bitrate */
471       caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/mpeg",
472           "mpegversion", G_TYPE_INT, 1,
473           "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
474       break;
475
476     case CODEC_ID_MPEG2VIDEO:
477       if (encode) {
478         /* FIXME: bitrate */
479         caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/mpeg",
480             "mpegversion", G_TYPE_INT, 2,
481             "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
482       } else {
483         /* decode both MPEG-1 and MPEG-2; width/height/fps are all in
484          * the MPEG video stream headers, so may be omitted from caps. */
485         caps = gst_caps_new_simple ("video/mpeg",
486             "mpegversion", GST_TYPE_INT_RANGE, 1, 2,
487             "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
488       }
489       break;
490
491     case CODEC_ID_MPEG2VIDEO_XVMC:
492       /* this is a special ID - don't need it in GStreamer, I think */
493       break;
494
495     case CODEC_ID_H263:
496       if (encode) {
497         caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-h263",
498             "variant", G_TYPE_STRING, "itu",
499             "h263version", G_TYPE_STRING, "h263", NULL);
500       } else {
501         /* don't pass codec_id, we can decode other variants with the H263
502          * decoder that don't have specific size requirements
503          */
504         caps =
505             gst_ff_vid_caps_new (context, CODEC_ID_NONE, encode, "video/x-h263",
506             "variant", G_TYPE_STRING, "itu", NULL);
507       }
508       break;
509
510     case CODEC_ID_H263P:
511       caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-h263",
512           "variant", G_TYPE_STRING, "itu",
513           "h263version", G_TYPE_STRING, "h263p", NULL);
514       if (encode && context) {
515
516         gst_caps_set_simple (caps,
517             "annex-f", G_TYPE_BOOLEAN, context->flags & CODEC_FLAG_4MV,
518             "annex-j", G_TYPE_BOOLEAN, context->flags & CODEC_FLAG_LOOP_FILTER,
519             "annex-i", G_TYPE_BOOLEAN, context->flags & CODEC_FLAG_AC_PRED,
520             "annex-t", G_TYPE_BOOLEAN, context->flags & CODEC_FLAG_AC_PRED,
521             NULL);
522       }
523       break;
524
525     case CODEC_ID_H263I:
526       caps =
527           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-intel-h263",
528           "variant", G_TYPE_STRING, "intel", NULL);
529       break;
530
531     case CODEC_ID_H261:
532       caps =
533           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-h261", NULL);
534       break;
535
536     case CODEC_ID_RV10:
537     case CODEC_ID_RV20:
538     case CODEC_ID_RV30:
539     case CODEC_ID_RV40:
540     {
541       gint version;
542
543       switch (codec_id) {
544         case CODEC_ID_RV40:
545           version = 4;
546           break;
547         case CODEC_ID_RV30:
548           version = 3;
549           break;
550         case CODEC_ID_RV20:
551           version = 2;
552           break;
553         default:
554           version = 1;
555           break;
556       }
557
558       /* FIXME: context->sub_id must be filled in during decoding */
559       caps =
560           gst_ff_vid_caps_new (context, codec_id, encode,
561           "video/x-pn-realvideo", "systemstream", G_TYPE_BOOLEAN, FALSE,
562           "rmversion", G_TYPE_INT, version, NULL);
563       if (context) {
564         gst_caps_set_simple (caps, "format", G_TYPE_INT, context->sub_id, NULL);
565         if (context->extradata_size >= 8) {
566           gst_caps_set_simple (caps,
567               "subformat", G_TYPE_INT, GST_READ_UINT32_BE (context->extradata),
568               NULL);
569         }
570       }
571     }
572       break;
573
574     case CODEC_ID_MP1:
575       /* FIXME: bitrate */
576       caps = gst_ff_aud_caps_new (context, codec_id, encode, "audio/mpeg",
577           "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 1, NULL);
578       break;
579
580     case CODEC_ID_MP2:
581       /* FIXME: bitrate */
582       caps = gst_ff_aud_caps_new (context, codec_id, encode, "audio/mpeg",
583           "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 2, NULL);
584       break;
585
586     case CODEC_ID_MP3:
587       if (encode) {
588         /* FIXME: bitrate */
589         caps = gst_ff_aud_caps_new (context, codec_id, encode, "audio/mpeg",
590             "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, NULL);
591       } else {
592         /* Decodes MPEG-1 layer 1/2/3. Samplerate, channels et al are
593          * in the MPEG audio header, so may be omitted from caps. */
594         caps = gst_caps_new_simple ("audio/mpeg",
595             "mpegversion", G_TYPE_INT, 1,
596             "layer", GST_TYPE_INT_RANGE, 1, 3, NULL);
597       }
598       break;
599
600     case CODEC_ID_MUSEPACK7:
601       caps =
602           gst_ff_aud_caps_new (context, codec_id, encode,
603           "audio/x-ffmpeg-parsed-musepack", "streamversion", G_TYPE_INT, 7,
604           NULL);
605       break;
606
607     case CODEC_ID_MUSEPACK8:
608       caps =
609           gst_ff_aud_caps_new (context, codec_id, encode,
610           "audio/x-ffmpeg-parsed-musepack", "streamversion", G_TYPE_INT, 8,
611           NULL);
612       break;
613
614     case CODEC_ID_AC3:
615       /* FIXME: bitrate */
616       caps =
617           gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-ac3", NULL);
618       break;
619
620     case CODEC_ID_EAC3:
621       /* FIXME: bitrate */
622       caps =
623           gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-eac3", NULL);
624       break;
625
626     case CODEC_ID_TRUEHD:
627       caps =
628           gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-true-hd",
629           NULL);
630       break;
631
632     case CODEC_ID_ATRAC1:
633       caps =
634           gst_ff_aud_caps_new (context, codec_id, encode,
635           "audio/x-vnd.sony.atrac1", NULL);
636       break;
637
638     case CODEC_ID_ATRAC3:
639       caps =
640           gst_ff_aud_caps_new (context, codec_id, encode,
641           "audio/x-vnd.sony.atrac3", NULL);
642       break;
643
644     case CODEC_ID_DTS:
645       caps =
646           gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-dts", NULL);
647       break;
648
649     case CODEC_ID_APE:
650       caps =
651           gst_ff_aud_caps_new (context, codec_id, encode,
652           "audio/x-ffmpeg-parsed-ape", NULL);
653       if (context) {
654         gst_caps_set_simple (caps,
655             "depth", G_TYPE_INT, context->bits_per_coded_sample, NULL);
656       }
657       break;
658
659     case CODEC_ID_MLP:
660       caps =
661           gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-mlp", NULL);
662       break;
663
664     case CODEC_ID_IMC:
665       caps =
666           gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-imc", NULL);
667       break;
668
669       /* MJPEG is normal JPEG, Motion-JPEG and Quicktime MJPEG-A. MJPEGB
670        * is Quicktime's MJPEG-B. LJPEG is lossless JPEG. I don't know what
671        * sp5x is, but it's apparently something JPEG... We don't separate
672        * between those in GStreamer. Should we (at least between MJPEG,
673        * MJPEG-B and sp5x decoding...)? */
674     case CODEC_ID_MJPEG:
675     case CODEC_ID_LJPEG:
676       caps =
677           gst_ff_vid_caps_new (context, codec_id, encode, "image/jpeg", NULL);
678       break;
679
680     case CODEC_ID_SP5X:
681       caps =
682           gst_ff_vid_caps_new (context, codec_id, encode, "video/sp5x", NULL);
683       break;
684
685     case CODEC_ID_MJPEGB:
686       caps =
687           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-mjpeg-b",
688           NULL);
689       break;
690
691     case CODEC_ID_MPEG4:
692       if (encode && context != NULL) {
693         /* I'm not exactly sure what ffmpeg outputs... ffmpeg itself uses
694          * the AVI fourcc 'DIVX', but 'mp4v' for Quicktime... */
695         switch (context->codec_tag) {
696           case GST_MAKE_FOURCC ('D', 'I', 'V', 'X'):
697             caps =
698                 gst_ff_vid_caps_new (context, codec_id, encode, "video/x-divx",
699                 "divxversion", G_TYPE_INT, 5, NULL);
700             break;
701           case GST_MAKE_FOURCC ('m', 'p', '4', 'v'):
702           default:
703             /* FIXME: bitrate */
704             caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/mpeg",
705                 "systemstream", G_TYPE_BOOLEAN, FALSE,
706                 "mpegversion", G_TYPE_INT, 4, NULL);
707             break;
708         }
709       } else {
710         /* The trick here is to separate xvid, divx, mpeg4, 3ivx et al */
711         caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/mpeg",
712             "mpegversion", G_TYPE_INT, 4,
713             "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
714         if (encode) {
715           gst_caps_append (caps, gst_ff_vid_caps_new (context, codec_id, encode,
716                   "video/x-divx", "divxversion", G_TYPE_INT, 5, NULL));
717         } else {
718           gst_caps_append (caps, gst_ff_vid_caps_new (context, codec_id, encode,
719                   "video/x-divx", "divxversion", GST_TYPE_INT_RANGE, 4, 5,
720                   NULL));
721           gst_caps_append (caps, gst_ff_vid_caps_new (context, codec_id, encode,
722                   "video/x-xvid", NULL));
723           gst_caps_append (caps, gst_ff_vid_caps_new (context, codec_id, encode,
724                   "video/x-3ivx", NULL));
725         }
726       }
727       break;
728
729     case CODEC_ID_RAWVIDEO:
730       caps =
731           gst_ffmpeg_codectype_to_caps (AVMEDIA_TYPE_VIDEO, context, codec_id,
732           encode);
733       break;
734
735     case CODEC_ID_MSMPEG4V1:
736     case CODEC_ID_MSMPEG4V2:
737     case CODEC_ID_MSMPEG4V3:
738     {
739       gint version = 41 + codec_id - CODEC_ID_MSMPEG4V1;
740
741       /* encode-FIXME: bitrate */
742       caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-msmpeg",
743           "msmpegversion", G_TYPE_INT, version, NULL);
744       if (!encode && codec_id == CODEC_ID_MSMPEG4V3) {
745         gst_caps_append (caps, gst_ff_vid_caps_new (context, codec_id, encode,
746                 "video/x-divx", "divxversion", G_TYPE_INT, 3, NULL));
747       }
748     }
749       break;
750
751     case CODEC_ID_WMV1:
752     case CODEC_ID_WMV2:
753     {
754       gint version = (codec_id == CODEC_ID_WMV1) ? 1 : 2;
755
756       caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-wmv",
757           "wmvversion", G_TYPE_INT, version, NULL);
758     }
759       break;
760
761     case CODEC_ID_FLV1:
762       caps =
763           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-flash-video",
764           "flvversion", G_TYPE_INT, 1, NULL);
765       break;
766
767     case CODEC_ID_SVQ1:
768       caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-svq",
769           "svqversion", G_TYPE_INT, 1, NULL);
770       break;
771
772     case CODEC_ID_SVQ3:
773       caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-svq",
774           "svqversion", G_TYPE_INT, 3, NULL);
775       break;
776
777     case CODEC_ID_DVAUDIO:
778       caps =
779           gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-dv", NULL);
780       break;
781
782     case CODEC_ID_DVVIDEO:
783     {
784       if (encode && context) {
785         const gchar *format;
786
787         switch (context->pix_fmt) {
788           case PIX_FMT_YUYV422:
789             format = "YUY2";
790             break;
791           case PIX_FMT_YUV420P:
792             format = "I420";
793             break;
794           case PIX_FMT_YUVA420P:
795             format = "A420";
796             break;
797           case PIX_FMT_YUV411P:
798             format = "Y41B";
799             break;
800           case PIX_FMT_YUV422P:
801             format = "Y42B";
802             break;
803           case PIX_FMT_YUV410P:
804             format = "YUV9";
805             break;
806           default:
807             GST_WARNING
808                 ("Couldnt' find format for pixfmt %d, defaulting to I420",
809                 context->pix_fmt);
810             format = "I420";
811             break;
812         }
813         caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-dv",
814             "systemstream", G_TYPE_BOOLEAN, FALSE,
815             "format", G_TYPE_STRING, format, NULL);
816       } else {
817         caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-dv",
818             "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
819       }
820     }
821       break;
822
823     case CODEC_ID_WMAV1:
824     case CODEC_ID_WMAV2:
825     {
826       gint version = (codec_id == CODEC_ID_WMAV1) ? 1 : 2;
827
828       if (context) {
829         caps = gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-wma",
830             "wmaversion", G_TYPE_INT, version,
831             "block_align", G_TYPE_INT, context->block_align,
832             "bitrate", G_TYPE_INT, context->bit_rate, NULL);
833       } else {
834         caps = gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-wma",
835             "wmaversion", G_TYPE_INT, version,
836             "block_align", GST_TYPE_INT_RANGE, 0, G_MAXINT,
837             "bitrate", GST_TYPE_INT_RANGE, 0, G_MAXINT, NULL);
838       }
839     }
840       break;
841     case CODEC_ID_WMAPRO:
842     {
843       caps = gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-wma",
844           "wmaversion", G_TYPE_INT, 3, NULL);
845       break;
846     }
847
848     case CODEC_ID_WMAVOICE:
849     {
850       caps =
851           gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-wms", NULL);
852       break;
853     }
854
855     case CODEC_ID_MACE3:
856     case CODEC_ID_MACE6:
857     {
858       gint version = (codec_id == CODEC_ID_MACE3) ? 3 : 6;
859
860       caps = gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-mace",
861           "maceversion", G_TYPE_INT, version, NULL);
862     }
863       break;
864
865     case CODEC_ID_HUFFYUV:
866       caps =
867           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-huffyuv",
868           NULL);
869       if (context) {
870         gst_caps_set_simple (caps,
871             "bpp", G_TYPE_INT, context->bits_per_coded_sample, NULL);
872       }
873       break;
874
875     case CODEC_ID_CYUV:
876       caps =
877           gst_ff_vid_caps_new (context, codec_id, encode,
878           "video/x-compressed-yuv", NULL);
879       break;
880
881     case CODEC_ID_H264:
882       caps =
883           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-h264",
884           "alignment", G_TYPE_STRING, "au", NULL);
885       break;
886
887     case CODEC_ID_INDEO5:
888       caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-indeo",
889           "indeoversion", G_TYPE_INT, 5, NULL);
890       break;
891
892     case CODEC_ID_INDEO4:
893       caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-indeo",
894           "indeoversion", G_TYPE_INT, 4, NULL);
895       break;
896
897     case CODEC_ID_INDEO3:
898       caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-indeo",
899           "indeoversion", G_TYPE_INT, 3, NULL);
900       break;
901
902     case CODEC_ID_INDEO2:
903       caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-indeo",
904           "indeoversion", G_TYPE_INT, 2, NULL);
905       break;
906
907     case CODEC_ID_FLASHSV:
908       caps =
909           gst_ff_vid_caps_new (context, codec_id, encode,
910           "video/x-flash-screen", NULL);
911       break;
912
913     case CODEC_ID_VP3:
914       caps =
915           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-vp3", NULL);
916       break;
917
918     case CODEC_ID_VP5:
919       caps =
920           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-vp5", NULL);
921       break;
922
923     case CODEC_ID_VP6:
924       caps =
925           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-vp6", NULL);
926       break;
927
928     case CODEC_ID_VP6F:
929       caps =
930           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-vp6-flash",
931           NULL);
932       break;
933
934     case CODEC_ID_VP6A:
935       caps =
936           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-vp6-alpha",
937           NULL);
938       break;
939
940     case CODEC_ID_VP8:
941       caps =
942           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-vp8", NULL);
943       break;
944
945     case CODEC_ID_THEORA:
946       caps =
947           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-theora",
948           NULL);
949       break;
950
951     case CODEC_ID_AAC:
952     {
953       caps =
954           gst_ff_aud_caps_new (context, codec_id, encode, "audio/mpeg", NULL);
955
956       if (!encode) {
957         GValue arr = { 0, };
958         GValue item = { 0, };
959
960         g_value_init (&arr, GST_TYPE_LIST);
961         g_value_init (&item, G_TYPE_INT);
962         g_value_set_int (&item, 2);
963         gst_value_list_append_value (&arr, &item);
964         g_value_set_int (&item, 4);
965         gst_value_list_append_value (&arr, &item);
966         g_value_unset (&item);
967
968         gst_caps_set_value (caps, "mpegversion", &arr);
969         g_value_unset (&arr);
970
971         g_value_init (&arr, GST_TYPE_LIST);
972         g_value_init (&item, G_TYPE_STRING);
973         g_value_set_string (&item, "raw");
974         gst_value_list_append_value (&arr, &item);
975         g_value_set_string (&item, "adts");
976         gst_value_list_append_value (&arr, &item);
977         g_value_set_string (&item, "adif");
978         gst_value_list_append_value (&arr, &item);
979         g_value_unset (&item);
980
981         gst_caps_set_value (caps, "stream-format", &arr);
982         g_value_unset (&arr);
983       } else {
984         gst_caps_set_simple (caps, "mpegversion", G_TYPE_INT, 4,
985             "stream-format", G_TYPE_STRING, "raw",
986             "base-profile", G_TYPE_STRING, "lc", NULL);
987
988         if (context && context->extradata_size > 0)
989           gst_codec_utils_aac_caps_set_level_and_profile (caps,
990               context->extradata, context->extradata_size);
991       }
992
993       break;
994     }
995     case CODEC_ID_AAC_LATM:    /* LATM/LOAS AAC syntax */
996       caps = gst_ff_aud_caps_new (context, codec_id, encode, "audio/mpeg",
997           "mpegversion", G_TYPE_INT, 4, "stream-format", G_TYPE_STRING, "loas",
998           NULL);
999       break;
1000
1001     case CODEC_ID_ASV1:
1002       caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-asus",
1003           "asusversion", G_TYPE_INT, 1, NULL);
1004       break;
1005     case CODEC_ID_ASV2:
1006       caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-asus",
1007           "asusversion", G_TYPE_INT, 2, NULL);
1008       break;
1009
1010     case CODEC_ID_FFV1:
1011       caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-ffv",
1012           "ffvversion", G_TYPE_INT, 1, NULL);
1013       break;
1014
1015     case CODEC_ID_4XM:
1016       caps =
1017           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-4xm", NULL);
1018       break;
1019
1020     case CODEC_ID_XAN_WC3:
1021     case CODEC_ID_XAN_WC4:
1022       caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-xan",
1023           "wcversion", G_TYPE_INT, 3 - CODEC_ID_XAN_WC3 + codec_id, NULL);
1024       break;
1025
1026     case CODEC_ID_CLJR:
1027       caps =
1028           gst_ff_vid_caps_new (context, codec_id, encode,
1029           "video/x-cirrus-logic-accupak", NULL);
1030       break;
1031
1032     case CODEC_ID_FRAPS:
1033       caps =
1034           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-fraps",
1035           NULL);
1036       break;
1037
1038     case CODEC_ID_MDEC:
1039     case CODEC_ID_ROQ:
1040     case CODEC_ID_INTERPLAY_VIDEO:
1041       buildcaps = TRUE;
1042       break;
1043
1044     case CODEC_ID_VCR1:
1045       caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-ati-vcr",
1046           "vcrversion", G_TYPE_INT, 1, NULL);
1047       break;
1048
1049     case CODEC_ID_RPZA:
1050       caps =
1051           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-apple-video",
1052           NULL);
1053       break;
1054
1055     case CODEC_ID_CINEPAK:
1056       caps =
1057           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-cinepak",
1058           NULL);
1059       break;
1060
1061       /* WS_VQA belogns here (order) */
1062
1063     case CODEC_ID_MSRLE:
1064       caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-rle",
1065           "layout", G_TYPE_STRING, "microsoft", NULL);
1066       if (context) {
1067         gst_caps_set_simple (caps,
1068             "depth", G_TYPE_INT, (gint) context->bits_per_coded_sample, NULL);
1069       } else {
1070         gst_caps_set_simple (caps, "depth", GST_TYPE_INT_RANGE, 1, 64, NULL);
1071       }
1072       break;
1073
1074     case CODEC_ID_QTRLE:
1075       caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-rle",
1076           "layout", G_TYPE_STRING, "quicktime", NULL);
1077       if (context) {
1078         gst_caps_set_simple (caps,
1079             "depth", G_TYPE_INT, (gint) context->bits_per_coded_sample, NULL);
1080       } else {
1081         gst_caps_set_simple (caps, "depth", GST_TYPE_INT_RANGE, 1, 64, NULL);
1082       }
1083       break;
1084
1085     case CODEC_ID_MSVIDEO1:
1086       caps =
1087           gst_ff_vid_caps_new (context, codec_id, encode,
1088           "video/x-msvideocodec", "msvideoversion", G_TYPE_INT, 1, NULL);
1089       break;
1090
1091     case CODEC_ID_WMV3:
1092       caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-wmv",
1093           "wmvversion", G_TYPE_INT, 3, NULL);
1094       break;
1095     case CODEC_ID_VC1:
1096       caps = gst_ff_vid_caps_new (context, codec_id, encode, "video/x-wmv",
1097           "wmvversion", G_TYPE_INT, 3, "format", G_TYPE_STRING, "WVC1", NULL);
1098       break;
1099     case CODEC_ID_QDM2:
1100       caps =
1101           gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-qdm2", NULL);
1102       break;
1103
1104     case CODEC_ID_MSZH:
1105       caps =
1106           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-mszh", NULL);
1107       break;
1108
1109     case CODEC_ID_ZLIB:
1110       caps =
1111           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-zlib", NULL);
1112       break;
1113
1114     case CODEC_ID_TRUEMOTION1:
1115       caps =
1116           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-truemotion",
1117           "trueversion", G_TYPE_INT, 1, NULL);
1118       break;
1119     case CODEC_ID_TRUEMOTION2:
1120       caps =
1121           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-truemotion",
1122           "trueversion", G_TYPE_INT, 2, NULL);
1123       break;
1124
1125     case CODEC_ID_ULTI:
1126       caps =
1127           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-ultimotion",
1128           NULL);
1129       break;
1130
1131     case CODEC_ID_TSCC:
1132       caps =
1133           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-camtasia",
1134           NULL);
1135       if (context) {
1136         gst_caps_set_simple (caps,
1137             "depth", G_TYPE_INT, (gint) context->bits_per_coded_sample, NULL);
1138       } else {
1139         gst_caps_set_simple (caps, "depth", GST_TYPE_INT_RANGE, 8, 32, NULL);
1140       }
1141       break;
1142
1143     case CODEC_ID_KMVC:
1144       caps =
1145           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-kmvc", NULL);
1146       break;
1147
1148     case CODEC_ID_NUV:
1149       caps =
1150           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-nuv", NULL);
1151       break;
1152
1153     case CODEC_ID_GIF:
1154       caps = gst_ff_vid_caps_new (context, codec_id, encode, "image/gif", NULL);
1155       break;
1156
1157     case CODEC_ID_PNG:
1158       caps = gst_ff_vid_caps_new (context, codec_id, encode, "image/png", NULL);
1159       break;
1160
1161     case CODEC_ID_PPM:
1162       caps = gst_ff_vid_caps_new (context, codec_id, encode, "image/ppm", NULL);
1163       break;
1164
1165     case CODEC_ID_PBM:
1166       caps = gst_ff_vid_caps_new (context, codec_id, encode, "image/pbm", NULL);
1167       break;
1168
1169     case CODEC_ID_PAM:
1170       caps =
1171           gst_ff_vid_caps_new (context, codec_id, encode,
1172           "image/x-portable-anymap", NULL);
1173       break;
1174
1175     case CODEC_ID_PGM:
1176       caps =
1177           gst_ff_vid_caps_new (context, codec_id, encode,
1178           "image/x-portable-graymap", NULL);
1179       break;
1180
1181     case CODEC_ID_PCX:
1182       caps =
1183           gst_ff_vid_caps_new (context, codec_id, encode, "image/x-pcx", NULL);
1184       break;
1185
1186     case CODEC_ID_SGI:
1187       caps =
1188           gst_ff_vid_caps_new (context, codec_id, encode, "image/x-sgi", NULL);
1189       break;
1190
1191     case CODEC_ID_TARGA:
1192       caps =
1193           gst_ff_vid_caps_new (context, codec_id, encode, "image/x-tga", NULL);
1194       break;
1195
1196     case CODEC_ID_TIFF:
1197       caps =
1198           gst_ff_vid_caps_new (context, codec_id, encode, "image/tiff", NULL);
1199       break;
1200
1201     case CODEC_ID_SUNRAST:
1202       caps =
1203           gst_ff_vid_caps_new (context, codec_id, encode, "image/x-sun-raster",
1204           NULL);
1205       break;
1206
1207     case CODEC_ID_SMC:
1208       caps =
1209           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-smc", NULL);
1210       break;
1211
1212     case CODEC_ID_QDRAW:
1213       caps =
1214           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-qdrw", NULL);
1215       break;
1216
1217     case CODEC_ID_DNXHD:
1218       caps =
1219           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-dnxhd",
1220           NULL);
1221       break;
1222
1223     case CODEC_ID_PRORES:
1224       caps =
1225           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-prores",
1226           NULL);
1227       break;
1228
1229     case CODEC_ID_MIMIC:
1230       caps =
1231           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-mimic",
1232           NULL);
1233       break;
1234
1235     case CODEC_ID_VMNC:
1236       caps =
1237           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-vmnc", NULL);
1238       break;
1239
1240     case CODEC_ID_TRUESPEECH:
1241       caps =
1242           gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-truespeech",
1243           NULL);
1244       break;
1245
1246     case CODEC_ID_QCELP:
1247       caps =
1248           gst_ff_aud_caps_new (context, codec_id, encode, "audio/qcelp", NULL);
1249       break;
1250
1251     case CODEC_ID_AMV:
1252       caps =
1253           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-amv", NULL);
1254       break;
1255
1256     case CODEC_ID_AASC:
1257       caps =
1258           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-aasc", NULL);
1259       break;
1260
1261     case CODEC_ID_LOCO:
1262       caps =
1263           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-loco", NULL);
1264       break;
1265
1266     case CODEC_ID_ZMBV:
1267       caps =
1268           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-zmbv", NULL);
1269       break;
1270
1271     case CODEC_ID_LAGARITH:
1272       caps =
1273           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-lagarith",
1274           NULL);
1275       break;
1276
1277     case CODEC_ID_CSCD:
1278       caps =
1279           gst_ff_vid_caps_new (context, codec_id, encode, "video/x-camstudio",
1280           NULL);
1281       if (context) {
1282         gst_caps_set_simple (caps,
1283             "depth", G_TYPE_INT, (gint) context->bits_per_coded_sample, NULL);
1284       } else {
1285         gst_caps_set_simple (caps, "depth", GST_TYPE_INT_RANGE, 8, 32, NULL);
1286       }
1287       break;
1288
1289     case CODEC_ID_WS_VQA:
1290     case CODEC_ID_IDCIN:
1291     case CODEC_ID_8BPS:
1292     case CODEC_ID_FLIC:
1293     case CODEC_ID_VMDVIDEO:
1294     case CODEC_ID_VMDAUDIO:
1295     case CODEC_ID_SNOW:
1296     case CODEC_ID_VIXL:
1297     case CODEC_ID_QPEG:
1298     case CODEC_ID_PGMYUV:
1299     case CODEC_ID_FFVHUFF:
1300     case CODEC_ID_WNV1:
1301     case CODEC_ID_MP3ADU:
1302     case CODEC_ID_MP3ON4:
1303     case CODEC_ID_WESTWOOD_SND1:
1304     case CODEC_ID_MMVIDEO:
1305     case CODEC_ID_AVS:
1306     case CODEC_ID_CAVS:
1307       buildcaps = TRUE;
1308       break;
1309
1310       /* weird quasi-codecs for the demuxers only */
1311     case CODEC_ID_PCM_S16LE:
1312     case CODEC_ID_PCM_S16BE:
1313     case CODEC_ID_PCM_U16LE:
1314     case CODEC_ID_PCM_U16BE:
1315     case CODEC_ID_PCM_S8:
1316     case CODEC_ID_PCM_U8:
1317     {
1318       GstAudioFormat format;
1319
1320       switch (codec_id) {
1321         case CODEC_ID_PCM_S16LE:
1322           format = GST_AUDIO_FORMAT_S16LE;
1323           break;
1324         case CODEC_ID_PCM_S16BE:
1325           format = GST_AUDIO_FORMAT_S16BE;
1326           break;
1327         case CODEC_ID_PCM_U16LE:
1328           format = GST_AUDIO_FORMAT_U16LE;
1329           break;
1330         case CODEC_ID_PCM_U16BE:
1331           format = GST_AUDIO_FORMAT_U16BE;
1332           break;
1333         case CODEC_ID_PCM_S8:
1334           format = GST_AUDIO_FORMAT_S8;
1335           break;
1336         case CODEC_ID_PCM_U8:
1337           format = GST_AUDIO_FORMAT_U8;
1338           break;
1339         default:
1340           g_assert (0);         /* don't worry, we never get here */
1341           break;
1342       }
1343
1344       caps = gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-raw",
1345           "format", G_TYPE_STRING, gst_audio_format_to_string (format),
1346           "layout", G_TYPE_STRING, "interleaved", NULL);
1347     }
1348       break;
1349
1350     case CODEC_ID_PCM_MULAW:
1351       caps =
1352           gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-mulaw",
1353           NULL);
1354       break;
1355
1356     case CODEC_ID_PCM_ALAW:
1357       caps =
1358           gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-alaw", NULL);
1359       break;
1360
1361     case CODEC_ID_ADPCM_G722:
1362       caps =
1363           gst_ff_aud_caps_new (context, codec_id, encode, "audio/G722", NULL);
1364       if (context)
1365         gst_caps_set_simple (caps,
1366             "block_align", G_TYPE_INT, context->block_align,
1367             "bitrate", G_TYPE_INT, context->bit_rate, NULL);
1368       break;
1369
1370     case CODEC_ID_ADPCM_G726:
1371     {
1372       /* the G726 decoder can also handle G721 */
1373       caps = gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-adpcm",
1374           "layout", G_TYPE_STRING, "g726", NULL);
1375       if (context)
1376         gst_caps_set_simple (caps,
1377             "block_align", G_TYPE_INT, context->block_align,
1378             "bitrate", G_TYPE_INT, context->bit_rate, NULL);
1379
1380       if (!encode) {
1381         gst_caps_append (caps, gst_caps_new_simple ("audio/x-adpcm",
1382                 "layout", G_TYPE_STRING, "g721",
1383                 "channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, 8000, NULL));
1384       }
1385       break;
1386     }
1387     case CODEC_ID_ADPCM_IMA_QT:
1388     case CODEC_ID_ADPCM_IMA_WAV:
1389     case CODEC_ID_ADPCM_IMA_DK3:
1390     case CODEC_ID_ADPCM_IMA_DK4:
1391     case CODEC_ID_ADPCM_IMA_WS:
1392     case CODEC_ID_ADPCM_IMA_SMJPEG:
1393     case CODEC_ID_ADPCM_IMA_AMV:
1394     case CODEC_ID_ADPCM_IMA_ISS:
1395     case CODEC_ID_ADPCM_IMA_EA_EACS:
1396     case CODEC_ID_ADPCM_IMA_EA_SEAD:
1397     case CODEC_ID_ADPCM_MS:
1398     case CODEC_ID_ADPCM_4XM:
1399     case CODEC_ID_ADPCM_XA:
1400     case CODEC_ID_ADPCM_ADX:
1401     case CODEC_ID_ADPCM_EA:
1402     case CODEC_ID_ADPCM_CT:
1403     case CODEC_ID_ADPCM_SWF:
1404     case CODEC_ID_ADPCM_YAMAHA:
1405     case CODEC_ID_ADPCM_SBPRO_2:
1406     case CODEC_ID_ADPCM_SBPRO_3:
1407     case CODEC_ID_ADPCM_SBPRO_4:
1408     case CODEC_ID_ADPCM_EA_R1:
1409     case CODEC_ID_ADPCM_EA_R2:
1410     case CODEC_ID_ADPCM_EA_R3:
1411     case CODEC_ID_ADPCM_EA_MAXIS_XA:
1412     case CODEC_ID_ADPCM_EA_XAS:
1413     case CODEC_ID_ADPCM_THP:
1414     {
1415       const gchar *layout = NULL;
1416
1417       switch (codec_id) {
1418         case CODEC_ID_ADPCM_IMA_QT:
1419           layout = "quicktime";
1420           break;
1421         case CODEC_ID_ADPCM_IMA_WAV:
1422           layout = "dvi";
1423           break;
1424         case CODEC_ID_ADPCM_IMA_DK3:
1425           layout = "dk3";
1426           break;
1427         case CODEC_ID_ADPCM_IMA_DK4:
1428           layout = "dk4";
1429           break;
1430         case CODEC_ID_ADPCM_IMA_WS:
1431           layout = "westwood";
1432           break;
1433         case CODEC_ID_ADPCM_IMA_SMJPEG:
1434           layout = "smjpeg";
1435           break;
1436         case CODEC_ID_ADPCM_IMA_AMV:
1437           layout = "amv";
1438           break;
1439         case CODEC_ID_ADPCM_IMA_ISS:
1440           layout = "iss";
1441           break;
1442         case CODEC_ID_ADPCM_IMA_EA_EACS:
1443           layout = "ea-eacs";
1444           break;
1445         case CODEC_ID_ADPCM_IMA_EA_SEAD:
1446           layout = "ea-sead";
1447           break;
1448         case CODEC_ID_ADPCM_MS:
1449           layout = "microsoft";
1450           break;
1451         case CODEC_ID_ADPCM_4XM:
1452           layout = "4xm";
1453           break;
1454         case CODEC_ID_ADPCM_XA:
1455           layout = "xa";
1456           break;
1457         case CODEC_ID_ADPCM_ADX:
1458           layout = "adx";
1459           break;
1460         case CODEC_ID_ADPCM_EA:
1461           layout = "ea";
1462           break;
1463         case CODEC_ID_ADPCM_CT:
1464           layout = "ct";
1465           break;
1466         case CODEC_ID_ADPCM_SWF:
1467           layout = "swf";
1468           break;
1469         case CODEC_ID_ADPCM_YAMAHA:
1470           layout = "yamaha";
1471           break;
1472         case CODEC_ID_ADPCM_SBPRO_2:
1473           layout = "sbpro2";
1474           break;
1475         case CODEC_ID_ADPCM_SBPRO_3:
1476           layout = "sbpro3";
1477           break;
1478         case CODEC_ID_ADPCM_SBPRO_4:
1479           layout = "sbpro4";
1480           break;
1481         case CODEC_ID_ADPCM_EA_R1:
1482           layout = "ea-r1";
1483           break;
1484         case CODEC_ID_ADPCM_EA_R2:
1485           layout = "ea-r3";
1486           break;
1487         case CODEC_ID_ADPCM_EA_R3:
1488           layout = "ea-r3";
1489           break;
1490         case CODEC_ID_ADPCM_EA_MAXIS_XA:
1491           layout = "ea-maxis-xa";
1492           break;
1493         case CODEC_ID_ADPCM_EA_XAS:
1494           layout = "ea-xas";
1495           break;
1496         case CODEC_ID_ADPCM_THP:
1497           layout = "thp";
1498           break;
1499         default:
1500           g_assert (0);         /* don't worry, we never get here */
1501           break;
1502       }
1503
1504       /* FIXME: someone please check whether we need additional properties
1505        * in this caps definition. */
1506       caps = gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-adpcm",
1507           "layout", G_TYPE_STRING, layout, NULL);
1508       if (context)
1509         gst_caps_set_simple (caps,
1510             "block_align", G_TYPE_INT, context->block_align,
1511             "bitrate", G_TYPE_INT, context->bit_rate, NULL);
1512     }
1513       break;
1514
1515     case CODEC_ID_AMR_NB:
1516       caps = gst_ff_aud_caps_new (context, codec_id, encode, "audio/AMR", NULL);
1517       break;
1518
1519     case CODEC_ID_AMR_WB:
1520       caps =
1521           gst_ff_aud_caps_new (context, codec_id, encode, "audio/AMR-WB", NULL);
1522       break;
1523
1524     case CODEC_ID_GSM:
1525       caps =
1526           gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-gsm", NULL);
1527       break;
1528
1529     case CODEC_ID_GSM_MS:
1530       caps =
1531           gst_ff_aud_caps_new (context, codec_id, encode, "audio/ms-gsm", NULL);
1532       break;
1533
1534     case CODEC_ID_NELLYMOSER:
1535       caps =
1536           gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-nellymoser",
1537           NULL);
1538       break;
1539
1540     case CODEC_ID_SIPR:
1541     {
1542       caps =
1543           gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-sipro",
1544           NULL);
1545       if (context) {
1546         gst_caps_set_simple (caps,
1547             "leaf_size", G_TYPE_INT, context->block_align,
1548             "bitrate", G_TYPE_INT, context->bit_rate, NULL);
1549       }
1550     }
1551       break;
1552
1553     case CODEC_ID_RA_144:
1554     case CODEC_ID_RA_288:
1555     case CODEC_ID_COOK:
1556     {
1557       gint version = 0;
1558
1559       switch (codec_id) {
1560         case CODEC_ID_RA_144:
1561           version = 1;
1562           break;
1563         case CODEC_ID_RA_288:
1564           version = 2;
1565           break;
1566         case CODEC_ID_COOK:
1567           version = 8;
1568           break;
1569         default:
1570           break;
1571       }
1572
1573       /* FIXME: properties? */
1574       caps =
1575           gst_ff_aud_caps_new (context, codec_id, encode,
1576           "audio/x-pn-realaudio", "raversion", G_TYPE_INT, version, NULL);
1577       if (context) {
1578         gst_caps_set_simple (caps,
1579             "leaf_size", G_TYPE_INT, context->block_align,
1580             "bitrate", G_TYPE_INT, context->bit_rate, NULL);
1581       }
1582     }
1583       break;
1584
1585     case CODEC_ID_ROQ_DPCM:
1586     case CODEC_ID_INTERPLAY_DPCM:
1587     case CODEC_ID_XAN_DPCM:
1588     case CODEC_ID_SOL_DPCM:
1589     {
1590       const gchar *layout = NULL;
1591
1592       switch (codec_id) {
1593         case CODEC_ID_ROQ_DPCM:
1594           layout = "roq";
1595           break;
1596         case CODEC_ID_INTERPLAY_DPCM:
1597           layout = "interplay";
1598           break;
1599         case CODEC_ID_XAN_DPCM:
1600           layout = "xan";
1601           break;
1602         case CODEC_ID_SOL_DPCM:
1603           layout = "sol";
1604           break;
1605         default:
1606           g_assert (0);         /* don't worry, we never get here */
1607           break;
1608       }
1609
1610       /* FIXME: someone please check whether we need additional properties
1611        * in this caps definition. */
1612       caps = gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-dpcm",
1613           "layout", G_TYPE_STRING, layout, NULL);
1614       if (context)
1615         gst_caps_set_simple (caps,
1616             "block_align", G_TYPE_INT, context->block_align,
1617             "bitrate", G_TYPE_INT, context->bit_rate, NULL);
1618     }
1619       break;
1620
1621     case CODEC_ID_SHORTEN:
1622       caps = gst_caps_new_empty_simple ("audio/x-shorten");
1623       break;
1624
1625     case CODEC_ID_ALAC:
1626       caps =
1627           gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-alac", NULL);
1628       if (context) {
1629         gst_caps_set_simple (caps,
1630             "samplesize", G_TYPE_INT, context->bits_per_coded_sample, NULL);
1631       }
1632       break;
1633
1634     case CODEC_ID_FLAC:
1635       /* Note that ffmpeg has no encoder yet, but just for safety. In the
1636        * encoder case, we want to add things like samplerate, channels... */
1637       if (!encode) {
1638         caps = gst_caps_new_empty_simple ("audio/x-flac");
1639       }
1640       break;
1641
1642     case CODEC_ID_DVD_SUBTITLE:
1643     case CODEC_ID_DVB_SUBTITLE:
1644       caps = NULL;
1645       break;
1646     case CODEC_ID_BMP:
1647       caps = gst_caps_new_empty_simple ("image/bmp");
1648       break;
1649     case CODEC_ID_TTA:
1650       caps =
1651           gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-tta", NULL);
1652       if (context) {
1653         gst_caps_set_simple (caps,
1654             "samplesize", G_TYPE_INT, context->bits_per_coded_sample, NULL);
1655       }
1656       break;
1657     case CODEC_ID_TWINVQ:
1658       caps =
1659           gst_ff_aud_caps_new (context, codec_id, encode, "audio/x-twin-vq",
1660           NULL);
1661       break;
1662     default:
1663       GST_DEBUG ("Unknown codec ID %d, please add mapping here", codec_id);
1664       break;
1665   }
1666
1667   if (buildcaps) {
1668     AVCodec *codec;
1669
1670     if ((codec = avcodec_find_decoder (codec_id)) ||
1671         (codec = avcodec_find_encoder (codec_id))) {
1672       gchar *mime = NULL;
1673
1674       GST_LOG ("Could not create stream format caps for %s", codec->name);
1675
1676       switch (codec->type) {
1677         case AVMEDIA_TYPE_VIDEO:
1678           mime = g_strdup_printf ("video/x-gst-av-%s", codec->name);
1679           caps = gst_ff_vid_caps_new (context, codec_id, encode, mime, NULL);
1680           g_free (mime);
1681           break;
1682         case AVMEDIA_TYPE_AUDIO:
1683           mime = g_strdup_printf ("audio/x-gst-av-%s", codec->name);
1684           caps = gst_ff_aud_caps_new (context, codec_id, encode, mime, NULL);
1685           if (context)
1686             gst_caps_set_simple (caps,
1687                 "block_align", G_TYPE_INT, context->block_align,
1688                 "bitrate", G_TYPE_INT, context->bit_rate, NULL);
1689           g_free (mime);
1690           break;
1691         default:
1692           break;
1693       }
1694     }
1695   }
1696
1697   if (caps != NULL) {
1698
1699     /* set private data */
1700     if (context && context->extradata_size > 0) {
1701       GstBuffer *data = gst_buffer_new_and_alloc (context->extradata_size);
1702
1703       gst_buffer_fill (data, 0, context->extradata, context->extradata_size);
1704       gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, data, NULL);
1705       gst_buffer_unref (data);
1706     }
1707
1708     GST_LOG ("caps for codec_id=%d: %" GST_PTR_FORMAT, codec_id, caps);
1709
1710   } else {
1711     GST_LOG ("No caps found for codec_id=%d", codec_id);
1712   }
1713
1714   return caps;
1715 }
1716
1717 /* Convert a FFMPEG Pixel Format and optional AVCodecContext
1718  * to a GstCaps. If the context is ommitted, no fixed values
1719  * for video/audio size will be included in the GstCaps
1720  *
1721  * See below for usefullness
1722  */
1723
1724 GstCaps *
1725 gst_ffmpeg_pixfmt_to_caps (enum PixelFormat pix_fmt, AVCodecContext * context,
1726     enum CodecID codec_id)
1727 {
1728   GstCaps *caps = NULL;
1729   GstVideoFormat format;
1730
1731   format = gst_ffmpeg_pixfmt_to_videoformat (pix_fmt);
1732
1733   if (format != GST_VIDEO_FORMAT_UNKNOWN) {
1734     caps = gst_ff_vid_caps_new (context, codec_id, TRUE, "video/x-raw",
1735         "format", G_TYPE_STRING, gst_video_format_to_string (format), NULL);
1736   }
1737
1738   if (caps != NULL) {
1739     GST_DEBUG ("caps for pix_fmt=%d: %" GST_PTR_FORMAT, pix_fmt, caps);
1740   } else {
1741     GST_LOG ("No caps found for pix_fmt=%d", pix_fmt);
1742   }
1743
1744   return caps;
1745 }
1746
1747 GstAudioFormat
1748 gst_ffmpeg_smpfmt_to_audioformat (enum AVSampleFormat sample_fmt)
1749 {
1750   sample_fmt = av_get_packed_sample_fmt (sample_fmt);
1751
1752   switch (sample_fmt) {
1753     case AV_SAMPLE_FMT_S16:
1754       return GST_AUDIO_FORMAT_S16;
1755       break;
1756     case AV_SAMPLE_FMT_S32:
1757       return GST_AUDIO_FORMAT_S32;
1758       break;
1759     case AV_SAMPLE_FMT_FLT:
1760       return GST_AUDIO_FORMAT_F32;
1761       break;
1762     case AV_SAMPLE_FMT_DBL:
1763       return GST_AUDIO_FORMAT_F64;
1764       break;
1765     default:
1766       /* .. */
1767       return GST_AUDIO_FORMAT_UNKNOWN;
1768       break;
1769   }
1770 }
1771
1772 /* Convert a FFMPEG Sample Format and optional AVCodecContext
1773  * to a GstCaps. If the context is ommitted, no fixed values
1774  * for video/audio size will be included in the GstCaps
1775  *
1776  * See below for usefullness
1777  */
1778
1779 static GstCaps *
1780 gst_ffmpeg_smpfmt_to_caps (enum AVSampleFormat sample_fmt,
1781     AVCodecContext * context, enum CodecID codec_id)
1782 {
1783   GstCaps *caps = NULL;
1784   GstAudioFormat format;
1785
1786   format = gst_ffmpeg_smpfmt_to_audioformat (sample_fmt);
1787
1788   if (format != GST_AUDIO_FORMAT_UNKNOWN) {
1789     caps = gst_ff_aud_caps_new (context, codec_id, TRUE, "audio/x-raw",
1790         "format", G_TYPE_STRING, gst_audio_format_to_string (format),
1791         "layout", G_TYPE_STRING, "interleaved", NULL);
1792     GST_LOG ("caps for sample_fmt=%d: %" GST_PTR_FORMAT, sample_fmt, caps);
1793   } else {
1794     GST_LOG ("No caps found for sample_fmt=%d", sample_fmt);
1795   }
1796
1797   return caps;
1798 }
1799
1800 GstCaps *
1801 gst_ffmpeg_codectype_to_audio_caps (AVCodecContext * context,
1802     enum CodecID codec_id, gboolean encode, AVCodec * codec)
1803 {
1804   GstCaps *caps = NULL;
1805
1806   GST_DEBUG ("context:%p, codec_id:%d, encode:%d, codec:%p",
1807       context, codec_id, encode, codec);
1808   if (codec)
1809     GST_DEBUG ("sample_fmts:%p, samplerates:%p",
1810         codec->sample_fmts, codec->supported_samplerates);
1811
1812   if (context) {
1813     /* Specific codec context */
1814     caps = gst_ffmpeg_smpfmt_to_caps (context->sample_fmt, context, codec_id);
1815   } else if (codec && codec->sample_fmts) {
1816     GstCaps *temp;
1817     int i;
1818
1819     caps = gst_caps_new_empty ();
1820     for (i = 0; codec->sample_fmts[i] != -1; i++) {
1821       temp =
1822           gst_ffmpeg_smpfmt_to_caps (codec->sample_fmts[i], context, codec_id);
1823       if (temp != NULL)
1824         gst_caps_append (caps, temp);
1825     }
1826   } else {
1827     GstCaps *temp;
1828     enum AVSampleFormat i;
1829     AVCodecContext ctx = { 0, };
1830
1831     ctx.channels = -1;
1832     caps = gst_caps_new_empty ();
1833     for (i = 0; i <= AV_SAMPLE_FMT_DBL; i++) {
1834       temp = gst_ffmpeg_smpfmt_to_caps (i, encode ? &ctx : NULL, codec_id);
1835       if (temp != NULL) {
1836         gst_caps_append (caps, temp);
1837       }
1838     }
1839   }
1840   return caps;
1841 }
1842
1843 GstCaps *
1844 gst_ffmpeg_codectype_to_video_caps (AVCodecContext * context,
1845     enum CodecID codec_id, gboolean encode, AVCodec * codec)
1846 {
1847   GstCaps *caps;
1848
1849   GST_LOG ("context:%p, codec_id:%d, encode:%d, codec:%p",
1850       context, codec_id, encode, codec);
1851
1852   if (context) {
1853     caps = gst_ffmpeg_pixfmt_to_caps (context->pix_fmt, context, codec_id);
1854   } else {
1855     GstCaps *temp;
1856     enum PixelFormat i;
1857     AVCodecContext ctx = { 0, };
1858
1859     caps = gst_caps_new_empty ();
1860     for (i = 0; i < PIX_FMT_NB; i++) {
1861       ctx.width = -1;
1862       ctx.pix_fmt = i;
1863       temp = gst_ffmpeg_pixfmt_to_caps (i, encode ? &ctx : NULL, codec_id);
1864       if (temp != NULL) {
1865         gst_caps_append (caps, temp);
1866       }
1867     }
1868   }
1869   return caps;
1870 }
1871
1872 /* Convert a FFMPEG codec Type and optional AVCodecContext
1873  * to a GstCaps. If the context is ommitted, no fixed values
1874  * for video/audio size will be included in the GstCaps
1875  *
1876  * AVMediaType is primarily meant for uncompressed data GstCaps!
1877  */
1878
1879 GstCaps *
1880 gst_ffmpeg_codectype_to_caps (enum AVMediaType codec_type,
1881     AVCodecContext * context, enum CodecID codec_id, gboolean encode)
1882 {
1883   GstCaps *caps;
1884
1885   switch (codec_type) {
1886     case AVMEDIA_TYPE_VIDEO:
1887       caps =
1888           gst_ffmpeg_codectype_to_video_caps (context, codec_id, encode, NULL);
1889       break;
1890     case AVMEDIA_TYPE_AUDIO:
1891       caps =
1892           gst_ffmpeg_codectype_to_audio_caps (context, codec_id, encode, NULL);
1893       break;
1894     default:
1895       caps = NULL;
1896       break;
1897   }
1898
1899   return caps;
1900 }
1901
1902 /* Convert a GstCaps (audio/raw) to a FFMPEG SampleFmt
1903  * and other audio properties in a AVCodecContext.
1904  *
1905  * For usefullness, see below
1906  */
1907
1908 static void
1909 gst_ffmpeg_caps_to_smpfmt (const GstCaps * caps,
1910     AVCodecContext * context, gboolean raw)
1911 {
1912   GstStructure *structure;
1913   const gchar *fmt;
1914   GstAudioFormat format = GST_AUDIO_FORMAT_UNKNOWN;
1915
1916   g_return_if_fail (gst_caps_get_size (caps) == 1);
1917
1918   structure = gst_caps_get_structure (caps, 0);
1919
1920   gst_structure_get_int (structure, "channels", &context->channels);
1921   gst_structure_get_int (structure, "rate", &context->sample_rate);
1922   gst_structure_get_int (structure, "block_align", &context->block_align);
1923   gst_structure_get_int (structure, "bitrate", &context->bit_rate);
1924
1925   if (!raw)
1926     return;
1927
1928   if (gst_structure_has_name (structure, "audio/x-raw")) {
1929     if ((fmt = gst_structure_get_string (structure, "format"))) {
1930       format = gst_audio_format_from_string (fmt);
1931     }
1932   }
1933
1934   switch (format) {
1935     case GST_AUDIO_FORMAT_F32:
1936       context->sample_fmt = AV_SAMPLE_FMT_FLT;
1937       break;
1938     case GST_AUDIO_FORMAT_F64:
1939       context->sample_fmt = AV_SAMPLE_FMT_DBL;
1940       break;
1941     case GST_AUDIO_FORMAT_S32:
1942       context->sample_fmt = AV_SAMPLE_FMT_S32;
1943       break;
1944     case GST_AUDIO_FORMAT_S16:
1945       context->sample_fmt = AV_SAMPLE_FMT_S16;
1946       break;
1947     default:
1948       break;
1949   }
1950 }
1951
1952 /* Convert a GstCaps (video/raw) to a FFMPEG PixFmt
1953  * and other video properties in a AVCodecContext.
1954  *
1955  * For usefullness, see below
1956  */
1957
1958 static void
1959 gst_ffmpeg_caps_to_pixfmt (const GstCaps * caps,
1960     AVCodecContext * context, gboolean raw)
1961 {
1962   GstStructure *structure;
1963   const GValue *fps;
1964   const GValue *par = NULL;
1965   const gchar *fmt;
1966   GstVideoFormat format = GST_VIDEO_FORMAT_UNKNOWN;
1967
1968   GST_DEBUG ("converting caps %" GST_PTR_FORMAT, caps);
1969   g_return_if_fail (gst_caps_get_size (caps) == 1);
1970   structure = gst_caps_get_structure (caps, 0);
1971
1972   gst_structure_get_int (structure, "width", &context->width);
1973   gst_structure_get_int (structure, "height", &context->height);
1974   gst_structure_get_int (structure, "bpp", &context->bits_per_coded_sample);
1975
1976   fps = gst_structure_get_value (structure, "framerate");
1977   if (fps != NULL && GST_VALUE_HOLDS_FRACTION (fps)) {
1978
1979     /* somehow these seem mixed up.. */
1980     context->time_base.den = gst_value_get_fraction_numerator (fps);
1981     context->time_base.num = gst_value_get_fraction_denominator (fps);
1982     context->ticks_per_frame = 1;
1983
1984     GST_DEBUG ("setting framerate %d/%d = %lf",
1985         context->time_base.den, context->time_base.num,
1986         1. * context->time_base.den / context->time_base.num);
1987   }
1988
1989   par = gst_structure_get_value (structure, "pixel-aspect-ratio");
1990   if (par && GST_VALUE_HOLDS_FRACTION (par)) {
1991
1992     context->sample_aspect_ratio.num = gst_value_get_fraction_numerator (par);
1993     context->sample_aspect_ratio.den = gst_value_get_fraction_denominator (par);
1994
1995     GST_DEBUG ("setting pixel-aspect-ratio %d/%d = %lf",
1996         context->sample_aspect_ratio.den, context->sample_aspect_ratio.num,
1997         1. * context->sample_aspect_ratio.den /
1998         context->sample_aspect_ratio.num);
1999   }
2000
2001   if (!raw)
2002     return;
2003
2004   g_return_if_fail (fps != NULL && GST_VALUE_HOLDS_FRACTION (fps));
2005
2006   if (gst_structure_has_name (structure, "video/x-raw")) {
2007     if ((fmt = gst_structure_get_string (structure, "format"))) {
2008       format = gst_video_format_from_string (fmt);
2009     }
2010   }
2011
2012   switch (format) {
2013     case GST_VIDEO_FORMAT_YUY2:
2014       context->pix_fmt = PIX_FMT_YUYV422;
2015       break;
2016     case GST_VIDEO_FORMAT_I420:
2017       context->pix_fmt = PIX_FMT_YUV420P;
2018       break;
2019     case GST_VIDEO_FORMAT_A420:
2020       context->pix_fmt = PIX_FMT_YUVA420P;
2021       break;
2022     case GST_VIDEO_FORMAT_Y41B:
2023       context->pix_fmt = PIX_FMT_YUV411P;
2024       break;
2025     case GST_VIDEO_FORMAT_Y42B:
2026       context->pix_fmt = PIX_FMT_YUV422P;
2027       break;
2028     case GST_VIDEO_FORMAT_YUV9:
2029       context->pix_fmt = PIX_FMT_YUV410P;
2030       break;
2031     case GST_VIDEO_FORMAT_Y444:
2032       context->pix_fmt = PIX_FMT_YUV444P;
2033       break;
2034     case GST_VIDEO_FORMAT_GRAY8:
2035       context->pix_fmt = PIX_FMT_GRAY8;
2036       break;
2037     case GST_VIDEO_FORMAT_xRGB:
2038 #if (G_BYTE_ORDER == G_BIG_ENDIAN)
2039       context->pix_fmt = PIX_FMT_RGB32;
2040 #endif
2041       break;
2042     case GST_VIDEO_FORMAT_BGRx:
2043 #if (G_BYTE_ORDER == G_LITTLE_ENDIAN)
2044       context->pix_fmt = PIX_FMT_RGB32;
2045 #endif
2046       break;
2047     case GST_VIDEO_FORMAT_RGB:
2048       context->pix_fmt = PIX_FMT_RGB24;
2049       break;
2050     case GST_VIDEO_FORMAT_BGR:
2051       context->pix_fmt = PIX_FMT_BGR24;
2052       break;
2053     case GST_VIDEO_FORMAT_RGB16:
2054       context->pix_fmt = PIX_FMT_RGB565;
2055       break;
2056     case GST_VIDEO_FORMAT_RGB15:
2057       context->pix_fmt = PIX_FMT_RGB555;
2058       break;
2059     case GST_VIDEO_FORMAT_RGB8P:
2060       context->pix_fmt = PIX_FMT_PAL8;
2061       break;
2062     default:
2063       break;
2064   }
2065 }
2066
2067 typedef struct
2068 {
2069   GstVideoFormat format;
2070   enum PixelFormat pixfmt;
2071 } PixToFmt;
2072
2073 /* FIXME : FILLME */
2074 static const PixToFmt pixtofmttable[] = {
2075   /* GST_VIDEO_FORMAT_I420, */
2076   {GST_VIDEO_FORMAT_I420, PIX_FMT_YUV420P},
2077   /* Note : this should use a different chroma placement */
2078   {GST_VIDEO_FORMAT_I420, PIX_FMT_YUVJ420P},
2079
2080   /* GST_VIDEO_FORMAT_YV12, */
2081   /* GST_VIDEO_FORMAT_YUY2, */
2082   {GST_VIDEO_FORMAT_YUY2, PIX_FMT_YUYV422},
2083   /* GST_VIDEO_FORMAT_UYVY, */
2084   {GST_VIDEO_FORMAT_UYVY, PIX_FMT_UYVY422},
2085   /* GST_VIDEO_FORMAT_AYUV, */
2086   /* GST_VIDEO_FORMAT_RGBx, */
2087   /* GST_VIDEO_FORMAT_BGRx, */
2088   /* GST_VIDEO_FORMAT_xRGB, */
2089   /* GST_VIDEO_FORMAT_xBGR, */
2090   /* GST_VIDEO_FORMAT_RGBA, */
2091   {GST_VIDEO_FORMAT_RGBA, PIX_FMT_RGBA},
2092   /* GST_VIDEO_FORMAT_BGRA, */
2093   {GST_VIDEO_FORMAT_BGRA, PIX_FMT_BGRA},
2094   /* GST_VIDEO_FORMAT_ARGB, */
2095   {GST_VIDEO_FORMAT_ARGB, PIX_FMT_ARGB},
2096   /* GST_VIDEO_FORMAT_ABGR, */
2097   {GST_VIDEO_FORMAT_ABGR, PIX_FMT_ABGR},
2098   /* GST_VIDEO_FORMAT_RGB, */
2099   {GST_VIDEO_FORMAT_RGB, PIX_FMT_RGB24},
2100   /* GST_VIDEO_FORMAT_BGR, */
2101   {GST_VIDEO_FORMAT_BGR, PIX_FMT_BGR24},
2102   /* GST_VIDEO_FORMAT_Y41B, */
2103   {GST_VIDEO_FORMAT_Y41B, PIX_FMT_YUV411P},
2104   /* GST_VIDEO_FORMAT_Y42B, */
2105   {GST_VIDEO_FORMAT_Y42B, PIX_FMT_YUV422P},
2106   {GST_VIDEO_FORMAT_Y42B, PIX_FMT_YUVJ422P},
2107   /* GST_VIDEO_FORMAT_YVYU, */
2108   /* GST_VIDEO_FORMAT_Y444, */
2109   {GST_VIDEO_FORMAT_Y444, PIX_FMT_YUV444P},
2110   {GST_VIDEO_FORMAT_Y444, PIX_FMT_YUVJ444P},
2111   /* GST_VIDEO_FORMAT_v210, */
2112   /* GST_VIDEO_FORMAT_v216, */
2113   /* GST_VIDEO_FORMAT_NV12, */
2114   {GST_VIDEO_FORMAT_NV12, PIX_FMT_NV12},
2115   /* GST_VIDEO_FORMAT_NV21, */
2116   {GST_VIDEO_FORMAT_NV21, PIX_FMT_NV21},
2117   /* GST_VIDEO_FORMAT_GRAY8, */
2118   {GST_VIDEO_FORMAT_GRAY8, PIX_FMT_GRAY8},
2119   /* GST_VIDEO_FORMAT_GRAY16_BE, */
2120   {GST_VIDEO_FORMAT_GRAY16_BE, PIX_FMT_GRAY16BE},
2121   /* GST_VIDEO_FORMAT_GRAY16_LE, */
2122   {GST_VIDEO_FORMAT_GRAY16_LE, PIX_FMT_GRAY16LE},
2123   /* GST_VIDEO_FORMAT_v308, */
2124   /* GST_VIDEO_FORMAT_Y800, */
2125   /* GST_VIDEO_FORMAT_Y16, */
2126   /* GST_VIDEO_FORMAT_RGB16, */
2127   {GST_VIDEO_FORMAT_RGB16, PIX_FMT_RGB565},
2128   /* GST_VIDEO_FORMAT_BGR16, */
2129   /* GST_VIDEO_FORMAT_RGB15, */
2130   {GST_VIDEO_FORMAT_RGB15, PIX_FMT_RGB555},
2131   /* GST_VIDEO_FORMAT_BGR15, */
2132   /* GST_VIDEO_FORMAT_UYVP, */
2133   /* GST_VIDEO_FORMAT_A420, */
2134   {GST_VIDEO_FORMAT_A420, PIX_FMT_YUVA420P},
2135   /* GST_VIDEO_FORMAT_RGB8_PALETTED, */
2136   {GST_VIDEO_FORMAT_RGB8P, PIX_FMT_PAL8},
2137   /* GST_VIDEO_FORMAT_YUV9, */
2138   {GST_VIDEO_FORMAT_YUV9, PIX_FMT_YUV410P},
2139   /* GST_VIDEO_FORMAT_YVU9, */
2140   /* GST_VIDEO_FORMAT_IYU1, */
2141   /* GST_VIDEO_FORMAT_ARGB64, */
2142   /* GST_VIDEO_FORMAT_AYUV64, */
2143   /* GST_VIDEO_FORMAT_r210, */
2144   {GST_VIDEO_FORMAT_I420_10LE, PIX_FMT_YUV420P10LE},
2145   {GST_VIDEO_FORMAT_I420_10BE, PIX_FMT_YUV420P10BE},
2146   {GST_VIDEO_FORMAT_I422_10LE, PIX_FMT_YUV422P10LE},
2147   {GST_VIDEO_FORMAT_I422_10BE, PIX_FMT_YUV422P10BE},
2148   {GST_VIDEO_FORMAT_Y444_10LE, PIX_FMT_YUV444P10LE},
2149   {GST_VIDEO_FORMAT_Y444_10BE, PIX_FMT_YUV444P10BE},
2150   {GST_VIDEO_FORMAT_GBR, PIX_FMT_GBRP},
2151   {GST_VIDEO_FORMAT_GBR_10LE, PIX_FMT_GBRP10LE},
2152   {GST_VIDEO_FORMAT_GBR_10BE, PIX_FMT_GBRP10BE},
2153 };
2154
2155 GstVideoFormat
2156 gst_ffmpeg_pixfmt_to_videoformat (enum PixelFormat pixfmt)
2157 {
2158   guint i;
2159
2160   for (i = 0; i < G_N_ELEMENTS (pixtofmttable); i++)
2161     if (pixtofmttable[i].pixfmt == pixfmt)
2162       return pixtofmttable[i].format;
2163
2164   GST_WARNING ("Unknown pixel format %d", pixfmt);
2165   return GST_VIDEO_FORMAT_UNKNOWN;
2166 }
2167
2168 enum PixelFormat
2169 gst_ffmpeg_videoformat_to_pixfmt (GstVideoFormat format)
2170 {
2171   guint i;
2172
2173   for (i = 0; i < G_N_ELEMENTS (pixtofmttable); i++)
2174     if (pixtofmttable[i].format == format)
2175       return pixtofmttable[i].pixfmt;
2176   return PIX_FMT_NONE;
2177 }
2178
2179 void
2180 gst_ffmpeg_videoinfo_to_context (GstVideoInfo * info, AVCodecContext * context)
2181 {
2182   gint i, bpp = 0;
2183
2184   context->width = GST_VIDEO_INFO_WIDTH (info);
2185   context->height = GST_VIDEO_INFO_HEIGHT (info);
2186   for (i = 0; i < GST_VIDEO_INFO_N_COMPONENTS (info); i++)
2187     bpp += GST_VIDEO_INFO_COMP_DEPTH (info, i);
2188   context->bits_per_coded_sample = bpp;
2189
2190   context->ticks_per_frame = 1;
2191   context->time_base.den = GST_VIDEO_INFO_FPS_N (info);
2192   context->time_base.num = GST_VIDEO_INFO_FPS_D (info);
2193
2194   context->sample_aspect_ratio.num = GST_VIDEO_INFO_PAR_N (info);
2195   context->sample_aspect_ratio.den = GST_VIDEO_INFO_PAR_D (info);
2196
2197   context->pix_fmt =
2198       gst_ffmpeg_videoformat_to_pixfmt (GST_VIDEO_INFO_FORMAT (info));
2199 }
2200
2201 void
2202 gst_ffmpeg_audioinfo_to_context (GstAudioInfo * info, AVCodecContext * context)
2203 {
2204   context->channels = info->channels;
2205   context->sample_rate = info->rate;
2206
2207   switch (info->finfo->format) {
2208     case GST_AUDIO_FORMAT_F32:
2209       context->sample_fmt = AV_SAMPLE_FMT_FLT;
2210       break;
2211     case GST_AUDIO_FORMAT_F64:
2212       context->sample_fmt = AV_SAMPLE_FMT_DBL;
2213       break;
2214     case GST_AUDIO_FORMAT_S32:
2215       context->sample_fmt = AV_SAMPLE_FMT_S32;
2216       break;
2217     case GST_AUDIO_FORMAT_S16:
2218       context->sample_fmt = AV_SAMPLE_FMT_S16;
2219       break;
2220     default:
2221       break;
2222   }
2223 }
2224
2225 /* Convert a GstCaps and a FFMPEG codec Type to a
2226  * AVCodecContext. If the context is ommitted, no fixed values
2227  * for video/audio size will be included in the context
2228  *
2229  * AVMediaType is primarily meant for uncompressed data GstCaps!
2230  */
2231
2232 void
2233 gst_ffmpeg_caps_with_codectype (enum AVMediaType type,
2234     const GstCaps * caps, AVCodecContext * context)
2235 {
2236   if (context == NULL)
2237     return;
2238
2239   switch (type) {
2240     case AVMEDIA_TYPE_VIDEO:
2241       gst_ffmpeg_caps_to_pixfmt (caps, context, TRUE);
2242       break;
2243
2244     case AVMEDIA_TYPE_AUDIO:
2245       gst_ffmpeg_caps_to_smpfmt (caps, context, TRUE);
2246       break;
2247
2248     default:
2249       /* unknown */
2250       break;
2251   }
2252 }
2253
2254 #if 0
2255 static void
2256 nal_escape (guint8 * dst, guint8 * src, guint size, guint * destsize)
2257 {
2258   guint8 *dstp = dst;
2259   guint8 *srcp = src;
2260   guint8 *end = src + size;
2261   gint count = 0;
2262
2263   while (srcp < end) {
2264     if (count == 2 && *srcp <= 0x03) {
2265       GST_DEBUG ("added escape code");
2266       *dstp++ = 0x03;
2267       count = 0;
2268     }
2269     if (*srcp == 0)
2270       count++;
2271     else
2272       count = 0;
2273
2274     GST_DEBUG ("copy %02x, count %d", *srcp, count);
2275     *dstp++ = *srcp++;
2276   }
2277   *destsize = dstp - dst;
2278 }
2279
2280 /* copy the config, escaping NAL units as we iterate them, if something fails we
2281  * copy everything and hope for the best. */
2282 static void
2283 copy_config (guint8 * dst, guint8 * src, guint size, guint * destsize)
2284 {
2285   guint8 *dstp = dst;
2286   guint8 *srcp = src;
2287   gint cnt, i;
2288   guint nalsize, esize;
2289
2290   /* check size */
2291   if (size < 7)
2292     goto full_copy;
2293
2294   /* check version */
2295   if (*srcp != 1)
2296     goto full_copy;
2297
2298   cnt = *(srcp + 5) & 0x1f;     /* Number of sps */
2299
2300   GST_DEBUG ("num SPS %d", cnt);
2301
2302   memcpy (dstp, srcp, 6);
2303   srcp += 6;
2304   dstp += 6;
2305
2306   for (i = 0; i < cnt; i++) {
2307     GST_DEBUG ("copy SPS %d", i);
2308     nalsize = (srcp[0] << 8) | srcp[1];
2309     nal_escape (dstp + 2, srcp + 2, nalsize, &esize);
2310     dstp[0] = esize >> 8;
2311     dstp[1] = esize & 0xff;
2312     dstp += esize + 2;
2313     srcp += nalsize + 2;
2314   }
2315
2316   cnt = *(dstp++) = *(srcp++);  /* Number of pps */
2317
2318   GST_DEBUG ("num PPS %d", cnt);
2319
2320   for (i = 0; i < cnt; i++) {
2321     GST_DEBUG ("copy PPS %d", i);
2322     nalsize = (srcp[0] << 8) | srcp[1];
2323     nal_escape (dstp + 2, srcp + 2, nalsize, &esize);
2324     dstp[0] = esize >> 8;
2325     dstp[1] = esize & 0xff;
2326     dstp += esize + 2;
2327     srcp += nalsize + 2;
2328   }
2329   *destsize = dstp - dst;
2330
2331   return;
2332
2333 full_copy:
2334   {
2335     GST_DEBUG ("something unexpected, doing full copy");
2336     memcpy (dst, src, size);
2337     *destsize = size;
2338     return;
2339   }
2340 }
2341 #endif
2342
2343 /*
2344  * caps_with_codecid () transforms a GstCaps for a known codec
2345  * ID into a filled-in context.
2346  * codec_data from caps will override possible extradata already in the context
2347  */
2348
2349 void
2350 gst_ffmpeg_caps_with_codecid (enum CodecID codec_id,
2351     enum AVMediaType codec_type, const GstCaps * caps, AVCodecContext * context)
2352 {
2353   GstStructure *str;
2354   const GValue *value;
2355   GstBuffer *buf;
2356
2357   GST_LOG ("codec_id:%d, codec_type:%d, caps:%" GST_PTR_FORMAT " context:%p",
2358       codec_id, codec_type, caps, context);
2359
2360   if (!context || !gst_caps_get_size (caps))
2361     return;
2362
2363   str = gst_caps_get_structure (caps, 0);
2364
2365   /* extradata parsing (esds [mpeg4], wma/wmv, msmpeg4v1/2/3, etc.) */
2366   if ((value = gst_structure_get_value (str, "codec_data"))) {
2367     GstMapInfo map;
2368
2369     buf = gst_value_get_buffer (value);
2370     gst_buffer_map (buf, &map, GST_MAP_READ);
2371
2372     /* free the old one if it is there */
2373     if (context->extradata)
2374       av_free (context->extradata);
2375
2376 #if 0
2377     if (codec_id == CODEC_ID_H264) {
2378       guint extrasize;
2379
2380       GST_DEBUG ("copy, escaping codec_data %d", size);
2381       /* ffmpeg h264 expects the codec_data to be escaped, there is no real
2382        * reason for this but let's just escape it for now. Start by allocating
2383        * enough space, x2 is more than enough.
2384        *
2385        * FIXME, we disabled escaping because some file already contain escaped
2386        * codec_data and then we escape twice and fail. It's better to leave it
2387        * as is, as that is what most players do. */
2388       context->extradata =
2389           av_mallocz (GST_ROUND_UP_16 (size * 2 +
2390               FF_INPUT_BUFFER_PADDING_SIZE));
2391       copy_config (context->extradata, data, size, &extrasize);
2392       GST_DEBUG ("escaped size: %d", extrasize);
2393       context->extradata_size = extrasize;
2394     } else
2395 #endif
2396     {
2397       /* allocate with enough padding */
2398       GST_DEBUG ("copy codec_data");
2399       context->extradata =
2400           av_mallocz (GST_ROUND_UP_16 (map.size +
2401               FF_INPUT_BUFFER_PADDING_SIZE));
2402       memcpy (context->extradata, map.data, map.size);
2403       context->extradata_size = map.size;
2404     }
2405
2406     /* Hack for VC1. Sometimes the first (length) byte is 0 for some files */
2407     if (codec_id == CODEC_ID_VC1 && map.size > 0 && map.data[0] == 0) {
2408       context->extradata[0] = (guint8) map.size;
2409     }
2410
2411     GST_DEBUG ("have codec data of size %" G_GSIZE_FORMAT, map.size);
2412
2413     gst_buffer_unmap (buf, &map);
2414   } else if (context->extradata == NULL && codec_id != CODEC_ID_AAC_LATM &&
2415       codec_id != CODEC_ID_FLAC) {
2416     /* no extradata, alloc dummy with 0 sized, some codecs insist on reading
2417      * extradata anyway which makes then segfault. */
2418     context->extradata =
2419         av_mallocz (GST_ROUND_UP_16 (FF_INPUT_BUFFER_PADDING_SIZE));
2420     context->extradata_size = 0;
2421     GST_DEBUG ("no codec data");
2422   }
2423
2424   switch (codec_id) {
2425     case CODEC_ID_MPEG4:
2426     {
2427       const gchar *mime = gst_structure_get_name (str);
2428
2429       if (!strcmp (mime, "video/x-divx"))
2430         context->codec_tag = GST_MAKE_FOURCC ('D', 'I', 'V', 'X');
2431       else if (!strcmp (mime, "video/x-xvid"))
2432         context->codec_tag = GST_MAKE_FOURCC ('X', 'V', 'I', 'D');
2433       else if (!strcmp (mime, "video/x-3ivx"))
2434         context->codec_tag = GST_MAKE_FOURCC ('3', 'I', 'V', '1');
2435       else if (!strcmp (mime, "video/mpeg"))
2436         context->codec_tag = GST_MAKE_FOURCC ('m', 'p', '4', 'v');
2437     }
2438       break;
2439
2440     case CODEC_ID_SVQ3:
2441       /* FIXME: this is a workaround for older gst-plugins releases
2442        * (<= 0.8.9). This should be removed at some point, because
2443        * it causes wrong decoded frame order. */
2444       if (!context->extradata) {
2445         gint halfpel_flag, thirdpel_flag, low_delay, unknown_svq3_flag;
2446         guint16 flags;
2447
2448         if (gst_structure_get_int (str, "halfpel_flag", &halfpel_flag) ||
2449             gst_structure_get_int (str, "thirdpel_flag", &thirdpel_flag) ||
2450             gst_structure_get_int (str, "low_delay", &low_delay) ||
2451             gst_structure_get_int (str, "unknown_svq3_flag",
2452                 &unknown_svq3_flag)) {
2453           context->extradata = (guint8 *) av_mallocz (0x64);
2454           g_stpcpy ((gchar *) context->extradata, "SVQ3");
2455           flags = 1 << 3;
2456           flags |= low_delay;
2457           flags = flags << 2;
2458           flags |= unknown_svq3_flag;
2459           flags = flags << 6;
2460           flags |= halfpel_flag;
2461           flags = flags << 1;
2462           flags |= thirdpel_flag;
2463           flags = flags << 3;
2464
2465           flags = GUINT16_FROM_LE (flags);
2466
2467           memcpy ((gchar *) context->extradata + 0x62, &flags, 2);
2468           context->extradata_size = 0x64;
2469         }
2470       }
2471       break;
2472
2473     case CODEC_ID_MSRLE:
2474     case CODEC_ID_QTRLE:
2475     case CODEC_ID_TSCC:
2476     case CODEC_ID_CSCD:
2477     case CODEC_ID_APE:
2478     {
2479       gint depth;
2480
2481       if (gst_structure_get_int (str, "depth", &depth)) {
2482         context->bits_per_coded_sample = depth;
2483       } else {
2484         GST_WARNING ("No depth field in caps %" GST_PTR_FORMAT, caps);
2485       }
2486
2487     }
2488       break;
2489
2490     case CODEC_ID_RV10:
2491     case CODEC_ID_RV20:
2492     case CODEC_ID_RV30:
2493     case CODEC_ID_RV40:
2494     {
2495       gint format;
2496
2497       if (gst_structure_get_int (str, "format", &format))
2498         context->sub_id = format;
2499
2500       break;
2501     }
2502     case CODEC_ID_COOK:
2503     case CODEC_ID_RA_288:
2504     case CODEC_ID_RA_144:
2505     case CODEC_ID_SIPR:
2506     {
2507       gint leaf_size;
2508       gint bitrate;
2509
2510       if (gst_structure_get_int (str, "leaf_size", &leaf_size))
2511         context->block_align = leaf_size;
2512       if (gst_structure_get_int (str, "bitrate", &bitrate))
2513         context->bit_rate = bitrate;
2514     }
2515     case CODEC_ID_ALAC:
2516       gst_structure_get_int (str, "samplesize",
2517           &context->bits_per_coded_sample);
2518       break;
2519
2520     case CODEC_ID_DVVIDEO:
2521     {
2522       const gchar *format;
2523
2524       if ((format = gst_structure_get_string (str, "format"))) {
2525
2526         if (g_str_equal (format, "YUY2"))
2527           context->pix_fmt = PIX_FMT_YUYV422;
2528         else if (g_str_equal (format, "I420"))
2529           context->pix_fmt = PIX_FMT_YUV420P;
2530         else if (g_str_equal (format, "A420"))
2531           context->pix_fmt = PIX_FMT_YUVA420P;
2532         else if (g_str_equal (format, "Y41B"))
2533           context->pix_fmt = PIX_FMT_YUV411P;
2534         else if (g_str_equal (format, "Y42B"))
2535           context->pix_fmt = PIX_FMT_YUV422P;
2536         else if (g_str_equal (format, "YUV9"))
2537           context->pix_fmt = PIX_FMT_YUV410P;
2538         else {
2539           GST_WARNING ("couldn't convert format %s" " to a pixel format",
2540               format);
2541         }
2542       } else
2543         GST_WARNING ("No specified format");
2544       break;
2545     }
2546     case CODEC_ID_H263P:
2547     {
2548       gboolean val;
2549
2550       if (!gst_structure_get_boolean (str, "annex-f", &val) || val)
2551         context->flags |= CODEC_FLAG_4MV;
2552       else
2553         context->flags &= ~CODEC_FLAG_4MV;
2554       if ((!gst_structure_get_boolean (str, "annex-i", &val) || val) &&
2555           (!gst_structure_get_boolean (str, "annex-t", &val) || val))
2556         context->flags |= CODEC_FLAG_AC_PRED;
2557       else
2558         context->flags &= ~CODEC_FLAG_AC_PRED;
2559       if (!gst_structure_get_boolean (str, "annex-j", &val) || val)
2560         context->flags |= CODEC_FLAG_LOOP_FILTER;
2561       else
2562         context->flags &= ~CODEC_FLAG_LOOP_FILTER;
2563       break;
2564     }
2565     case CODEC_ID_ADPCM_G726:
2566     {
2567       const gchar *layout;
2568
2569       if ((layout = gst_structure_get_string (str, "layout"))) {
2570         if (!strcmp (layout, "g721")) {
2571           context->sample_rate = 8000;
2572           context->channels = 1;
2573           context->bit_rate = 32000;
2574         }
2575       }
2576       break;
2577     }
2578     default:
2579       break;
2580   }
2581
2582   if (!gst_caps_is_fixed (caps))
2583     return;
2584
2585   /* common properties (width, height, fps) */
2586   switch (codec_type) {
2587     case AVMEDIA_TYPE_VIDEO:
2588       gst_ffmpeg_caps_to_pixfmt (caps, context, codec_id == CODEC_ID_RAWVIDEO);
2589       break;
2590     case AVMEDIA_TYPE_AUDIO:
2591       gst_ffmpeg_caps_to_smpfmt (caps, context, FALSE);
2592       break;
2593     default:
2594       break;
2595   }
2596
2597   /* fixup of default settings */
2598   switch (codec_id) {
2599     case CODEC_ID_QCELP:
2600       /* QCELP is always mono, no matter what the caps say */
2601       context->channels = 1;
2602       break;
2603     default:
2604       break;
2605   }
2606 }
2607
2608 /* _formatid_to_caps () is meant for muxers/demuxers, it
2609  * transforms a name (ffmpeg way of ID'ing these, why don't
2610  * they have unique numerical IDs?) to the corresponding
2611  * caps belonging to that mux-format
2612  *
2613  * Note: we don't need any additional info because the caps
2614  * isn't supposed to contain any useful info besides the
2615  * media type anyway
2616  */
2617
2618 GstCaps *
2619 gst_ffmpeg_formatid_to_caps (const gchar * format_name)
2620 {
2621   GstCaps *caps = NULL;
2622
2623   if (!strcmp (format_name, "mpeg")) {
2624     caps = gst_caps_new_simple ("video/mpeg",
2625         "systemstream", G_TYPE_BOOLEAN, TRUE, NULL);
2626   } else if (!strcmp (format_name, "mpegts")) {
2627     caps = gst_caps_new_simple ("video/mpegts",
2628         "systemstream", G_TYPE_BOOLEAN, TRUE, NULL);
2629   } else if (!strcmp (format_name, "rm")) {
2630     caps = gst_caps_new_simple ("application/x-pn-realmedia",
2631         "systemstream", G_TYPE_BOOLEAN, TRUE, NULL);
2632   } else if (!strcmp (format_name, "asf")) {
2633     caps = gst_caps_new_empty_simple ("video/x-ms-asf");
2634   } else if (!strcmp (format_name, "avi")) {
2635     caps = gst_caps_new_empty_simple ("video/x-msvideo");
2636   } else if (!strcmp (format_name, "wav")) {
2637     caps = gst_caps_new_empty_simple ("audio/x-wav");
2638   } else if (!strcmp (format_name, "ape")) {
2639     caps = gst_caps_new_empty_simple ("application/x-ape");
2640   } else if (!strcmp (format_name, "swf")) {
2641     caps = gst_caps_new_empty_simple ("application/x-shockwave-flash");
2642   } else if (!strcmp (format_name, "au")) {
2643     caps = gst_caps_new_empty_simple ("audio/x-au");
2644   } else if (!strcmp (format_name, "dv")) {
2645     caps = gst_caps_new_simple ("video/x-dv",
2646         "systemstream", G_TYPE_BOOLEAN, TRUE, NULL);
2647   } else if (!strcmp (format_name, "4xm")) {
2648     caps = gst_caps_new_empty_simple ("video/x-4xm");
2649   } else if (!strcmp (format_name, "matroska")) {
2650     caps = gst_caps_new_empty_simple ("video/x-matroska");
2651   } else if (!strcmp (format_name, "mp3")) {
2652     caps = gst_caps_new_empty_simple ("application/x-id3");
2653   } else if (!strcmp (format_name, "flic")) {
2654     caps = gst_caps_new_empty_simple ("video/x-fli");
2655   } else if (!strcmp (format_name, "flv")) {
2656     caps = gst_caps_new_empty_simple ("video/x-flv");
2657   } else if (!strcmp (format_name, "tta")) {
2658     caps = gst_caps_new_empty_simple ("audio/x-ttafile");
2659   } else if (!strcmp (format_name, "aiff")) {
2660     caps = gst_caps_new_empty_simple ("audio/x-aiff");
2661   } else if (!strcmp (format_name, "mov_mp4_m4a_3gp_3g2")) {
2662     caps =
2663         gst_caps_from_string
2664         ("application/x-3gp; video/quicktime; audio/x-m4a");
2665   } else if (!strcmp (format_name, "mov")) {
2666     caps = gst_caps_from_string ("video/quicktime,variant=(string)apple");
2667   } else if (!strcmp (format_name, "mp4")) {
2668     caps = gst_caps_from_string ("video/quicktime,variant=(string)iso");
2669   } else if (!strcmp (format_name, "3gp")) {
2670     caps = gst_caps_from_string ("video/quicktime,variant=(string)3gpp");
2671   } else if (!strcmp (format_name, "3g2")) {
2672     caps = gst_caps_from_string ("video/quicktime,variant=(string)3g2");
2673   } else if (!strcmp (format_name, "psp")) {
2674     caps = gst_caps_from_string ("video/quicktime,variant=(string)psp");
2675   } else if (!strcmp (format_name, "ipod")) {
2676     caps = gst_caps_from_string ("video/quicktime,variant=(string)ipod");
2677   } else if (!strcmp (format_name, "aac")) {
2678     caps = gst_caps_new_simple ("audio/mpeg",
2679         "mpegversion", G_TYPE_INT, 4, NULL);
2680   } else if (!strcmp (format_name, "gif")) {
2681     caps = gst_caps_from_string ("image/gif");
2682   } else if (!strcmp (format_name, "ogg")) {
2683     caps = gst_caps_from_string ("application/ogg");
2684   } else if (!strcmp (format_name, "mxf") || !strcmp (format_name, "mxf_d10")) {
2685     caps = gst_caps_from_string ("application/mxf");
2686   } else if (!strcmp (format_name, "gxf")) {
2687     caps = gst_caps_from_string ("application/gxf");
2688   } else if (!strcmp (format_name, "yuv4mpegpipe")) {
2689     caps = gst_caps_new_simple ("application/x-yuv4mpeg",
2690         "y4mversion", G_TYPE_INT, 2, NULL);
2691   } else if (!strcmp (format_name, "mpc")) {
2692     caps = gst_caps_from_string ("audio/x-musepack, streamversion = (int) 7");
2693   } else if (!strcmp (format_name, "vqf")) {
2694     caps = gst_caps_from_string ("audio/x-vqf");
2695   } else if (!strcmp (format_name, "nsv")) {
2696     caps = gst_caps_from_string ("video/x-nsv");
2697   } else if (!strcmp (format_name, "amr")) {
2698     caps = gst_caps_from_string ("audio/x-amr-nb-sh");
2699   } else if (!strcmp (format_name, "webm")) {
2700     caps = gst_caps_from_string ("video/webm");
2701   } else if (!strcmp (format_name, "voc")) {
2702     caps = gst_caps_from_string ("audio/x-voc");
2703   } else {
2704     gchar *name;
2705
2706     GST_LOG ("Could not create stream format caps for %s", format_name);
2707     name = g_strdup_printf ("application/x-gst-av-%s", format_name);
2708     caps = gst_caps_new_empty_simple (name);
2709     g_free (name);
2710   }
2711
2712   return caps;
2713 }
2714
2715 gboolean
2716 gst_ffmpeg_formatid_get_codecids (const gchar * format_name,
2717     enum CodecID ** video_codec_list, enum CodecID ** audio_codec_list,
2718     AVOutputFormat * plugin)
2719 {
2720   static enum CodecID tmp_vlist[] = {
2721     CODEC_ID_NONE,
2722     CODEC_ID_NONE
2723   };
2724   static enum CodecID tmp_alist[] = {
2725     CODEC_ID_NONE,
2726     CODEC_ID_NONE
2727   };
2728
2729   GST_LOG ("format_name : %s", format_name);
2730
2731   if (!strcmp (format_name, "mp4")) {
2732     static enum CodecID mp4_video_list[] = {
2733       CODEC_ID_MPEG4, CODEC_ID_H264,
2734       CODEC_ID_MJPEG,
2735       CODEC_ID_NONE
2736     };
2737     static enum CodecID mp4_audio_list[] = {
2738       CODEC_ID_AAC, CODEC_ID_MP3,
2739       CODEC_ID_NONE
2740     };
2741
2742     *video_codec_list = mp4_video_list;
2743     *audio_codec_list = mp4_audio_list;
2744   } else if (!strcmp (format_name, "mpeg")) {
2745     static enum CodecID mpeg_video_list[] = { CODEC_ID_MPEG1VIDEO,
2746       CODEC_ID_MPEG2VIDEO,
2747       CODEC_ID_H264,
2748       CODEC_ID_NONE
2749     };
2750     static enum CodecID mpeg_audio_list[] = { CODEC_ID_MP1,
2751       CODEC_ID_MP2,
2752       CODEC_ID_MP3,
2753       CODEC_ID_NONE
2754     };
2755
2756     *video_codec_list = mpeg_video_list;
2757     *audio_codec_list = mpeg_audio_list;
2758   } else if (!strcmp (format_name, "dvd")) {
2759     static enum CodecID mpeg_video_list[] = { CODEC_ID_MPEG2VIDEO,
2760       CODEC_ID_NONE
2761     };
2762     static enum CodecID mpeg_audio_list[] = { CODEC_ID_MP2,
2763       CODEC_ID_AC3,
2764       CODEC_ID_DTS,
2765       CODEC_ID_PCM_S16BE,
2766       CODEC_ID_NONE
2767     };
2768
2769     *video_codec_list = mpeg_video_list;
2770     *audio_codec_list = mpeg_audio_list;
2771   } else if (!strcmp (format_name, "mpegts")) {
2772     static enum CodecID mpegts_video_list[] = { CODEC_ID_MPEG1VIDEO,
2773       CODEC_ID_MPEG2VIDEO,
2774       CODEC_ID_H264,
2775       CODEC_ID_NONE
2776     };
2777     static enum CodecID mpegts_audio_list[] = { CODEC_ID_MP2,
2778       CODEC_ID_MP3,
2779       CODEC_ID_AC3,
2780       CODEC_ID_DTS,
2781       CODEC_ID_AAC,
2782       CODEC_ID_NONE
2783     };
2784
2785     *video_codec_list = mpegts_video_list;
2786     *audio_codec_list = mpegts_audio_list;
2787   } else if (!strcmp (format_name, "vob")) {
2788     static enum CodecID vob_video_list[] =
2789         { CODEC_ID_MPEG2VIDEO, CODEC_ID_NONE };
2790     static enum CodecID vob_audio_list[] = { CODEC_ID_MP2, CODEC_ID_AC3,
2791       CODEC_ID_DTS, CODEC_ID_NONE
2792     };
2793
2794     *video_codec_list = vob_video_list;
2795     *audio_codec_list = vob_audio_list;
2796   } else if (!strcmp (format_name, "flv")) {
2797     static enum CodecID flv_video_list[] = { CODEC_ID_FLV1, CODEC_ID_NONE };
2798     static enum CodecID flv_audio_list[] = { CODEC_ID_MP3, CODEC_ID_NONE };
2799
2800     *video_codec_list = flv_video_list;
2801     *audio_codec_list = flv_audio_list;
2802   } else if (!strcmp (format_name, "asf")) {
2803     static enum CodecID asf_video_list[] =
2804         { CODEC_ID_WMV1, CODEC_ID_WMV2, CODEC_ID_MSMPEG4V3, CODEC_ID_NONE };
2805     static enum CodecID asf_audio_list[] =
2806         { CODEC_ID_WMAV1, CODEC_ID_WMAV2, CODEC_ID_MP3, CODEC_ID_NONE };
2807
2808     *video_codec_list = asf_video_list;
2809     *audio_codec_list = asf_audio_list;
2810   } else if (!strcmp (format_name, "dv")) {
2811     static enum CodecID dv_video_list[] = { CODEC_ID_DVVIDEO, CODEC_ID_NONE };
2812     static enum CodecID dv_audio_list[] = { CODEC_ID_PCM_S16LE, CODEC_ID_NONE };
2813
2814     *video_codec_list = dv_video_list;
2815     *audio_codec_list = dv_audio_list;
2816   } else if (!strcmp (format_name, "mov")) {
2817     static enum CodecID mov_video_list[] = {
2818       CODEC_ID_SVQ1, CODEC_ID_SVQ3, CODEC_ID_MPEG4,
2819       CODEC_ID_H263, CODEC_ID_H263P,
2820       CODEC_ID_H264, CODEC_ID_DVVIDEO,
2821       CODEC_ID_MJPEG,
2822       CODEC_ID_NONE
2823     };
2824     static enum CodecID mov_audio_list[] = {
2825       CODEC_ID_PCM_MULAW, CODEC_ID_PCM_ALAW, CODEC_ID_ADPCM_IMA_QT,
2826       CODEC_ID_MACE3, CODEC_ID_MACE6, CODEC_ID_AAC,
2827       CODEC_ID_AMR_NB, CODEC_ID_AMR_WB,
2828       CODEC_ID_PCM_S16BE, CODEC_ID_PCM_S16LE,
2829       CODEC_ID_MP3, CODEC_ID_NONE
2830     };
2831
2832     *video_codec_list = mov_video_list;
2833     *audio_codec_list = mov_audio_list;
2834   } else if ((!strcmp (format_name, "3gp") || !strcmp (format_name, "3g2"))) {
2835     static enum CodecID tgp_video_list[] = {
2836       CODEC_ID_MPEG4, CODEC_ID_H263, CODEC_ID_H263P, CODEC_ID_H264,
2837       CODEC_ID_NONE
2838     };
2839     static enum CodecID tgp_audio_list[] = {
2840       CODEC_ID_AMR_NB, CODEC_ID_AMR_WB,
2841       CODEC_ID_AAC,
2842       CODEC_ID_NONE
2843     };
2844
2845     *video_codec_list = tgp_video_list;
2846     *audio_codec_list = tgp_audio_list;
2847   } else if (!strcmp (format_name, "mmf")) {
2848     static enum CodecID mmf_audio_list[] = {
2849       CODEC_ID_ADPCM_YAMAHA, CODEC_ID_NONE
2850     };
2851     *video_codec_list = NULL;
2852     *audio_codec_list = mmf_audio_list;
2853   } else if (!strcmp (format_name, "amr")) {
2854     static enum CodecID amr_audio_list[] = {
2855       CODEC_ID_AMR_NB, CODEC_ID_AMR_WB,
2856       CODEC_ID_NONE
2857     };
2858     *video_codec_list = NULL;
2859     *audio_codec_list = amr_audio_list;
2860   } else if (!strcmp (format_name, "gif")) {
2861     static enum CodecID gif_image_list[] = {
2862       CODEC_ID_RAWVIDEO, CODEC_ID_NONE
2863     };
2864     *video_codec_list = gif_image_list;
2865     *audio_codec_list = NULL;
2866   } else if ((plugin->audio_codec != CODEC_ID_NONE) ||
2867       (plugin->video_codec != CODEC_ID_NONE)) {
2868     tmp_vlist[0] = plugin->video_codec;
2869     tmp_alist[0] = plugin->audio_codec;
2870
2871     *video_codec_list = tmp_vlist;
2872     *audio_codec_list = tmp_alist;
2873   } else {
2874     GST_LOG ("Format %s not found", format_name);
2875     return FALSE;
2876   }
2877
2878   return TRUE;
2879 }
2880
2881 /* Convert a GstCaps to a FFMPEG codec ID. Size et all
2882  * are omitted, that can be queried by the user itself,
2883  * we're not eating the GstCaps or anything
2884  * A pointer to an allocated context is also needed for
2885  * optional extra info
2886  */
2887
2888 enum CodecID
2889 gst_ffmpeg_caps_to_codecid (const GstCaps * caps, AVCodecContext * context)
2890 {
2891   enum CodecID id = CODEC_ID_NONE;
2892   const gchar *mimetype;
2893   const GstStructure *structure;
2894   gboolean video = FALSE, audio = FALSE;        /* we want to be sure! */
2895
2896   g_return_val_if_fail (caps != NULL, CODEC_ID_NONE);
2897   g_return_val_if_fail (gst_caps_get_size (caps) == 1, CODEC_ID_NONE);
2898   structure = gst_caps_get_structure (caps, 0);
2899
2900   mimetype = gst_structure_get_name (structure);
2901
2902   if (!strcmp (mimetype, "video/x-raw")) {
2903     id = CODEC_ID_RAWVIDEO;
2904     video = TRUE;
2905   } else if (!strcmp (mimetype, "audio/x-raw")) {
2906     GstAudioInfo info;
2907
2908     if (gst_audio_info_from_caps (&info, caps)) {
2909       switch (GST_AUDIO_INFO_FORMAT (&info)) {
2910         case GST_AUDIO_FORMAT_S8:
2911           id = CODEC_ID_PCM_S8;
2912           break;
2913         case GST_AUDIO_FORMAT_U8:
2914           id = CODEC_ID_PCM_U8;
2915           break;
2916         case GST_AUDIO_FORMAT_S16LE:
2917           id = CODEC_ID_PCM_S16LE;
2918           break;
2919         case GST_AUDIO_FORMAT_S16BE:
2920           id = CODEC_ID_PCM_S16BE;
2921           break;
2922         case GST_AUDIO_FORMAT_U16LE:
2923           id = CODEC_ID_PCM_U16LE;
2924           break;
2925         case GST_AUDIO_FORMAT_U16BE:
2926           id = CODEC_ID_PCM_U16BE;
2927           break;
2928         default:
2929           break;
2930       }
2931       if (id != CODEC_ID_NONE)
2932         audio = TRUE;
2933     }
2934   } else if (!strcmp (mimetype, "audio/x-mulaw")) {
2935     id = CODEC_ID_PCM_MULAW;
2936     audio = TRUE;
2937   } else if (!strcmp (mimetype, "audio/x-alaw")) {
2938     id = CODEC_ID_PCM_ALAW;
2939     audio = TRUE;
2940   } else if (!strcmp (mimetype, "video/x-dv")) {
2941     gboolean sys_strm;
2942
2943     if (gst_structure_get_boolean (structure, "systemstream", &sys_strm) &&
2944         !sys_strm) {
2945       id = CODEC_ID_DVVIDEO;
2946       video = TRUE;
2947     }
2948   } else if (!strcmp (mimetype, "audio/x-dv")) {        /* ??? */
2949     id = CODEC_ID_DVAUDIO;
2950     audio = TRUE;
2951   } else if (!strcmp (mimetype, "video/x-h263")) {
2952     const gchar *h263version =
2953         gst_structure_get_string (structure, "h263version");
2954     if (h263version && !strcmp (h263version, "h263p"))
2955       id = CODEC_ID_H263P;
2956     else
2957       id = CODEC_ID_H263;
2958     video = TRUE;
2959   } else if (!strcmp (mimetype, "video/x-intel-h263")) {
2960     id = CODEC_ID_H263I;
2961     video = TRUE;
2962   } else if (!strcmp (mimetype, "video/x-h261")) {
2963     id = CODEC_ID_H261;
2964     video = TRUE;
2965   } else if (!strcmp (mimetype, "video/mpeg")) {
2966     gboolean sys_strm;
2967     gint mpegversion;
2968
2969     if (gst_structure_get_boolean (structure, "systemstream", &sys_strm) &&
2970         gst_structure_get_int (structure, "mpegversion", &mpegversion) &&
2971         !sys_strm) {
2972       switch (mpegversion) {
2973         case 1:
2974           id = CODEC_ID_MPEG1VIDEO;
2975           break;
2976         case 2:
2977           id = CODEC_ID_MPEG2VIDEO;
2978           break;
2979         case 4:
2980           id = CODEC_ID_MPEG4;
2981           break;
2982       }
2983     }
2984     if (id != CODEC_ID_NONE)
2985       video = TRUE;
2986   } else if (!strcmp (mimetype, "image/jpeg")) {
2987     id = CODEC_ID_MJPEG;        /* A... B... */
2988     video = TRUE;
2989   } else if (!strcmp (mimetype, "video/x-jpeg-b")) {
2990     id = CODEC_ID_MJPEGB;
2991     video = TRUE;
2992   } else if (!strcmp (mimetype, "video/x-wmv")) {
2993     gint wmvversion = 0;
2994
2995     if (gst_structure_get_int (structure, "wmvversion", &wmvversion)) {
2996       switch (wmvversion) {
2997         case 1:
2998           id = CODEC_ID_WMV1;
2999           break;
3000         case 2:
3001           id = CODEC_ID_WMV2;
3002           break;
3003         case 3:
3004         {
3005           const gchar *format;
3006
3007           /* WMV3 unless the fourcc exists and says otherwise */
3008           id = CODEC_ID_WMV3;
3009
3010           if ((format = gst_structure_get_string (structure, "format")) &&
3011               (g_str_equal (format, "WVC1") || g_str_equal (format, "WMVA")))
3012             id = CODEC_ID_VC1;
3013
3014           break;
3015         }
3016       }
3017     }
3018     if (id != CODEC_ID_NONE)
3019       video = TRUE;
3020   } else if (!strcmp (mimetype, "audio/x-vorbis")) {
3021     id = CODEC_ID_VORBIS;
3022     audio = TRUE;
3023   } else if (!strcmp (mimetype, "audio/x-qdm2")) {
3024     id = CODEC_ID_QDM2;
3025     audio = TRUE;
3026   } else if (!strcmp (mimetype, "audio/mpeg")) {
3027     gint layer = 0;
3028     gint mpegversion = 0;
3029
3030     if (gst_structure_get_int (structure, "mpegversion", &mpegversion)) {
3031       switch (mpegversion) {
3032         case 2:                /* ffmpeg uses faad for both... */
3033         case 4:
3034           id = CODEC_ID_AAC;
3035           break;
3036         case 1:
3037           if (gst_structure_get_int (structure, "layer", &layer)) {
3038             switch (layer) {
3039               case 1:
3040                 id = CODEC_ID_MP1;
3041                 break;
3042               case 2:
3043                 id = CODEC_ID_MP2;
3044                 break;
3045               case 3:
3046                 id = CODEC_ID_MP3;
3047                 break;
3048             }
3049           }
3050       }
3051     }
3052     if (id != CODEC_ID_NONE)
3053       audio = TRUE;
3054   } else if (!strcmp (mimetype, "audio/x-musepack")) {
3055     gint streamversion = -1;
3056
3057     if (gst_structure_get_int (structure, "streamversion", &streamversion)) {
3058       if (streamversion == 7)
3059         id = CODEC_ID_MUSEPACK7;
3060     } else {
3061       id = CODEC_ID_MUSEPACK7;
3062     }
3063   } else if (!strcmp (mimetype, "audio/x-wma")) {
3064     gint wmaversion = 0;
3065
3066     if (gst_structure_get_int (structure, "wmaversion", &wmaversion)) {
3067       switch (wmaversion) {
3068         case 1:
3069           id = CODEC_ID_WMAV1;
3070           break;
3071         case 2:
3072           id = CODEC_ID_WMAV2;
3073           break;
3074         case 3:
3075           id = CODEC_ID_WMAPRO;
3076           break;
3077       }
3078     }
3079     if (id != CODEC_ID_NONE)
3080       audio = TRUE;
3081   } else if (!strcmp (mimetype, "audio/x-wms")) {
3082     id = CODEC_ID_WMAVOICE;
3083     audio = TRUE;
3084   } else if (!strcmp (mimetype, "audio/x-ac3")) {
3085     id = CODEC_ID_AC3;
3086     audio = TRUE;
3087   } else if (!strcmp (mimetype, "audio/x-eac3")) {
3088     id = CODEC_ID_EAC3;
3089     audio = TRUE;
3090   } else if (!strcmp (mimetype, "audio/x-vnd.sony.atrac3") ||
3091       !strcmp (mimetype, "audio/atrac3")) {
3092     id = CODEC_ID_ATRAC3;
3093     audio = TRUE;
3094   } else if (!strcmp (mimetype, "audio/x-dts")) {
3095     id = CODEC_ID_DTS;
3096     audio = TRUE;
3097   } else if (!strcmp (mimetype, "application/x-ape")) {
3098     id = CODEC_ID_APE;
3099     audio = TRUE;
3100   } else if (!strcmp (mimetype, "video/x-msmpeg")) {
3101     gint msmpegversion = 0;
3102
3103     if (gst_structure_get_int (structure, "msmpegversion", &msmpegversion)) {
3104       switch (msmpegversion) {
3105         case 41:
3106           id = CODEC_ID_MSMPEG4V1;
3107           break;
3108         case 42:
3109           id = CODEC_ID_MSMPEG4V2;
3110           break;
3111         case 43:
3112           id = CODEC_ID_MSMPEG4V3;
3113           break;
3114       }
3115     }
3116     if (id != CODEC_ID_NONE)
3117       video = TRUE;
3118   } else if (!strcmp (mimetype, "video/x-svq")) {
3119     gint svqversion = 0;
3120
3121     if (gst_structure_get_int (structure, "svqversion", &svqversion)) {
3122       switch (svqversion) {
3123         case 1:
3124           id = CODEC_ID_SVQ1;
3125           break;
3126         case 3:
3127           id = CODEC_ID_SVQ3;
3128           break;
3129       }
3130     }
3131     if (id != CODEC_ID_NONE)
3132       video = TRUE;
3133   } else if (!strcmp (mimetype, "video/x-huffyuv")) {
3134     id = CODEC_ID_HUFFYUV;
3135     video = TRUE;
3136   } else if (!strcmp (mimetype, "audio/x-mace")) {
3137     gint maceversion = 0;
3138
3139     if (gst_structure_get_int (structure, "maceversion", &maceversion)) {
3140       switch (maceversion) {
3141         case 3:
3142           id = CODEC_ID_MACE3;
3143           break;
3144         case 6:
3145           id = CODEC_ID_MACE6;
3146           break;
3147       }
3148     }
3149     if (id != CODEC_ID_NONE)
3150       audio = TRUE;
3151   } else if (!strcmp (mimetype, "video/x-theora")) {
3152     id = CODEC_ID_THEORA;
3153     video = TRUE;
3154   } else if (!strcmp (mimetype, "video/x-vp3")) {
3155     id = CODEC_ID_VP3;
3156     video = TRUE;
3157   } else if (!strcmp (mimetype, "video/x-vp5")) {
3158     id = CODEC_ID_VP5;
3159     video = TRUE;
3160   } else if (!strcmp (mimetype, "video/x-vp6")) {
3161     id = CODEC_ID_VP6;
3162     video = TRUE;
3163   } else if (!strcmp (mimetype, "video/x-vp6-flash")) {
3164     id = CODEC_ID_VP6F;
3165     video = TRUE;
3166   } else if (!strcmp (mimetype, "video/x-vp6-alpha")) {
3167     id = CODEC_ID_VP6A;
3168     video = TRUE;
3169   } else if (!strcmp (mimetype, "video/x-vp8")) {
3170     id = CODEC_ID_VP8;
3171     video = TRUE;
3172   } else if (!strcmp (mimetype, "video/x-flash-screen")) {
3173     id = CODEC_ID_FLASHSV;
3174     video = TRUE;
3175   } else if (!strcmp (mimetype, "video/x-indeo")) {
3176     gint indeoversion = 0;
3177
3178     if (gst_structure_get_int (structure, "indeoversion", &indeoversion)) {
3179       switch (indeoversion) {
3180         case 5:
3181           id = CODEC_ID_INDEO5;
3182           break;
3183         case 4:
3184           id = CODEC_ID_INDEO4;
3185           break;
3186         case 3:
3187           id = CODEC_ID_INDEO3;
3188           break;
3189         case 2:
3190           id = CODEC_ID_INDEO2;
3191           break;
3192       }
3193       if (id != CODEC_ID_NONE)
3194         video = TRUE;
3195     }
3196   } else if (!strcmp (mimetype, "video/x-divx")) {
3197     gint divxversion = 0;
3198
3199     if (gst_structure_get_int (structure, "divxversion", &divxversion)) {
3200       switch (divxversion) {
3201         case 3:
3202           id = CODEC_ID_MSMPEG4V3;
3203           break;
3204         case 4:
3205         case 5:
3206           id = CODEC_ID_MPEG4;
3207           break;
3208       }
3209     }
3210     if (id != CODEC_ID_NONE)
3211       video = TRUE;
3212   } else if (!strcmp (mimetype, "video/x-3ivx")) {
3213     id = CODEC_ID_MPEG4;
3214     video = TRUE;
3215   } else if (!strcmp (mimetype, "video/x-xvid")) {
3216     id = CODEC_ID_MPEG4;
3217     video = TRUE;
3218   } else if (!strcmp (mimetype, "video/x-ffv")) {
3219     gint ffvversion = 0;
3220
3221     if (gst_structure_get_int (structure, "ffvversion", &ffvversion) &&
3222         ffvversion == 1) {
3223       id = CODEC_ID_FFV1;
3224       video = TRUE;
3225     }
3226   } else if (!strcmp (mimetype, "audio/x-adpcm")) {
3227     const gchar *layout;
3228
3229     layout = gst_structure_get_string (structure, "layout");
3230     if (layout == NULL) {
3231       /* break */
3232     } else if (!strcmp (layout, "quicktime")) {
3233       id = CODEC_ID_ADPCM_IMA_QT;
3234     } else if (!strcmp (layout, "microsoft")) {
3235       id = CODEC_ID_ADPCM_MS;
3236     } else if (!strcmp (layout, "dvi")) {
3237       id = CODEC_ID_ADPCM_IMA_WAV;
3238     } else if (!strcmp (layout, "4xm")) {
3239       id = CODEC_ID_ADPCM_4XM;
3240     } else if (!strcmp (layout, "smjpeg")) {
3241       id = CODEC_ID_ADPCM_IMA_SMJPEG;
3242     } else if (!strcmp (layout, "dk3")) {
3243       id = CODEC_ID_ADPCM_IMA_DK3;
3244     } else if (!strcmp (layout, "dk4")) {
3245       id = CODEC_ID_ADPCM_IMA_DK4;
3246     } else if (!strcmp (layout, "westwood")) {
3247       id = CODEC_ID_ADPCM_IMA_WS;
3248     } else if (!strcmp (layout, "iss")) {
3249       id = CODEC_ID_ADPCM_IMA_ISS;
3250     } else if (!strcmp (layout, "xa")) {
3251       id = CODEC_ID_ADPCM_XA;
3252     } else if (!strcmp (layout, "adx")) {
3253       id = CODEC_ID_ADPCM_ADX;
3254     } else if (!strcmp (layout, "ea")) {
3255       id = CODEC_ID_ADPCM_EA;
3256     } else if (!strcmp (layout, "g726")) {
3257       id = CODEC_ID_ADPCM_G726;
3258     } else if (!strcmp (layout, "g721")) {
3259       id = CODEC_ID_ADPCM_G726;
3260     } else if (!strcmp (layout, "ct")) {
3261       id = CODEC_ID_ADPCM_CT;
3262     } else if (!strcmp (layout, "swf")) {
3263       id = CODEC_ID_ADPCM_SWF;
3264     } else if (!strcmp (layout, "yamaha")) {
3265       id = CODEC_ID_ADPCM_YAMAHA;
3266     } else if (!strcmp (layout, "sbpro2")) {
3267       id = CODEC_ID_ADPCM_SBPRO_2;
3268     } else if (!strcmp (layout, "sbpro3")) {
3269       id = CODEC_ID_ADPCM_SBPRO_3;
3270     } else if (!strcmp (layout, "sbpro4")) {
3271       id = CODEC_ID_ADPCM_SBPRO_4;
3272     }
3273     if (id != CODEC_ID_NONE)
3274       audio = TRUE;
3275   } else if (!strcmp (mimetype, "video/x-4xm")) {
3276     id = CODEC_ID_4XM;
3277     video = TRUE;
3278   } else if (!strcmp (mimetype, "audio/x-dpcm")) {
3279     const gchar *layout;
3280
3281     layout = gst_structure_get_string (structure, "layout");
3282     if (!layout) {
3283       /* .. */
3284     } else if (!strcmp (layout, "roq")) {
3285       id = CODEC_ID_ROQ_DPCM;
3286     } else if (!strcmp (layout, "interplay")) {
3287       id = CODEC_ID_INTERPLAY_DPCM;
3288     } else if (!strcmp (layout, "xan")) {
3289       id = CODEC_ID_XAN_DPCM;
3290     } else if (!strcmp (layout, "sol")) {
3291       id = CODEC_ID_SOL_DPCM;
3292     }
3293     if (id != CODEC_ID_NONE)
3294       audio = TRUE;
3295   } else if (!strcmp (mimetype, "audio/x-flac")) {
3296     id = CODEC_ID_FLAC;
3297     audio = TRUE;
3298   } else if (!strcmp (mimetype, "audio/x-shorten")) {
3299     id = CODEC_ID_SHORTEN;
3300     audio = TRUE;
3301   } else if (!strcmp (mimetype, "audio/x-alac")) {
3302     id = CODEC_ID_ALAC;
3303     audio = TRUE;
3304   } else if (!strcmp (mimetype, "video/x-cinepak")) {
3305     id = CODEC_ID_CINEPAK;
3306     video = TRUE;
3307   } else if (!strcmp (mimetype, "video/x-pn-realvideo")) {
3308     gint rmversion;
3309
3310     if (gst_structure_get_int (structure, "rmversion", &rmversion)) {
3311       switch (rmversion) {
3312         case 1:
3313           id = CODEC_ID_RV10;
3314           break;
3315         case 2:
3316           id = CODEC_ID_RV20;
3317           break;
3318         case 3:
3319           id = CODEC_ID_RV30;
3320           break;
3321         case 4:
3322           id = CODEC_ID_RV40;
3323           break;
3324       }
3325     }
3326     if (id != CODEC_ID_NONE)
3327       video = TRUE;
3328   } else if (!strcmp (mimetype, "audio/x-sipro")) {
3329     id = CODEC_ID_SIPR;
3330     audio = TRUE;
3331   } else if (!strcmp (mimetype, "audio/x-pn-realaudio")) {
3332     gint raversion;
3333
3334     if (gst_structure_get_int (structure, "raversion", &raversion)) {
3335       switch (raversion) {
3336         case 1:
3337           id = CODEC_ID_RA_144;
3338           break;
3339         case 2:
3340           id = CODEC_ID_RA_288;
3341           break;
3342         case 8:
3343           id = CODEC_ID_COOK;
3344           break;
3345       }
3346     }
3347     if (id != CODEC_ID_NONE)
3348       audio = TRUE;
3349   } else if (!strcmp (mimetype, "video/x-rle")) {
3350     const gchar *layout;
3351
3352     if ((layout = gst_structure_get_string (structure, "layout"))) {
3353       if (!strcmp (layout, "microsoft")) {
3354         id = CODEC_ID_MSRLE;
3355         video = TRUE;
3356       }
3357     }
3358   } else if (!strcmp (mimetype, "video/x-xan")) {
3359     gint wcversion = 0;
3360
3361     if ((gst_structure_get_int (structure, "wcversion", &wcversion))) {
3362       switch (wcversion) {
3363         case 3:
3364           id = CODEC_ID_XAN_WC3;
3365           video = TRUE;
3366           break;
3367         case 4:
3368           id = CODEC_ID_XAN_WC4;
3369           video = TRUE;
3370           break;
3371         default:
3372           break;
3373       }
3374     }
3375   } else if (!strcmp (mimetype, "audio/AMR")) {
3376     audio = TRUE;
3377     id = CODEC_ID_AMR_NB;
3378   } else if (!strcmp (mimetype, "audio/AMR-WB")) {
3379     id = CODEC_ID_AMR_WB;
3380     audio = TRUE;
3381   } else if (!strcmp (mimetype, "audio/qcelp")) {
3382     id = CODEC_ID_QCELP;
3383     audio = TRUE;
3384   } else if (!strcmp (mimetype, "video/x-h264")) {
3385     id = CODEC_ID_H264;
3386     video = TRUE;
3387   } else if (!strcmp (mimetype, "video/x-flash-video")) {
3388     gint flvversion = 0;
3389
3390     if ((gst_structure_get_int (structure, "flvversion", &flvversion))) {
3391       switch (flvversion) {
3392         case 1:
3393           id = CODEC_ID_FLV1;
3394           video = TRUE;
3395           break;
3396         default:
3397           break;
3398       }
3399     }
3400
3401   } else if (!strcmp (mimetype, "audio/x-nellymoser")) {
3402     id = CODEC_ID_NELLYMOSER;
3403     audio = TRUE;
3404   } else if (!strncmp (mimetype, "audio/x-gst-av-", 15)) {
3405     gchar ext[16];
3406     AVCodec *codec;
3407
3408     if (strlen (mimetype) <= 30 &&
3409         sscanf (mimetype, "audio/x-gst-av-%s", ext) == 1) {
3410       if ((codec = avcodec_find_decoder_by_name (ext)) ||
3411           (codec = avcodec_find_encoder_by_name (ext))) {
3412         id = codec->id;
3413         audio = TRUE;
3414       }
3415     }
3416   } else if (!strncmp (mimetype, "video/x-gst-av-", 15)) {
3417     gchar ext[16];
3418     AVCodec *codec;
3419
3420     if (strlen (mimetype) <= 30 &&
3421         sscanf (mimetype, "video/x-gst-av-%s", ext) == 1) {
3422       if ((codec = avcodec_find_decoder_by_name (ext)) ||
3423           (codec = avcodec_find_encoder_by_name (ext))) {
3424         id = codec->id;
3425         video = TRUE;
3426       }
3427     }
3428   }
3429
3430   if (context != NULL) {
3431     if (video == TRUE) {
3432       context->codec_type = AVMEDIA_TYPE_VIDEO;
3433     } else if (audio == TRUE) {
3434       context->codec_type = AVMEDIA_TYPE_AUDIO;
3435     } else {
3436       context->codec_type = AVMEDIA_TYPE_UNKNOWN;
3437     }
3438     context->codec_id = id;
3439     gst_ffmpeg_caps_with_codecid (id, context->codec_type, caps, context);
3440   }
3441
3442   if (id != CODEC_ID_NONE) {
3443     GST_DEBUG ("The id=%d belongs to the caps %" GST_PTR_FORMAT, id, caps);
3444   } else {
3445     GST_WARNING ("Couldn't figure out the id for caps %" GST_PTR_FORMAT, caps);
3446   }
3447
3448   return id;
3449 }