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