avaudenc: 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   switch (sample_fmt) {
1751     case AV_SAMPLE_FMT_U8:
1752     case AV_SAMPLE_FMT_U8P:
1753       return GST_AUDIO_FORMAT_U8;
1754       break;
1755     case AV_SAMPLE_FMT_S16:
1756     case AV_SAMPLE_FMT_S16P:
1757       return GST_AUDIO_FORMAT_S16;
1758       break;
1759     case AV_SAMPLE_FMT_S32:
1760     case AV_SAMPLE_FMT_S32P:
1761       return GST_AUDIO_FORMAT_S32;
1762       break;
1763     case AV_SAMPLE_FMT_FLT:
1764     case AV_SAMPLE_FMT_FLTP:
1765       return GST_AUDIO_FORMAT_F32;
1766       break;
1767     case AV_SAMPLE_FMT_DBL:
1768     case AV_SAMPLE_FMT_DBLP:
1769       return GST_AUDIO_FORMAT_F64;
1770       break;
1771     default:
1772       /* .. */
1773       return GST_AUDIO_FORMAT_UNKNOWN;
1774       break;
1775   }
1776 }
1777
1778 /* Convert a FFMPEG Sample Format and optional AVCodecContext
1779  * to a GstCaps. If the context is ommitted, no fixed values
1780  * for video/audio size will be included in the GstCaps
1781  *
1782  * See below for usefullness
1783  */
1784
1785 static GstCaps *
1786 gst_ffmpeg_smpfmt_to_caps (enum AVSampleFormat sample_fmt,
1787     AVCodecContext * context, enum CodecID codec_id)
1788 {
1789   GstCaps *caps = NULL;
1790   GstAudioFormat format;
1791
1792   format = gst_ffmpeg_smpfmt_to_audioformat (sample_fmt);
1793
1794   if (format != GST_AUDIO_FORMAT_UNKNOWN) {
1795     caps = gst_ff_aud_caps_new (context, codec_id, TRUE, "audio/x-raw",
1796         "format", G_TYPE_STRING, gst_audio_format_to_string (format),
1797         "layout", G_TYPE_STRING, "interleaved", NULL);
1798     GST_LOG ("caps for sample_fmt=%d: %" GST_PTR_FORMAT, sample_fmt, caps);
1799   } else {
1800     GST_LOG ("No caps found for sample_fmt=%d", sample_fmt);
1801   }
1802
1803   return caps;
1804 }
1805
1806 GstCaps *
1807 gst_ffmpeg_codectype_to_audio_caps (AVCodecContext * context,
1808     enum CodecID codec_id, gboolean encode, AVCodec * codec)
1809 {
1810   GstCaps *caps = NULL;
1811
1812   GST_DEBUG ("context:%p, codec_id:%d, encode:%d, codec:%p",
1813       context, codec_id, encode, codec);
1814   if (codec)
1815     GST_DEBUG ("sample_fmts:%p, samplerates:%p",
1816         codec->sample_fmts, codec->supported_samplerates);
1817
1818   if (context) {
1819     /* Specific codec context */
1820     caps = gst_ffmpeg_smpfmt_to_caps (context->sample_fmt, context, codec_id);
1821   } else if (codec && codec->sample_fmts) {
1822     GstCaps *temp;
1823     int i;
1824
1825     caps = gst_caps_new_empty ();
1826     for (i = 0; codec->sample_fmts[i] != -1; i++) {
1827       temp =
1828           gst_ffmpeg_smpfmt_to_caps (codec->sample_fmts[i], context, codec_id);
1829       if (temp != NULL)
1830         gst_caps_append (caps, temp);
1831     }
1832   } else {
1833     GstCaps *temp;
1834     enum AVSampleFormat i;
1835     AVCodecContext ctx = { 0, };
1836
1837     ctx.channels = -1;
1838     caps = gst_caps_new_empty ();
1839     for (i = 0; i <= AV_SAMPLE_FMT_DBL; i++) {
1840       temp = gst_ffmpeg_smpfmt_to_caps (i, encode ? &ctx : NULL, codec_id);
1841       if (temp != NULL) {
1842         gst_caps_append (caps, temp);
1843       }
1844     }
1845   }
1846   return caps;
1847 }
1848
1849 GstCaps *
1850 gst_ffmpeg_codectype_to_video_caps (AVCodecContext * context,
1851     enum CodecID codec_id, gboolean encode, AVCodec * codec)
1852 {
1853   GstCaps *caps;
1854
1855   GST_LOG ("context:%p, codec_id:%d, encode:%d, codec:%p",
1856       context, codec_id, encode, codec);
1857
1858   if (context) {
1859     caps = gst_ffmpeg_pixfmt_to_caps (context->pix_fmt, context, codec_id);
1860   } else {
1861     GstCaps *temp;
1862     enum PixelFormat i;
1863     AVCodecContext ctx = { 0, };
1864
1865     caps = gst_caps_new_empty ();
1866     for (i = 0; i < PIX_FMT_NB; i++) {
1867       ctx.width = -1;
1868       ctx.pix_fmt = i;
1869       temp = gst_ffmpeg_pixfmt_to_caps (i, encode ? &ctx : NULL, codec_id);
1870       if (temp != NULL) {
1871         gst_caps_append (caps, temp);
1872       }
1873     }
1874   }
1875   return caps;
1876 }
1877
1878 /* Convert a FFMPEG codec Type and optional AVCodecContext
1879  * to a GstCaps. If the context is ommitted, no fixed values
1880  * for video/audio size will be included in the GstCaps
1881  *
1882  * AVMediaType is primarily meant for uncompressed data GstCaps!
1883  */
1884
1885 GstCaps *
1886 gst_ffmpeg_codectype_to_caps (enum AVMediaType codec_type,
1887     AVCodecContext * context, enum CodecID codec_id, gboolean encode)
1888 {
1889   GstCaps *caps;
1890
1891   switch (codec_type) {
1892     case AVMEDIA_TYPE_VIDEO:
1893       caps =
1894           gst_ffmpeg_codectype_to_video_caps (context, codec_id, encode, NULL);
1895       break;
1896     case AVMEDIA_TYPE_AUDIO:
1897       caps =
1898           gst_ffmpeg_codectype_to_audio_caps (context, codec_id, encode, NULL);
1899       break;
1900     default:
1901       caps = NULL;
1902       break;
1903   }
1904
1905   return caps;
1906 }
1907
1908 /* Convert a GstCaps (audio/raw) to a FFMPEG SampleFmt
1909  * and other audio properties in a AVCodecContext.
1910  *
1911  * For usefullness, see below
1912  */
1913
1914 static void
1915 gst_ffmpeg_caps_to_smpfmt (const GstCaps * caps,
1916     AVCodecContext * context, gboolean raw)
1917 {
1918   GstStructure *structure;
1919   const gchar *fmt;
1920   GstAudioFormat format = GST_AUDIO_FORMAT_UNKNOWN;
1921
1922   g_return_if_fail (gst_caps_get_size (caps) == 1);
1923
1924   structure = gst_caps_get_structure (caps, 0);
1925
1926   gst_structure_get_int (structure, "channels", &context->channels);
1927   gst_structure_get_int (structure, "rate", &context->sample_rate);
1928   gst_structure_get_int (structure, "block_align", &context->block_align);
1929   gst_structure_get_int (structure, "bitrate", &context->bit_rate);
1930
1931   if (!raw)
1932     return;
1933
1934   if (gst_structure_has_name (structure, "audio/x-raw")) {
1935     if ((fmt = gst_structure_get_string (structure, "format"))) {
1936       format = gst_audio_format_from_string (fmt);
1937     }
1938   }
1939
1940   switch (format) {
1941     case GST_AUDIO_FORMAT_F32:
1942       context->sample_fmt = AV_SAMPLE_FMT_FLT;
1943       break;
1944     case GST_AUDIO_FORMAT_F64:
1945       context->sample_fmt = AV_SAMPLE_FMT_DBL;
1946       break;
1947     case GST_AUDIO_FORMAT_S32:
1948       context->sample_fmt = AV_SAMPLE_FMT_S32;
1949       break;
1950     case GST_AUDIO_FORMAT_S16:
1951       context->sample_fmt = AV_SAMPLE_FMT_S16;
1952       break;
1953     default:
1954       break;
1955   }
1956 }
1957
1958 /* Convert a GstCaps (video/raw) to a FFMPEG PixFmt
1959  * and other video properties in a AVCodecContext.
1960  *
1961  * For usefullness, see below
1962  */
1963
1964 static void
1965 gst_ffmpeg_caps_to_pixfmt (const GstCaps * caps,
1966     AVCodecContext * context, gboolean raw)
1967 {
1968   GstStructure *structure;
1969   const GValue *fps;
1970   const GValue *par = NULL;
1971   const gchar *fmt;
1972   GstVideoFormat format = GST_VIDEO_FORMAT_UNKNOWN;
1973
1974   GST_DEBUG ("converting caps %" GST_PTR_FORMAT, caps);
1975   g_return_if_fail (gst_caps_get_size (caps) == 1);
1976   structure = gst_caps_get_structure (caps, 0);
1977
1978   gst_structure_get_int (structure, "width", &context->width);
1979   gst_structure_get_int (structure, "height", &context->height);
1980   gst_structure_get_int (structure, "bpp", &context->bits_per_coded_sample);
1981
1982   fps = gst_structure_get_value (structure, "framerate");
1983   if (fps != NULL && GST_VALUE_HOLDS_FRACTION (fps)) {
1984
1985     /* somehow these seem mixed up.. */
1986     context->time_base.den = gst_value_get_fraction_numerator (fps);
1987     context->time_base.num = gst_value_get_fraction_denominator (fps);
1988     context->ticks_per_frame = 1;
1989
1990     GST_DEBUG ("setting framerate %d/%d = %lf",
1991         context->time_base.den, context->time_base.num,
1992         1. * context->time_base.den / context->time_base.num);
1993   }
1994
1995   par = gst_structure_get_value (structure, "pixel-aspect-ratio");
1996   if (par && GST_VALUE_HOLDS_FRACTION (par)) {
1997
1998     context->sample_aspect_ratio.num = gst_value_get_fraction_numerator (par);
1999     context->sample_aspect_ratio.den = gst_value_get_fraction_denominator (par);
2000
2001     GST_DEBUG ("setting pixel-aspect-ratio %d/%d = %lf",
2002         context->sample_aspect_ratio.den, context->sample_aspect_ratio.num,
2003         1. * context->sample_aspect_ratio.den /
2004         context->sample_aspect_ratio.num);
2005   }
2006
2007   if (!raw)
2008     return;
2009
2010   g_return_if_fail (fps != NULL && GST_VALUE_HOLDS_FRACTION (fps));
2011
2012   if (gst_structure_has_name (structure, "video/x-raw")) {
2013     if ((fmt = gst_structure_get_string (structure, "format"))) {
2014       format = gst_video_format_from_string (fmt);
2015     }
2016   }
2017
2018   switch (format) {
2019     case GST_VIDEO_FORMAT_YUY2:
2020       context->pix_fmt = PIX_FMT_YUYV422;
2021       break;
2022     case GST_VIDEO_FORMAT_I420:
2023       context->pix_fmt = PIX_FMT_YUV420P;
2024       break;
2025     case GST_VIDEO_FORMAT_A420:
2026       context->pix_fmt = PIX_FMT_YUVA420P;
2027       break;
2028     case GST_VIDEO_FORMAT_Y41B:
2029       context->pix_fmt = PIX_FMT_YUV411P;
2030       break;
2031     case GST_VIDEO_FORMAT_Y42B:
2032       context->pix_fmt = PIX_FMT_YUV422P;
2033       break;
2034     case GST_VIDEO_FORMAT_YUV9:
2035       context->pix_fmt = PIX_FMT_YUV410P;
2036       break;
2037     case GST_VIDEO_FORMAT_Y444:
2038       context->pix_fmt = PIX_FMT_YUV444P;
2039       break;
2040     case GST_VIDEO_FORMAT_GRAY8:
2041       context->pix_fmt = PIX_FMT_GRAY8;
2042       break;
2043     case GST_VIDEO_FORMAT_xRGB:
2044 #if (G_BYTE_ORDER == G_BIG_ENDIAN)
2045       context->pix_fmt = PIX_FMT_RGB32;
2046 #endif
2047       break;
2048     case GST_VIDEO_FORMAT_BGRx:
2049 #if (G_BYTE_ORDER == G_LITTLE_ENDIAN)
2050       context->pix_fmt = PIX_FMT_RGB32;
2051 #endif
2052       break;
2053     case GST_VIDEO_FORMAT_RGB:
2054       context->pix_fmt = PIX_FMT_RGB24;
2055       break;
2056     case GST_VIDEO_FORMAT_BGR:
2057       context->pix_fmt = PIX_FMT_BGR24;
2058       break;
2059     case GST_VIDEO_FORMAT_RGB16:
2060       context->pix_fmt = PIX_FMT_RGB565;
2061       break;
2062     case GST_VIDEO_FORMAT_RGB15:
2063       context->pix_fmt = PIX_FMT_RGB555;
2064       break;
2065     case GST_VIDEO_FORMAT_RGB8P:
2066       context->pix_fmt = PIX_FMT_PAL8;
2067       break;
2068     default:
2069       break;
2070   }
2071 }
2072
2073 typedef struct
2074 {
2075   GstVideoFormat format;
2076   enum PixelFormat pixfmt;
2077 } PixToFmt;
2078
2079 /* FIXME : FILLME */
2080 static const PixToFmt pixtofmttable[] = {
2081   /* GST_VIDEO_FORMAT_I420, */
2082   {GST_VIDEO_FORMAT_I420, PIX_FMT_YUV420P},
2083   /* Note : this should use a different chroma placement */
2084   {GST_VIDEO_FORMAT_I420, PIX_FMT_YUVJ420P},
2085
2086   /* GST_VIDEO_FORMAT_YV12, */
2087   /* GST_VIDEO_FORMAT_YUY2, */
2088   {GST_VIDEO_FORMAT_YUY2, PIX_FMT_YUYV422},
2089   /* GST_VIDEO_FORMAT_UYVY, */
2090   {GST_VIDEO_FORMAT_UYVY, PIX_FMT_UYVY422},
2091   /* GST_VIDEO_FORMAT_AYUV, */
2092   /* GST_VIDEO_FORMAT_RGBx, */
2093   /* GST_VIDEO_FORMAT_BGRx, */
2094   /* GST_VIDEO_FORMAT_xRGB, */
2095   /* GST_VIDEO_FORMAT_xBGR, */
2096   /* GST_VIDEO_FORMAT_RGBA, */
2097   {GST_VIDEO_FORMAT_RGBA, PIX_FMT_RGBA},
2098   /* GST_VIDEO_FORMAT_BGRA, */
2099   {GST_VIDEO_FORMAT_BGRA, PIX_FMT_BGRA},
2100   /* GST_VIDEO_FORMAT_ARGB, */
2101   {GST_VIDEO_FORMAT_ARGB, PIX_FMT_ARGB},
2102   /* GST_VIDEO_FORMAT_ABGR, */
2103   {GST_VIDEO_FORMAT_ABGR, PIX_FMT_ABGR},
2104   /* GST_VIDEO_FORMAT_RGB, */
2105   {GST_VIDEO_FORMAT_RGB, PIX_FMT_RGB24},
2106   /* GST_VIDEO_FORMAT_BGR, */
2107   {GST_VIDEO_FORMAT_BGR, PIX_FMT_BGR24},
2108   /* GST_VIDEO_FORMAT_Y41B, */
2109   {GST_VIDEO_FORMAT_Y41B, PIX_FMT_YUV411P},
2110   /* GST_VIDEO_FORMAT_Y42B, */
2111   {GST_VIDEO_FORMAT_Y42B, PIX_FMT_YUV422P},
2112   {GST_VIDEO_FORMAT_Y42B, PIX_FMT_YUVJ422P},
2113   /* GST_VIDEO_FORMAT_YVYU, */
2114   /* GST_VIDEO_FORMAT_Y444, */
2115   {GST_VIDEO_FORMAT_Y444, PIX_FMT_YUV444P},
2116   {GST_VIDEO_FORMAT_Y444, PIX_FMT_YUVJ444P},
2117   /* GST_VIDEO_FORMAT_v210, */
2118   /* GST_VIDEO_FORMAT_v216, */
2119   /* GST_VIDEO_FORMAT_NV12, */
2120   {GST_VIDEO_FORMAT_NV12, PIX_FMT_NV12},
2121   /* GST_VIDEO_FORMAT_NV21, */
2122   {GST_VIDEO_FORMAT_NV21, PIX_FMT_NV21},
2123   /* GST_VIDEO_FORMAT_GRAY8, */
2124   {GST_VIDEO_FORMAT_GRAY8, PIX_FMT_GRAY8},
2125   /* GST_VIDEO_FORMAT_GRAY16_BE, */
2126   {GST_VIDEO_FORMAT_GRAY16_BE, PIX_FMT_GRAY16BE},
2127   /* GST_VIDEO_FORMAT_GRAY16_LE, */
2128   {GST_VIDEO_FORMAT_GRAY16_LE, PIX_FMT_GRAY16LE},
2129   /* GST_VIDEO_FORMAT_v308, */
2130   /* GST_VIDEO_FORMAT_Y800, */
2131   /* GST_VIDEO_FORMAT_Y16, */
2132   /* GST_VIDEO_FORMAT_RGB16, */
2133   {GST_VIDEO_FORMAT_RGB16, PIX_FMT_RGB565},
2134   /* GST_VIDEO_FORMAT_BGR16, */
2135   /* GST_VIDEO_FORMAT_RGB15, */
2136   {GST_VIDEO_FORMAT_RGB15, PIX_FMT_RGB555},
2137   /* GST_VIDEO_FORMAT_BGR15, */
2138   /* GST_VIDEO_FORMAT_UYVP, */
2139   /* GST_VIDEO_FORMAT_A420, */
2140   {GST_VIDEO_FORMAT_A420, PIX_FMT_YUVA420P},
2141   /* GST_VIDEO_FORMAT_RGB8_PALETTED, */
2142   {GST_VIDEO_FORMAT_RGB8P, PIX_FMT_PAL8},
2143   /* GST_VIDEO_FORMAT_YUV9, */
2144   {GST_VIDEO_FORMAT_YUV9, PIX_FMT_YUV410P},
2145   /* GST_VIDEO_FORMAT_YVU9, */
2146   /* GST_VIDEO_FORMAT_IYU1, */
2147   /* GST_VIDEO_FORMAT_ARGB64, */
2148   /* GST_VIDEO_FORMAT_AYUV64, */
2149   /* GST_VIDEO_FORMAT_r210, */
2150   {GST_VIDEO_FORMAT_I420_10LE, PIX_FMT_YUV420P10LE},
2151   {GST_VIDEO_FORMAT_I420_10BE, PIX_FMT_YUV420P10BE},
2152   {GST_VIDEO_FORMAT_I422_10LE, PIX_FMT_YUV422P10LE},
2153   {GST_VIDEO_FORMAT_I422_10BE, PIX_FMT_YUV422P10BE},
2154   {GST_VIDEO_FORMAT_Y444_10LE, PIX_FMT_YUV444P10LE},
2155   {GST_VIDEO_FORMAT_Y444_10BE, PIX_FMT_YUV444P10BE},
2156   {GST_VIDEO_FORMAT_GBR, PIX_FMT_GBRP},
2157   {GST_VIDEO_FORMAT_GBR_10LE, PIX_FMT_GBRP10LE},
2158   {GST_VIDEO_FORMAT_GBR_10BE, PIX_FMT_GBRP10BE},
2159 };
2160
2161 GstVideoFormat
2162 gst_ffmpeg_pixfmt_to_videoformat (enum PixelFormat pixfmt)
2163 {
2164   guint i;
2165
2166   for (i = 0; i < G_N_ELEMENTS (pixtofmttable); i++)
2167     if (pixtofmttable[i].pixfmt == pixfmt)
2168       return pixtofmttable[i].format;
2169
2170   GST_WARNING ("Unknown pixel format %d", pixfmt);
2171   return GST_VIDEO_FORMAT_UNKNOWN;
2172 }
2173
2174 enum PixelFormat
2175 gst_ffmpeg_videoformat_to_pixfmt (GstVideoFormat format)
2176 {
2177   guint i;
2178
2179   for (i = 0; i < G_N_ELEMENTS (pixtofmttable); i++)
2180     if (pixtofmttable[i].format == format)
2181       return pixtofmttable[i].pixfmt;
2182   return PIX_FMT_NONE;
2183 }
2184
2185 void
2186 gst_ffmpeg_videoinfo_to_context (GstVideoInfo * info, AVCodecContext * context)
2187 {
2188   gint i, bpp = 0;
2189
2190   context->width = GST_VIDEO_INFO_WIDTH (info);
2191   context->height = GST_VIDEO_INFO_HEIGHT (info);
2192   for (i = 0; i < GST_VIDEO_INFO_N_COMPONENTS (info); i++)
2193     bpp += GST_VIDEO_INFO_COMP_DEPTH (info, i);
2194   context->bits_per_coded_sample = bpp;
2195
2196   context->ticks_per_frame = 1;
2197   context->time_base.den = GST_VIDEO_INFO_FPS_N (info);
2198   context->time_base.num = GST_VIDEO_INFO_FPS_D (info);
2199
2200   context->sample_aspect_ratio.num = GST_VIDEO_INFO_PAR_N (info);
2201   context->sample_aspect_ratio.den = GST_VIDEO_INFO_PAR_D (info);
2202
2203   context->pix_fmt =
2204       gst_ffmpeg_videoformat_to_pixfmt (GST_VIDEO_INFO_FORMAT (info));
2205 }
2206
2207 void
2208 gst_ffmpeg_audioinfo_to_context (GstAudioInfo * info, AVCodecContext * context)
2209 {
2210   const AVCodec *codec;
2211   const enum AVSampleFormat *smpl_fmts;
2212   enum AVSampleFormat smpl_fmt = -1;
2213
2214   context->channels = info->channels;
2215   context->sample_rate = info->rate;
2216
2217   codec = context->codec;
2218
2219   smpl_fmts = codec->sample_fmts;
2220
2221   switch (info->finfo->format) {
2222     case GST_AUDIO_FORMAT_F32:
2223       if (smpl_fmts) {
2224         while (*smpl_fmts != -1) {
2225           if (*smpl_fmts == AV_SAMPLE_FMT_FLT) {
2226             smpl_fmt = *smpl_fmts;
2227             break;
2228           } else if (*smpl_fmts == AV_SAMPLE_FMT_FLTP) {
2229             smpl_fmt = *smpl_fmts;
2230           }
2231
2232           smpl_fmts++;
2233         }
2234       } else {
2235         smpl_fmt = AV_SAMPLE_FMT_FLT;
2236       }
2237       break;
2238     case GST_AUDIO_FORMAT_F64:
2239       if (smpl_fmts) {
2240         while (*smpl_fmts != -1) {
2241           if (*smpl_fmts == AV_SAMPLE_FMT_DBL) {
2242             smpl_fmt = *smpl_fmts;
2243             break;
2244           } else if (*smpl_fmts == AV_SAMPLE_FMT_DBLP) {
2245             smpl_fmt = *smpl_fmts;
2246           }
2247
2248           smpl_fmts++;
2249         }
2250       } else {
2251         smpl_fmt = AV_SAMPLE_FMT_DBL;
2252       }
2253       break;
2254     case GST_AUDIO_FORMAT_S32:
2255       if (smpl_fmts) {
2256         while (*smpl_fmts != -1) {
2257           if (*smpl_fmts == AV_SAMPLE_FMT_S32) {
2258             smpl_fmt = *smpl_fmts;
2259             break;
2260           } else if (*smpl_fmts == AV_SAMPLE_FMT_S32P) {
2261             smpl_fmt = *smpl_fmts;
2262           }
2263
2264           smpl_fmts++;
2265         }
2266       } else {
2267         smpl_fmt = AV_SAMPLE_FMT_S32;
2268       }
2269       break;
2270     case GST_AUDIO_FORMAT_S16:
2271       if (smpl_fmts) {
2272         while (*smpl_fmts != -1) {
2273           if (*smpl_fmts == AV_SAMPLE_FMT_S16) {
2274             smpl_fmt = *smpl_fmts;
2275             break;
2276           } else if (*smpl_fmts == AV_SAMPLE_FMT_S16P) {
2277             smpl_fmt = *smpl_fmts;
2278           }
2279
2280           smpl_fmts++;
2281         }
2282       } else {
2283         smpl_fmt = AV_SAMPLE_FMT_S16;
2284       }
2285       break;
2286     case GST_AUDIO_FORMAT_U8:
2287       if (smpl_fmts) {
2288         while (*smpl_fmts != -1) {
2289           if (*smpl_fmts == AV_SAMPLE_FMT_U8) {
2290             smpl_fmt = *smpl_fmts;
2291             break;
2292           } else if (*smpl_fmts == AV_SAMPLE_FMT_U8P) {
2293             smpl_fmt = *smpl_fmts;
2294           }
2295
2296           smpl_fmts++;
2297         }
2298       } else {
2299         smpl_fmt = AV_SAMPLE_FMT_U8;
2300       }
2301       break;
2302     default:
2303       break;
2304   }
2305
2306   g_assert (smpl_fmt != -1);
2307
2308   context->sample_fmt = smpl_fmt;
2309 }
2310
2311 /* Convert a GstCaps and a FFMPEG codec Type to a
2312  * AVCodecContext. If the context is ommitted, no fixed values
2313  * for video/audio size will be included in the context
2314  *
2315  * AVMediaType is primarily meant for uncompressed data GstCaps!
2316  */
2317
2318 void
2319 gst_ffmpeg_caps_with_codectype (enum AVMediaType type,
2320     const GstCaps * caps, AVCodecContext * context)
2321 {
2322   if (context == NULL)
2323     return;
2324
2325   switch (type) {
2326     case AVMEDIA_TYPE_VIDEO:
2327       gst_ffmpeg_caps_to_pixfmt (caps, context, TRUE);
2328       break;
2329
2330     case AVMEDIA_TYPE_AUDIO:
2331       gst_ffmpeg_caps_to_smpfmt (caps, context, TRUE);
2332       break;
2333
2334     default:
2335       /* unknown */
2336       break;
2337   }
2338 }
2339
2340 #if 0
2341 static void
2342 nal_escape (guint8 * dst, guint8 * src, guint size, guint * destsize)
2343 {
2344   guint8 *dstp = dst;
2345   guint8 *srcp = src;
2346   guint8 *end = src + size;
2347   gint count = 0;
2348
2349   while (srcp < end) {
2350     if (count == 2 && *srcp <= 0x03) {
2351       GST_DEBUG ("added escape code");
2352       *dstp++ = 0x03;
2353       count = 0;
2354     }
2355     if (*srcp == 0)
2356       count++;
2357     else
2358       count = 0;
2359
2360     GST_DEBUG ("copy %02x, count %d", *srcp, count);
2361     *dstp++ = *srcp++;
2362   }
2363   *destsize = dstp - dst;
2364 }
2365
2366 /* copy the config, escaping NAL units as we iterate them, if something fails we
2367  * copy everything and hope for the best. */
2368 static void
2369 copy_config (guint8 * dst, guint8 * src, guint size, guint * destsize)
2370 {
2371   guint8 *dstp = dst;
2372   guint8 *srcp = src;
2373   gint cnt, i;
2374   guint nalsize, esize;
2375
2376   /* check size */
2377   if (size < 7)
2378     goto full_copy;
2379
2380   /* check version */
2381   if (*srcp != 1)
2382     goto full_copy;
2383
2384   cnt = *(srcp + 5) & 0x1f;     /* Number of sps */
2385
2386   GST_DEBUG ("num SPS %d", cnt);
2387
2388   memcpy (dstp, srcp, 6);
2389   srcp += 6;
2390   dstp += 6;
2391
2392   for (i = 0; i < cnt; i++) {
2393     GST_DEBUG ("copy SPS %d", i);
2394     nalsize = (srcp[0] << 8) | srcp[1];
2395     nal_escape (dstp + 2, srcp + 2, nalsize, &esize);
2396     dstp[0] = esize >> 8;
2397     dstp[1] = esize & 0xff;
2398     dstp += esize + 2;
2399     srcp += nalsize + 2;
2400   }
2401
2402   cnt = *(dstp++) = *(srcp++);  /* Number of pps */
2403
2404   GST_DEBUG ("num PPS %d", cnt);
2405
2406   for (i = 0; i < cnt; i++) {
2407     GST_DEBUG ("copy PPS %d", i);
2408     nalsize = (srcp[0] << 8) | srcp[1];
2409     nal_escape (dstp + 2, srcp + 2, nalsize, &esize);
2410     dstp[0] = esize >> 8;
2411     dstp[1] = esize & 0xff;
2412     dstp += esize + 2;
2413     srcp += nalsize + 2;
2414   }
2415   *destsize = dstp - dst;
2416
2417   return;
2418
2419 full_copy:
2420   {
2421     GST_DEBUG ("something unexpected, doing full copy");
2422     memcpy (dst, src, size);
2423     *destsize = size;
2424     return;
2425   }
2426 }
2427 #endif
2428
2429 /*
2430  * caps_with_codecid () transforms a GstCaps for a known codec
2431  * ID into a filled-in context.
2432  * codec_data from caps will override possible extradata already in the context
2433  */
2434
2435 void
2436 gst_ffmpeg_caps_with_codecid (enum CodecID codec_id,
2437     enum AVMediaType codec_type, const GstCaps * caps, AVCodecContext * context)
2438 {
2439   GstStructure *str;
2440   const GValue *value;
2441   GstBuffer *buf;
2442
2443   GST_LOG ("codec_id:%d, codec_type:%d, caps:%" GST_PTR_FORMAT " context:%p",
2444       codec_id, codec_type, caps, context);
2445
2446   if (!context || !gst_caps_get_size (caps))
2447     return;
2448
2449   str = gst_caps_get_structure (caps, 0);
2450
2451   /* extradata parsing (esds [mpeg4], wma/wmv, msmpeg4v1/2/3, etc.) */
2452   if ((value = gst_structure_get_value (str, "codec_data"))) {
2453     GstMapInfo map;
2454
2455     buf = gst_value_get_buffer (value);
2456     gst_buffer_map (buf, &map, GST_MAP_READ);
2457
2458     /* free the old one if it is there */
2459     if (context->extradata)
2460       av_free (context->extradata);
2461
2462 #if 0
2463     if (codec_id == CODEC_ID_H264) {
2464       guint extrasize;
2465
2466       GST_DEBUG ("copy, escaping codec_data %d", size);
2467       /* ffmpeg h264 expects the codec_data to be escaped, there is no real
2468        * reason for this but let's just escape it for now. Start by allocating
2469        * enough space, x2 is more than enough.
2470        *
2471        * FIXME, we disabled escaping because some file already contain escaped
2472        * codec_data and then we escape twice and fail. It's better to leave it
2473        * as is, as that is what most players do. */
2474       context->extradata =
2475           av_mallocz (GST_ROUND_UP_16 (size * 2 +
2476               FF_INPUT_BUFFER_PADDING_SIZE));
2477       copy_config (context->extradata, data, size, &extrasize);
2478       GST_DEBUG ("escaped size: %d", extrasize);
2479       context->extradata_size = extrasize;
2480     } else
2481 #endif
2482     {
2483       /* allocate with enough padding */
2484       GST_DEBUG ("copy codec_data");
2485       context->extradata =
2486           av_mallocz (GST_ROUND_UP_16 (map.size +
2487               FF_INPUT_BUFFER_PADDING_SIZE));
2488       memcpy (context->extradata, map.data, map.size);
2489       context->extradata_size = map.size;
2490     }
2491
2492     /* Hack for VC1. Sometimes the first (length) byte is 0 for some files */
2493     if (codec_id == CODEC_ID_VC1 && map.size > 0 && map.data[0] == 0) {
2494       context->extradata[0] = (guint8) map.size;
2495     }
2496
2497     GST_DEBUG ("have codec data of size %" G_GSIZE_FORMAT, map.size);
2498
2499     gst_buffer_unmap (buf, &map);
2500   } else if (context->extradata == NULL && codec_id != CODEC_ID_AAC_LATM &&
2501       codec_id != CODEC_ID_FLAC) {
2502     /* no extradata, alloc dummy with 0 sized, some codecs insist on reading
2503      * extradata anyway which makes then segfault. */
2504     context->extradata =
2505         av_mallocz (GST_ROUND_UP_16 (FF_INPUT_BUFFER_PADDING_SIZE));
2506     context->extradata_size = 0;
2507     GST_DEBUG ("no codec data");
2508   }
2509
2510   switch (codec_id) {
2511     case CODEC_ID_MPEG4:
2512     {
2513       const gchar *mime = gst_structure_get_name (str);
2514
2515       if (!strcmp (mime, "video/x-divx"))
2516         context->codec_tag = GST_MAKE_FOURCC ('D', 'I', 'V', 'X');
2517       else if (!strcmp (mime, "video/x-xvid"))
2518         context->codec_tag = GST_MAKE_FOURCC ('X', 'V', 'I', 'D');
2519       else if (!strcmp (mime, "video/x-3ivx"))
2520         context->codec_tag = GST_MAKE_FOURCC ('3', 'I', 'V', '1');
2521       else if (!strcmp (mime, "video/mpeg"))
2522         context->codec_tag = GST_MAKE_FOURCC ('m', 'p', '4', 'v');
2523     }
2524       break;
2525
2526     case CODEC_ID_SVQ3:
2527       /* FIXME: this is a workaround for older gst-plugins releases
2528        * (<= 0.8.9). This should be removed at some point, because
2529        * it causes wrong decoded frame order. */
2530       if (!context->extradata) {
2531         gint halfpel_flag, thirdpel_flag, low_delay, unknown_svq3_flag;
2532         guint16 flags;
2533
2534         if (gst_structure_get_int (str, "halfpel_flag", &halfpel_flag) ||
2535             gst_structure_get_int (str, "thirdpel_flag", &thirdpel_flag) ||
2536             gst_structure_get_int (str, "low_delay", &low_delay) ||
2537             gst_structure_get_int (str, "unknown_svq3_flag",
2538                 &unknown_svq3_flag)) {
2539           context->extradata = (guint8 *) av_mallocz (0x64);
2540           g_stpcpy ((gchar *) context->extradata, "SVQ3");
2541           flags = 1 << 3;
2542           flags |= low_delay;
2543           flags = flags << 2;
2544           flags |= unknown_svq3_flag;
2545           flags = flags << 6;
2546           flags |= halfpel_flag;
2547           flags = flags << 1;
2548           flags |= thirdpel_flag;
2549           flags = flags << 3;
2550
2551           flags = GUINT16_FROM_LE (flags);
2552
2553           memcpy ((gchar *) context->extradata + 0x62, &flags, 2);
2554           context->extradata_size = 0x64;
2555         }
2556       }
2557       break;
2558
2559     case CODEC_ID_MSRLE:
2560     case CODEC_ID_QTRLE:
2561     case CODEC_ID_TSCC:
2562     case CODEC_ID_CSCD:
2563     case CODEC_ID_APE:
2564     {
2565       gint depth;
2566
2567       if (gst_structure_get_int (str, "depth", &depth)) {
2568         context->bits_per_coded_sample = depth;
2569       } else {
2570         GST_WARNING ("No depth field in caps %" GST_PTR_FORMAT, caps);
2571       }
2572
2573     }
2574       break;
2575
2576     case CODEC_ID_RV10:
2577     case CODEC_ID_RV20:
2578     case CODEC_ID_RV30:
2579     case CODEC_ID_RV40:
2580     {
2581       gint format;
2582
2583       if (gst_structure_get_int (str, "format", &format))
2584         context->sub_id = format;
2585
2586       break;
2587     }
2588     case CODEC_ID_COOK:
2589     case CODEC_ID_RA_288:
2590     case CODEC_ID_RA_144:
2591     case CODEC_ID_SIPR:
2592     {
2593       gint leaf_size;
2594       gint bitrate;
2595
2596       if (gst_structure_get_int (str, "leaf_size", &leaf_size))
2597         context->block_align = leaf_size;
2598       if (gst_structure_get_int (str, "bitrate", &bitrate))
2599         context->bit_rate = bitrate;
2600     }
2601     case CODEC_ID_ALAC:
2602       gst_structure_get_int (str, "samplesize",
2603           &context->bits_per_coded_sample);
2604       break;
2605
2606     case CODEC_ID_DVVIDEO:
2607     {
2608       const gchar *format;
2609
2610       if ((format = gst_structure_get_string (str, "format"))) {
2611
2612         if (g_str_equal (format, "YUY2"))
2613           context->pix_fmt = PIX_FMT_YUYV422;
2614         else if (g_str_equal (format, "I420"))
2615           context->pix_fmt = PIX_FMT_YUV420P;
2616         else if (g_str_equal (format, "A420"))
2617           context->pix_fmt = PIX_FMT_YUVA420P;
2618         else if (g_str_equal (format, "Y41B"))
2619           context->pix_fmt = PIX_FMT_YUV411P;
2620         else if (g_str_equal (format, "Y42B"))
2621           context->pix_fmt = PIX_FMT_YUV422P;
2622         else if (g_str_equal (format, "YUV9"))
2623           context->pix_fmt = PIX_FMT_YUV410P;
2624         else {
2625           GST_WARNING ("couldn't convert format %s" " to a pixel format",
2626               format);
2627         }
2628       } else
2629         GST_WARNING ("No specified format");
2630       break;
2631     }
2632     case CODEC_ID_H263P:
2633     {
2634       gboolean val;
2635
2636       if (!gst_structure_get_boolean (str, "annex-f", &val) || val)
2637         context->flags |= CODEC_FLAG_4MV;
2638       else
2639         context->flags &= ~CODEC_FLAG_4MV;
2640       if ((!gst_structure_get_boolean (str, "annex-i", &val) || val) &&
2641           (!gst_structure_get_boolean (str, "annex-t", &val) || val))
2642         context->flags |= CODEC_FLAG_AC_PRED;
2643       else
2644         context->flags &= ~CODEC_FLAG_AC_PRED;
2645       if (!gst_structure_get_boolean (str, "annex-j", &val) || val)
2646         context->flags |= CODEC_FLAG_LOOP_FILTER;
2647       else
2648         context->flags &= ~CODEC_FLAG_LOOP_FILTER;
2649       break;
2650     }
2651     case CODEC_ID_ADPCM_G726:
2652     {
2653       const gchar *layout;
2654
2655       if ((layout = gst_structure_get_string (str, "layout"))) {
2656         if (!strcmp (layout, "g721")) {
2657           context->sample_rate = 8000;
2658           context->channels = 1;
2659           context->bit_rate = 32000;
2660         }
2661       }
2662       break;
2663     }
2664     default:
2665       break;
2666   }
2667
2668   if (!gst_caps_is_fixed (caps))
2669     return;
2670
2671   /* common properties (width, height, fps) */
2672   switch (codec_type) {
2673     case AVMEDIA_TYPE_VIDEO:
2674       gst_ffmpeg_caps_to_pixfmt (caps, context, codec_id == CODEC_ID_RAWVIDEO);
2675       break;
2676     case AVMEDIA_TYPE_AUDIO:
2677       gst_ffmpeg_caps_to_smpfmt (caps, context, FALSE);
2678       break;
2679     default:
2680       break;
2681   }
2682
2683   /* fixup of default settings */
2684   switch (codec_id) {
2685     case CODEC_ID_QCELP:
2686       /* QCELP is always mono, no matter what the caps say */
2687       context->channels = 1;
2688       break;
2689     default:
2690       break;
2691   }
2692 }
2693
2694 /* _formatid_to_caps () is meant for muxers/demuxers, it
2695  * transforms a name (ffmpeg way of ID'ing these, why don't
2696  * they have unique numerical IDs?) to the corresponding
2697  * caps belonging to that mux-format
2698  *
2699  * Note: we don't need any additional info because the caps
2700  * isn't supposed to contain any useful info besides the
2701  * media type anyway
2702  */
2703
2704 GstCaps *
2705 gst_ffmpeg_formatid_to_caps (const gchar * format_name)
2706 {
2707   GstCaps *caps = NULL;
2708
2709   if (!strcmp (format_name, "mpeg")) {
2710     caps = gst_caps_new_simple ("video/mpeg",
2711         "systemstream", G_TYPE_BOOLEAN, TRUE, NULL);
2712   } else if (!strcmp (format_name, "mpegts")) {
2713     caps = gst_caps_new_simple ("video/mpegts",
2714         "systemstream", G_TYPE_BOOLEAN, TRUE, NULL);
2715   } else if (!strcmp (format_name, "rm")) {
2716     caps = gst_caps_new_simple ("application/x-pn-realmedia",
2717         "systemstream", G_TYPE_BOOLEAN, TRUE, NULL);
2718   } else if (!strcmp (format_name, "asf")) {
2719     caps = gst_caps_new_empty_simple ("video/x-ms-asf");
2720   } else if (!strcmp (format_name, "avi")) {
2721     caps = gst_caps_new_empty_simple ("video/x-msvideo");
2722   } else if (!strcmp (format_name, "wav")) {
2723     caps = gst_caps_new_empty_simple ("audio/x-wav");
2724   } else if (!strcmp (format_name, "ape")) {
2725     caps = gst_caps_new_empty_simple ("application/x-ape");
2726   } else if (!strcmp (format_name, "swf")) {
2727     caps = gst_caps_new_empty_simple ("application/x-shockwave-flash");
2728   } else if (!strcmp (format_name, "au")) {
2729     caps = gst_caps_new_empty_simple ("audio/x-au");
2730   } else if (!strcmp (format_name, "dv")) {
2731     caps = gst_caps_new_simple ("video/x-dv",
2732         "systemstream", G_TYPE_BOOLEAN, TRUE, NULL);
2733   } else if (!strcmp (format_name, "4xm")) {
2734     caps = gst_caps_new_empty_simple ("video/x-4xm");
2735   } else if (!strcmp (format_name, "matroska")) {
2736     caps = gst_caps_new_empty_simple ("video/x-matroska");
2737   } else if (!strcmp (format_name, "mp3")) {
2738     caps = gst_caps_new_empty_simple ("application/x-id3");
2739   } else if (!strcmp (format_name, "flic")) {
2740     caps = gst_caps_new_empty_simple ("video/x-fli");
2741   } else if (!strcmp (format_name, "flv")) {
2742     caps = gst_caps_new_empty_simple ("video/x-flv");
2743   } else if (!strcmp (format_name, "tta")) {
2744     caps = gst_caps_new_empty_simple ("audio/x-ttafile");
2745   } else if (!strcmp (format_name, "aiff")) {
2746     caps = gst_caps_new_empty_simple ("audio/x-aiff");
2747   } else if (!strcmp (format_name, "mov_mp4_m4a_3gp_3g2")) {
2748     caps =
2749         gst_caps_from_string
2750         ("application/x-3gp; video/quicktime; audio/x-m4a");
2751   } else if (!strcmp (format_name, "mov")) {
2752     caps = gst_caps_from_string ("video/quicktime,variant=(string)apple");
2753   } else if (!strcmp (format_name, "mp4")) {
2754     caps = gst_caps_from_string ("video/quicktime,variant=(string)iso");
2755   } else if (!strcmp (format_name, "3gp")) {
2756     caps = gst_caps_from_string ("video/quicktime,variant=(string)3gpp");
2757   } else if (!strcmp (format_name, "3g2")) {
2758     caps = gst_caps_from_string ("video/quicktime,variant=(string)3g2");
2759   } else if (!strcmp (format_name, "psp")) {
2760     caps = gst_caps_from_string ("video/quicktime,variant=(string)psp");
2761   } else if (!strcmp (format_name, "ipod")) {
2762     caps = gst_caps_from_string ("video/quicktime,variant=(string)ipod");
2763   } else if (!strcmp (format_name, "aac")) {
2764     caps = gst_caps_new_simple ("audio/mpeg",
2765         "mpegversion", G_TYPE_INT, 4, NULL);
2766   } else if (!strcmp (format_name, "gif")) {
2767     caps = gst_caps_from_string ("image/gif");
2768   } else if (!strcmp (format_name, "ogg")) {
2769     caps = gst_caps_from_string ("application/ogg");
2770   } else if (!strcmp (format_name, "mxf") || !strcmp (format_name, "mxf_d10")) {
2771     caps = gst_caps_from_string ("application/mxf");
2772   } else if (!strcmp (format_name, "gxf")) {
2773     caps = gst_caps_from_string ("application/gxf");
2774   } else if (!strcmp (format_name, "yuv4mpegpipe")) {
2775     caps = gst_caps_new_simple ("application/x-yuv4mpeg",
2776         "y4mversion", G_TYPE_INT, 2, NULL);
2777   } else if (!strcmp (format_name, "mpc")) {
2778     caps = gst_caps_from_string ("audio/x-musepack, streamversion = (int) 7");
2779   } else if (!strcmp (format_name, "vqf")) {
2780     caps = gst_caps_from_string ("audio/x-vqf");
2781   } else if (!strcmp (format_name, "nsv")) {
2782     caps = gst_caps_from_string ("video/x-nsv");
2783   } else if (!strcmp (format_name, "amr")) {
2784     caps = gst_caps_from_string ("audio/x-amr-nb-sh");
2785   } else if (!strcmp (format_name, "webm")) {
2786     caps = gst_caps_from_string ("video/webm");
2787   } else if (!strcmp (format_name, "voc")) {
2788     caps = gst_caps_from_string ("audio/x-voc");
2789   } else {
2790     gchar *name;
2791
2792     GST_LOG ("Could not create stream format caps for %s", format_name);
2793     name = g_strdup_printf ("application/x-gst-av-%s", format_name);
2794     caps = gst_caps_new_empty_simple (name);
2795     g_free (name);
2796   }
2797
2798   return caps;
2799 }
2800
2801 gboolean
2802 gst_ffmpeg_formatid_get_codecids (const gchar * format_name,
2803     enum CodecID ** video_codec_list, enum CodecID ** audio_codec_list,
2804     AVOutputFormat * plugin)
2805 {
2806   static enum CodecID tmp_vlist[] = {
2807     CODEC_ID_NONE,
2808     CODEC_ID_NONE
2809   };
2810   static enum CodecID tmp_alist[] = {
2811     CODEC_ID_NONE,
2812     CODEC_ID_NONE
2813   };
2814
2815   GST_LOG ("format_name : %s", format_name);
2816
2817   if (!strcmp (format_name, "mp4")) {
2818     static enum CodecID mp4_video_list[] = {
2819       CODEC_ID_MPEG4, CODEC_ID_H264,
2820       CODEC_ID_MJPEG,
2821       CODEC_ID_NONE
2822     };
2823     static enum CodecID mp4_audio_list[] = {
2824       CODEC_ID_AAC, CODEC_ID_MP3,
2825       CODEC_ID_NONE
2826     };
2827
2828     *video_codec_list = mp4_video_list;
2829     *audio_codec_list = mp4_audio_list;
2830   } else if (!strcmp (format_name, "mpeg")) {
2831     static enum CodecID mpeg_video_list[] = { CODEC_ID_MPEG1VIDEO,
2832       CODEC_ID_MPEG2VIDEO,
2833       CODEC_ID_H264,
2834       CODEC_ID_NONE
2835     };
2836     static enum CodecID mpeg_audio_list[] = { CODEC_ID_MP1,
2837       CODEC_ID_MP2,
2838       CODEC_ID_MP3,
2839       CODEC_ID_NONE
2840     };
2841
2842     *video_codec_list = mpeg_video_list;
2843     *audio_codec_list = mpeg_audio_list;
2844   } else if (!strcmp (format_name, "dvd")) {
2845     static enum CodecID mpeg_video_list[] = { CODEC_ID_MPEG2VIDEO,
2846       CODEC_ID_NONE
2847     };
2848     static enum CodecID mpeg_audio_list[] = { CODEC_ID_MP2,
2849       CODEC_ID_AC3,
2850       CODEC_ID_DTS,
2851       CODEC_ID_PCM_S16BE,
2852       CODEC_ID_NONE
2853     };
2854
2855     *video_codec_list = mpeg_video_list;
2856     *audio_codec_list = mpeg_audio_list;
2857   } else if (!strcmp (format_name, "mpegts")) {
2858     static enum CodecID mpegts_video_list[] = { CODEC_ID_MPEG1VIDEO,
2859       CODEC_ID_MPEG2VIDEO,
2860       CODEC_ID_H264,
2861       CODEC_ID_NONE
2862     };
2863     static enum CodecID mpegts_audio_list[] = { CODEC_ID_MP2,
2864       CODEC_ID_MP3,
2865       CODEC_ID_AC3,
2866       CODEC_ID_DTS,
2867       CODEC_ID_AAC,
2868       CODEC_ID_NONE
2869     };
2870
2871     *video_codec_list = mpegts_video_list;
2872     *audio_codec_list = mpegts_audio_list;
2873   } else if (!strcmp (format_name, "vob")) {
2874     static enum CodecID vob_video_list[] =
2875         { CODEC_ID_MPEG2VIDEO, CODEC_ID_NONE };
2876     static enum CodecID vob_audio_list[] = { CODEC_ID_MP2, CODEC_ID_AC3,
2877       CODEC_ID_DTS, CODEC_ID_NONE
2878     };
2879
2880     *video_codec_list = vob_video_list;
2881     *audio_codec_list = vob_audio_list;
2882   } else if (!strcmp (format_name, "flv")) {
2883     static enum CodecID flv_video_list[] = { CODEC_ID_FLV1, CODEC_ID_NONE };
2884     static enum CodecID flv_audio_list[] = { CODEC_ID_MP3, CODEC_ID_NONE };
2885
2886     *video_codec_list = flv_video_list;
2887     *audio_codec_list = flv_audio_list;
2888   } else if (!strcmp (format_name, "asf")) {
2889     static enum CodecID asf_video_list[] =
2890         { CODEC_ID_WMV1, CODEC_ID_WMV2, CODEC_ID_MSMPEG4V3, CODEC_ID_NONE };
2891     static enum CodecID asf_audio_list[] =
2892         { CODEC_ID_WMAV1, CODEC_ID_WMAV2, CODEC_ID_MP3, CODEC_ID_NONE };
2893
2894     *video_codec_list = asf_video_list;
2895     *audio_codec_list = asf_audio_list;
2896   } else if (!strcmp (format_name, "dv")) {
2897     static enum CodecID dv_video_list[] = { CODEC_ID_DVVIDEO, CODEC_ID_NONE };
2898     static enum CodecID dv_audio_list[] = { CODEC_ID_PCM_S16LE, CODEC_ID_NONE };
2899
2900     *video_codec_list = dv_video_list;
2901     *audio_codec_list = dv_audio_list;
2902   } else if (!strcmp (format_name, "mov")) {
2903     static enum CodecID mov_video_list[] = {
2904       CODEC_ID_SVQ1, CODEC_ID_SVQ3, CODEC_ID_MPEG4,
2905       CODEC_ID_H263, CODEC_ID_H263P,
2906       CODEC_ID_H264, CODEC_ID_DVVIDEO,
2907       CODEC_ID_MJPEG,
2908       CODEC_ID_NONE
2909     };
2910     static enum CodecID mov_audio_list[] = {
2911       CODEC_ID_PCM_MULAW, CODEC_ID_PCM_ALAW, CODEC_ID_ADPCM_IMA_QT,
2912       CODEC_ID_MACE3, CODEC_ID_MACE6, CODEC_ID_AAC,
2913       CODEC_ID_AMR_NB, CODEC_ID_AMR_WB,
2914       CODEC_ID_PCM_S16BE, CODEC_ID_PCM_S16LE,
2915       CODEC_ID_MP3, CODEC_ID_NONE
2916     };
2917
2918     *video_codec_list = mov_video_list;
2919     *audio_codec_list = mov_audio_list;
2920   } else if ((!strcmp (format_name, "3gp") || !strcmp (format_name, "3g2"))) {
2921     static enum CodecID tgp_video_list[] = {
2922       CODEC_ID_MPEG4, CODEC_ID_H263, CODEC_ID_H263P, CODEC_ID_H264,
2923       CODEC_ID_NONE
2924     };
2925     static enum CodecID tgp_audio_list[] = {
2926       CODEC_ID_AMR_NB, CODEC_ID_AMR_WB,
2927       CODEC_ID_AAC,
2928       CODEC_ID_NONE
2929     };
2930
2931     *video_codec_list = tgp_video_list;
2932     *audio_codec_list = tgp_audio_list;
2933   } else if (!strcmp (format_name, "mmf")) {
2934     static enum CodecID mmf_audio_list[] = {
2935       CODEC_ID_ADPCM_YAMAHA, CODEC_ID_NONE
2936     };
2937     *video_codec_list = NULL;
2938     *audio_codec_list = mmf_audio_list;
2939   } else if (!strcmp (format_name, "amr")) {
2940     static enum CodecID amr_audio_list[] = {
2941       CODEC_ID_AMR_NB, CODEC_ID_AMR_WB,
2942       CODEC_ID_NONE
2943     };
2944     *video_codec_list = NULL;
2945     *audio_codec_list = amr_audio_list;
2946   } else if (!strcmp (format_name, "gif")) {
2947     static enum CodecID gif_image_list[] = {
2948       CODEC_ID_RAWVIDEO, CODEC_ID_NONE
2949     };
2950     *video_codec_list = gif_image_list;
2951     *audio_codec_list = NULL;
2952   } else if ((plugin->audio_codec != CODEC_ID_NONE) ||
2953       (plugin->video_codec != CODEC_ID_NONE)) {
2954     tmp_vlist[0] = plugin->video_codec;
2955     tmp_alist[0] = plugin->audio_codec;
2956
2957     *video_codec_list = tmp_vlist;
2958     *audio_codec_list = tmp_alist;
2959   } else {
2960     GST_LOG ("Format %s not found", format_name);
2961     return FALSE;
2962   }
2963
2964   return TRUE;
2965 }
2966
2967 /* Convert a GstCaps to a FFMPEG codec ID. Size et all
2968  * are omitted, that can be queried by the user itself,
2969  * we're not eating the GstCaps or anything
2970  * A pointer to an allocated context is also needed for
2971  * optional extra info
2972  */
2973
2974 enum CodecID
2975 gst_ffmpeg_caps_to_codecid (const GstCaps * caps, AVCodecContext * context)
2976 {
2977   enum CodecID id = CODEC_ID_NONE;
2978   const gchar *mimetype;
2979   const GstStructure *structure;
2980   gboolean video = FALSE, audio = FALSE;        /* we want to be sure! */
2981
2982   g_return_val_if_fail (caps != NULL, CODEC_ID_NONE);
2983   g_return_val_if_fail (gst_caps_get_size (caps) == 1, CODEC_ID_NONE);
2984   structure = gst_caps_get_structure (caps, 0);
2985
2986   mimetype = gst_structure_get_name (structure);
2987
2988   if (!strcmp (mimetype, "video/x-raw")) {
2989     id = CODEC_ID_RAWVIDEO;
2990     video = TRUE;
2991   } else if (!strcmp (mimetype, "audio/x-raw")) {
2992     GstAudioInfo info;
2993
2994     if (gst_audio_info_from_caps (&info, caps)) {
2995       switch (GST_AUDIO_INFO_FORMAT (&info)) {
2996         case GST_AUDIO_FORMAT_S8:
2997           id = CODEC_ID_PCM_S8;
2998           break;
2999         case GST_AUDIO_FORMAT_U8:
3000           id = CODEC_ID_PCM_U8;
3001           break;
3002         case GST_AUDIO_FORMAT_S16LE:
3003           id = CODEC_ID_PCM_S16LE;
3004           break;
3005         case GST_AUDIO_FORMAT_S16BE:
3006           id = CODEC_ID_PCM_S16BE;
3007           break;
3008         case GST_AUDIO_FORMAT_U16LE:
3009           id = CODEC_ID_PCM_U16LE;
3010           break;
3011         case GST_AUDIO_FORMAT_U16BE:
3012           id = CODEC_ID_PCM_U16BE;
3013           break;
3014         default:
3015           break;
3016       }
3017       if (id != CODEC_ID_NONE)
3018         audio = TRUE;
3019     }
3020   } else if (!strcmp (mimetype, "audio/x-mulaw")) {
3021     id = CODEC_ID_PCM_MULAW;
3022     audio = TRUE;
3023   } else if (!strcmp (mimetype, "audio/x-alaw")) {
3024     id = CODEC_ID_PCM_ALAW;
3025     audio = TRUE;
3026   } else if (!strcmp (mimetype, "video/x-dv")) {
3027     gboolean sys_strm;
3028
3029     if (gst_structure_get_boolean (structure, "systemstream", &sys_strm) &&
3030         !sys_strm) {
3031       id = CODEC_ID_DVVIDEO;
3032       video = TRUE;
3033     }
3034   } else if (!strcmp (mimetype, "audio/x-dv")) {        /* ??? */
3035     id = CODEC_ID_DVAUDIO;
3036     audio = TRUE;
3037   } else if (!strcmp (mimetype, "video/x-h263")) {
3038     const gchar *h263version =
3039         gst_structure_get_string (structure, "h263version");
3040     if (h263version && !strcmp (h263version, "h263p"))
3041       id = CODEC_ID_H263P;
3042     else
3043       id = CODEC_ID_H263;
3044     video = TRUE;
3045   } else if (!strcmp (mimetype, "video/x-intel-h263")) {
3046     id = CODEC_ID_H263I;
3047     video = TRUE;
3048   } else if (!strcmp (mimetype, "video/x-h261")) {
3049     id = CODEC_ID_H261;
3050     video = TRUE;
3051   } else if (!strcmp (mimetype, "video/mpeg")) {
3052     gboolean sys_strm;
3053     gint mpegversion;
3054
3055     if (gst_structure_get_boolean (structure, "systemstream", &sys_strm) &&
3056         gst_structure_get_int (structure, "mpegversion", &mpegversion) &&
3057         !sys_strm) {
3058       switch (mpegversion) {
3059         case 1:
3060           id = CODEC_ID_MPEG1VIDEO;
3061           break;
3062         case 2:
3063           id = CODEC_ID_MPEG2VIDEO;
3064           break;
3065         case 4:
3066           id = CODEC_ID_MPEG4;
3067           break;
3068       }
3069     }
3070     if (id != CODEC_ID_NONE)
3071       video = TRUE;
3072   } else if (!strcmp (mimetype, "image/jpeg")) {
3073     id = CODEC_ID_MJPEG;        /* A... B... */
3074     video = TRUE;
3075   } else if (!strcmp (mimetype, "video/x-jpeg-b")) {
3076     id = CODEC_ID_MJPEGB;
3077     video = TRUE;
3078   } else if (!strcmp (mimetype, "video/x-wmv")) {
3079     gint wmvversion = 0;
3080
3081     if (gst_structure_get_int (structure, "wmvversion", &wmvversion)) {
3082       switch (wmvversion) {
3083         case 1:
3084           id = CODEC_ID_WMV1;
3085           break;
3086         case 2:
3087           id = CODEC_ID_WMV2;
3088           break;
3089         case 3:
3090         {
3091           const gchar *format;
3092
3093           /* WMV3 unless the fourcc exists and says otherwise */
3094           id = CODEC_ID_WMV3;
3095
3096           if ((format = gst_structure_get_string (structure, "format")) &&
3097               (g_str_equal (format, "WVC1") || g_str_equal (format, "WMVA")))
3098             id = CODEC_ID_VC1;
3099
3100           break;
3101         }
3102       }
3103     }
3104     if (id != CODEC_ID_NONE)
3105       video = TRUE;
3106   } else if (!strcmp (mimetype, "audio/x-vorbis")) {
3107     id = CODEC_ID_VORBIS;
3108     audio = TRUE;
3109   } else if (!strcmp (mimetype, "audio/x-qdm2")) {
3110     id = CODEC_ID_QDM2;
3111     audio = TRUE;
3112   } else if (!strcmp (mimetype, "audio/mpeg")) {
3113     gint layer = 0;
3114     gint mpegversion = 0;
3115
3116     if (gst_structure_get_int (structure, "mpegversion", &mpegversion)) {
3117       switch (mpegversion) {
3118         case 2:                /* ffmpeg uses faad for both... */
3119         case 4:
3120           id = CODEC_ID_AAC;
3121           break;
3122         case 1:
3123           if (gst_structure_get_int (structure, "layer", &layer)) {
3124             switch (layer) {
3125               case 1:
3126                 id = CODEC_ID_MP1;
3127                 break;
3128               case 2:
3129                 id = CODEC_ID_MP2;
3130                 break;
3131               case 3:
3132                 id = CODEC_ID_MP3;
3133                 break;
3134             }
3135           }
3136       }
3137     }
3138     if (id != CODEC_ID_NONE)
3139       audio = TRUE;
3140   } else if (!strcmp (mimetype, "audio/x-musepack")) {
3141     gint streamversion = -1;
3142
3143     if (gst_structure_get_int (structure, "streamversion", &streamversion)) {
3144       if (streamversion == 7)
3145         id = CODEC_ID_MUSEPACK7;
3146     } else {
3147       id = CODEC_ID_MUSEPACK7;
3148     }
3149   } else if (!strcmp (mimetype, "audio/x-wma")) {
3150     gint wmaversion = 0;
3151
3152     if (gst_structure_get_int (structure, "wmaversion", &wmaversion)) {
3153       switch (wmaversion) {
3154         case 1:
3155           id = CODEC_ID_WMAV1;
3156           break;
3157         case 2:
3158           id = CODEC_ID_WMAV2;
3159           break;
3160         case 3:
3161           id = CODEC_ID_WMAPRO;
3162           break;
3163       }
3164     }
3165     if (id != CODEC_ID_NONE)
3166       audio = TRUE;
3167   } else if (!strcmp (mimetype, "audio/x-wms")) {
3168     id = CODEC_ID_WMAVOICE;
3169     audio = TRUE;
3170   } else if (!strcmp (mimetype, "audio/x-ac3")) {
3171     id = CODEC_ID_AC3;
3172     audio = TRUE;
3173   } else if (!strcmp (mimetype, "audio/x-eac3")) {
3174     id = CODEC_ID_EAC3;
3175     audio = TRUE;
3176   } else if (!strcmp (mimetype, "audio/x-vnd.sony.atrac3") ||
3177       !strcmp (mimetype, "audio/atrac3")) {
3178     id = CODEC_ID_ATRAC3;
3179     audio = TRUE;
3180   } else if (!strcmp (mimetype, "audio/x-dts")) {
3181     id = CODEC_ID_DTS;
3182     audio = TRUE;
3183   } else if (!strcmp (mimetype, "application/x-ape")) {
3184     id = CODEC_ID_APE;
3185     audio = TRUE;
3186   } else if (!strcmp (mimetype, "video/x-msmpeg")) {
3187     gint msmpegversion = 0;
3188
3189     if (gst_structure_get_int (structure, "msmpegversion", &msmpegversion)) {
3190       switch (msmpegversion) {
3191         case 41:
3192           id = CODEC_ID_MSMPEG4V1;
3193           break;
3194         case 42:
3195           id = CODEC_ID_MSMPEG4V2;
3196           break;
3197         case 43:
3198           id = CODEC_ID_MSMPEG4V3;
3199           break;
3200       }
3201     }
3202     if (id != CODEC_ID_NONE)
3203       video = TRUE;
3204   } else if (!strcmp (mimetype, "video/x-svq")) {
3205     gint svqversion = 0;
3206
3207     if (gst_structure_get_int (structure, "svqversion", &svqversion)) {
3208       switch (svqversion) {
3209         case 1:
3210           id = CODEC_ID_SVQ1;
3211           break;
3212         case 3:
3213           id = CODEC_ID_SVQ3;
3214           break;
3215       }
3216     }
3217     if (id != CODEC_ID_NONE)
3218       video = TRUE;
3219   } else if (!strcmp (mimetype, "video/x-huffyuv")) {
3220     id = CODEC_ID_HUFFYUV;
3221     video = TRUE;
3222   } else if (!strcmp (mimetype, "audio/x-mace")) {
3223     gint maceversion = 0;
3224
3225     if (gst_structure_get_int (structure, "maceversion", &maceversion)) {
3226       switch (maceversion) {
3227         case 3:
3228           id = CODEC_ID_MACE3;
3229           break;
3230         case 6:
3231           id = CODEC_ID_MACE6;
3232           break;
3233       }
3234     }
3235     if (id != CODEC_ID_NONE)
3236       audio = TRUE;
3237   } else if (!strcmp (mimetype, "video/x-theora")) {
3238     id = CODEC_ID_THEORA;
3239     video = TRUE;
3240   } else if (!strcmp (mimetype, "video/x-vp3")) {
3241     id = CODEC_ID_VP3;
3242     video = TRUE;
3243   } else if (!strcmp (mimetype, "video/x-vp5")) {
3244     id = CODEC_ID_VP5;
3245     video = TRUE;
3246   } else if (!strcmp (mimetype, "video/x-vp6")) {
3247     id = CODEC_ID_VP6;
3248     video = TRUE;
3249   } else if (!strcmp (mimetype, "video/x-vp6-flash")) {
3250     id = CODEC_ID_VP6F;
3251     video = TRUE;
3252   } else if (!strcmp (mimetype, "video/x-vp6-alpha")) {
3253     id = CODEC_ID_VP6A;
3254     video = TRUE;
3255   } else if (!strcmp (mimetype, "video/x-vp8")) {
3256     id = CODEC_ID_VP8;
3257     video = TRUE;
3258   } else if (!strcmp (mimetype, "video/x-flash-screen")) {
3259     id = CODEC_ID_FLASHSV;
3260     video = TRUE;
3261   } else if (!strcmp (mimetype, "video/x-indeo")) {
3262     gint indeoversion = 0;
3263
3264     if (gst_structure_get_int (structure, "indeoversion", &indeoversion)) {
3265       switch (indeoversion) {
3266         case 5:
3267           id = CODEC_ID_INDEO5;
3268           break;
3269         case 4:
3270           id = CODEC_ID_INDEO4;
3271           break;
3272         case 3:
3273           id = CODEC_ID_INDEO3;
3274           break;
3275         case 2:
3276           id = CODEC_ID_INDEO2;
3277           break;
3278       }
3279       if (id != CODEC_ID_NONE)
3280         video = TRUE;
3281     }
3282   } else if (!strcmp (mimetype, "video/x-divx")) {
3283     gint divxversion = 0;
3284
3285     if (gst_structure_get_int (structure, "divxversion", &divxversion)) {
3286       switch (divxversion) {
3287         case 3:
3288           id = CODEC_ID_MSMPEG4V3;
3289           break;
3290         case 4:
3291         case 5:
3292           id = CODEC_ID_MPEG4;
3293           break;
3294       }
3295     }
3296     if (id != CODEC_ID_NONE)
3297       video = TRUE;
3298   } else if (!strcmp (mimetype, "video/x-3ivx")) {
3299     id = CODEC_ID_MPEG4;
3300     video = TRUE;
3301   } else if (!strcmp (mimetype, "video/x-xvid")) {
3302     id = CODEC_ID_MPEG4;
3303     video = TRUE;
3304   } else if (!strcmp (mimetype, "video/x-ffv")) {
3305     gint ffvversion = 0;
3306
3307     if (gst_structure_get_int (structure, "ffvversion", &ffvversion) &&
3308         ffvversion == 1) {
3309       id = CODEC_ID_FFV1;
3310       video = TRUE;
3311     }
3312   } else if (!strcmp (mimetype, "audio/x-adpcm")) {
3313     const gchar *layout;
3314
3315     layout = gst_structure_get_string (structure, "layout");
3316     if (layout == NULL) {
3317       /* break */
3318     } else if (!strcmp (layout, "quicktime")) {
3319       id = CODEC_ID_ADPCM_IMA_QT;
3320     } else if (!strcmp (layout, "microsoft")) {
3321       id = CODEC_ID_ADPCM_MS;
3322     } else if (!strcmp (layout, "dvi")) {
3323       id = CODEC_ID_ADPCM_IMA_WAV;
3324     } else if (!strcmp (layout, "4xm")) {
3325       id = CODEC_ID_ADPCM_4XM;
3326     } else if (!strcmp (layout, "smjpeg")) {
3327       id = CODEC_ID_ADPCM_IMA_SMJPEG;
3328     } else if (!strcmp (layout, "dk3")) {
3329       id = CODEC_ID_ADPCM_IMA_DK3;
3330     } else if (!strcmp (layout, "dk4")) {
3331       id = CODEC_ID_ADPCM_IMA_DK4;
3332     } else if (!strcmp (layout, "westwood")) {
3333       id = CODEC_ID_ADPCM_IMA_WS;
3334     } else if (!strcmp (layout, "iss")) {
3335       id = CODEC_ID_ADPCM_IMA_ISS;
3336     } else if (!strcmp (layout, "xa")) {
3337       id = CODEC_ID_ADPCM_XA;
3338     } else if (!strcmp (layout, "adx")) {
3339       id = CODEC_ID_ADPCM_ADX;
3340     } else if (!strcmp (layout, "ea")) {
3341       id = CODEC_ID_ADPCM_EA;
3342     } else if (!strcmp (layout, "g726")) {
3343       id = CODEC_ID_ADPCM_G726;
3344     } else if (!strcmp (layout, "g721")) {
3345       id = CODEC_ID_ADPCM_G726;
3346     } else if (!strcmp (layout, "ct")) {
3347       id = CODEC_ID_ADPCM_CT;
3348     } else if (!strcmp (layout, "swf")) {
3349       id = CODEC_ID_ADPCM_SWF;
3350     } else if (!strcmp (layout, "yamaha")) {
3351       id = CODEC_ID_ADPCM_YAMAHA;
3352     } else if (!strcmp (layout, "sbpro2")) {
3353       id = CODEC_ID_ADPCM_SBPRO_2;
3354     } else if (!strcmp (layout, "sbpro3")) {
3355       id = CODEC_ID_ADPCM_SBPRO_3;
3356     } else if (!strcmp (layout, "sbpro4")) {
3357       id = CODEC_ID_ADPCM_SBPRO_4;
3358     }
3359     if (id != CODEC_ID_NONE)
3360       audio = TRUE;
3361   } else if (!strcmp (mimetype, "video/x-4xm")) {
3362     id = CODEC_ID_4XM;
3363     video = TRUE;
3364   } else if (!strcmp (mimetype, "audio/x-dpcm")) {
3365     const gchar *layout;
3366
3367     layout = gst_structure_get_string (structure, "layout");
3368     if (!layout) {
3369       /* .. */
3370     } else if (!strcmp (layout, "roq")) {
3371       id = CODEC_ID_ROQ_DPCM;
3372     } else if (!strcmp (layout, "interplay")) {
3373       id = CODEC_ID_INTERPLAY_DPCM;
3374     } else if (!strcmp (layout, "xan")) {
3375       id = CODEC_ID_XAN_DPCM;
3376     } else if (!strcmp (layout, "sol")) {
3377       id = CODEC_ID_SOL_DPCM;
3378     }
3379     if (id != CODEC_ID_NONE)
3380       audio = TRUE;
3381   } else if (!strcmp (mimetype, "audio/x-flac")) {
3382     id = CODEC_ID_FLAC;
3383     audio = TRUE;
3384   } else if (!strcmp (mimetype, "audio/x-shorten")) {
3385     id = CODEC_ID_SHORTEN;
3386     audio = TRUE;
3387   } else if (!strcmp (mimetype, "audio/x-alac")) {
3388     id = CODEC_ID_ALAC;
3389     audio = TRUE;
3390   } else if (!strcmp (mimetype, "video/x-cinepak")) {
3391     id = CODEC_ID_CINEPAK;
3392     video = TRUE;
3393   } else if (!strcmp (mimetype, "video/x-pn-realvideo")) {
3394     gint rmversion;
3395
3396     if (gst_structure_get_int (structure, "rmversion", &rmversion)) {
3397       switch (rmversion) {
3398         case 1:
3399           id = CODEC_ID_RV10;
3400           break;
3401         case 2:
3402           id = CODEC_ID_RV20;
3403           break;
3404         case 3:
3405           id = CODEC_ID_RV30;
3406           break;
3407         case 4:
3408           id = CODEC_ID_RV40;
3409           break;
3410       }
3411     }
3412     if (id != CODEC_ID_NONE)
3413       video = TRUE;
3414   } else if (!strcmp (mimetype, "audio/x-sipro")) {
3415     id = CODEC_ID_SIPR;
3416     audio = TRUE;
3417   } else if (!strcmp (mimetype, "audio/x-pn-realaudio")) {
3418     gint raversion;
3419
3420     if (gst_structure_get_int (structure, "raversion", &raversion)) {
3421       switch (raversion) {
3422         case 1:
3423           id = CODEC_ID_RA_144;
3424           break;
3425         case 2:
3426           id = CODEC_ID_RA_288;
3427           break;
3428         case 8:
3429           id = CODEC_ID_COOK;
3430           break;
3431       }
3432     }
3433     if (id != CODEC_ID_NONE)
3434       audio = TRUE;
3435   } else if (!strcmp (mimetype, "video/x-rle")) {
3436     const gchar *layout;
3437
3438     if ((layout = gst_structure_get_string (structure, "layout"))) {
3439       if (!strcmp (layout, "microsoft")) {
3440         id = CODEC_ID_MSRLE;
3441         video = TRUE;
3442       }
3443     }
3444   } else if (!strcmp (mimetype, "video/x-xan")) {
3445     gint wcversion = 0;
3446
3447     if ((gst_structure_get_int (structure, "wcversion", &wcversion))) {
3448       switch (wcversion) {
3449         case 3:
3450           id = CODEC_ID_XAN_WC3;
3451           video = TRUE;
3452           break;
3453         case 4:
3454           id = CODEC_ID_XAN_WC4;
3455           video = TRUE;
3456           break;
3457         default:
3458           break;
3459       }
3460     }
3461   } else if (!strcmp (mimetype, "audio/AMR")) {
3462     audio = TRUE;
3463     id = CODEC_ID_AMR_NB;
3464   } else if (!strcmp (mimetype, "audio/AMR-WB")) {
3465     id = CODEC_ID_AMR_WB;
3466     audio = TRUE;
3467   } else if (!strcmp (mimetype, "audio/qcelp")) {
3468     id = CODEC_ID_QCELP;
3469     audio = TRUE;
3470   } else if (!strcmp (mimetype, "video/x-h264")) {
3471     id = CODEC_ID_H264;
3472     video = TRUE;
3473   } else if (!strcmp (mimetype, "video/x-flash-video")) {
3474     gint flvversion = 0;
3475
3476     if ((gst_structure_get_int (structure, "flvversion", &flvversion))) {
3477       switch (flvversion) {
3478         case 1:
3479           id = CODEC_ID_FLV1;
3480           video = TRUE;
3481           break;
3482         default:
3483           break;
3484       }
3485     }
3486
3487   } else if (!strcmp (mimetype, "audio/x-nellymoser")) {
3488     id = CODEC_ID_NELLYMOSER;
3489     audio = TRUE;
3490   } else if (!strncmp (mimetype, "audio/x-gst-av-", 15)) {
3491     gchar ext[16];
3492     AVCodec *codec;
3493
3494     if (strlen (mimetype) <= 30 &&
3495         sscanf (mimetype, "audio/x-gst-av-%s", ext) == 1) {
3496       if ((codec = avcodec_find_decoder_by_name (ext)) ||
3497           (codec = avcodec_find_encoder_by_name (ext))) {
3498         id = codec->id;
3499         audio = TRUE;
3500       }
3501     }
3502   } else if (!strncmp (mimetype, "video/x-gst-av-", 15)) {
3503     gchar ext[16];
3504     AVCodec *codec;
3505
3506     if (strlen (mimetype) <= 30 &&
3507         sscanf (mimetype, "video/x-gst-av-%s", ext) == 1) {
3508       if ((codec = avcodec_find_decoder_by_name (ext)) ||
3509           (codec = avcodec_find_encoder_by_name (ext))) {
3510         id = codec->id;
3511         video = TRUE;
3512       }
3513     }
3514   }
3515
3516   if (context != NULL) {
3517     if (video == TRUE) {
3518       context->codec_type = AVMEDIA_TYPE_VIDEO;
3519     } else if (audio == TRUE) {
3520       context->codec_type = AVMEDIA_TYPE_AUDIO;
3521     } else {
3522       context->codec_type = AVMEDIA_TYPE_UNKNOWN;
3523     }
3524     context->codec_id = id;
3525     gst_ffmpeg_caps_with_codecid (id, context->codec_type, caps, context);
3526   }
3527
3528   if (id != CODEC_ID_NONE) {
3529     GST_DEBUG ("The id=%d belongs to the caps %" GST_PTR_FORMAT, id, caps);
3530   } else {
3531     GST_WARNING ("Couldn't figure out the id for caps %" GST_PTR_FORMAT, caps);
3532   }
3533
3534   return id;
3535 }