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