~ubuntu-branches/ubuntu/intrepid/gstreamer0.10-ffmpeg/intrepid

« back to all changes in this revision

Viewing changes to ext/ffmpeg/gstffmpegcodecmap.c

  • Committer: Bazaar Package Importer
  • Author(s): Sebastien Bacher
  • Date: 2005-12-17 23:59:34 UTC
  • Revision ID: james.westby@ubuntu.com-20051217235934-qu7f84arvb9r3id3
Tags: upstream-0.10.0
ImportĀ upstreamĀ versionĀ 0.10.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
#include <gst/gst.h>
 
26
#ifdef HAVE_FFMPEG_UNINSTALLED
 
27
#include <avcodec.h>
 
28
#else
 
29
#include <ffmpeg/avcodec.h>
 
30
#endif
 
31
#include <string.h>
 
32
 
 
33
#include "gstffmpeg.h"
 
34
#include "gstffmpegcodecmap.h"
 
35
 
 
36
/*
 
37
 * Read a palette from a caps.
 
38
 */
 
39
 
 
40
static void
 
41
gst_ffmpeg_get_palette (const GstCaps *caps, AVCodecContext *context)
 
42
{
 
43
  GstStructure *str = gst_caps_get_structure (caps, 0);
 
44
  const GValue *palette_v;
 
45
  const GstBuffer *palette;
 
46
 
 
47
  /* do we have a palette? */
 
48
  if ((palette_v = gst_structure_get_value (str,
 
49
          "palette_data")) && context) {
 
50
    palette = g_value_get_boxed (palette_v);
 
51
    if (GST_BUFFER_SIZE (palette) >= 256 * 4) {
 
52
      if (context->palctrl)
 
53
        av_free (context->palctrl);
 
54
      context->palctrl = av_malloc (sizeof (AVPaletteControl));
 
55
      context->palctrl->palette_changed = 1;
 
56
      memcpy (context->palctrl->palette, GST_BUFFER_DATA (palette),
 
57
          AVPALETTE_SIZE);
 
58
    }
 
59
  }
 
60
}
 
61
 
 
62
static void
 
63
gst_ffmpeg_set_palette (GstCaps *caps, AVCodecContext *context)
 
64
{
 
65
  if (context->palctrl) {
 
66
    GstBuffer *palette = gst_buffer_new_and_alloc (256 * 4);
 
67
 
 
68
    memcpy (GST_BUFFER_DATA (palette), context->palctrl->palette,
 
69
        AVPALETTE_SIZE);
 
70
    gst_caps_set_simple (caps,
 
71
        "palette_data", GST_TYPE_BUFFER, palette, NULL);
 
72
  }
 
73
}
 
74
 
 
75
/* this macro makes a caps width fixed or unfixed width/height
 
76
 * properties depending on whether we've got a context.
 
77
 *
 
78
 * See below for why we use this.
 
79
 *
 
80
 * We should actually do this stuff at the end, like in riff-media.c,
 
81
 * but I'm too lazy today. Maybe later.
 
82
 */
 
83
 
 
84
#define GST_FF_VID_CAPS_NEW(mimetype, ...)                      \
 
85
    (context != NULL) ?                                         \
 
86
    gst_caps_new_simple (mimetype,                              \
 
87
        "width",     G_TYPE_INT,   context->width,              \
 
88
        "height",    G_TYPE_INT,   context->height,             \
 
89
        "framerate", GST_TYPE_FRACTION, context->time_base.den, \
 
90
        context->time_base.num, __VA_ARGS__, NULL)                                      \
 
91
    :                                                           \
 
92
    gst_caps_new_simple (mimetype,                              \
 
93
        "width",     GST_TYPE_INT_RANGE, 16, 4096,              \
 
94
        "height",    GST_TYPE_INT_RANGE, 16, 4096,              \
 
95
        "framerate", GST_TYPE_FRACTION_RANGE, 0, 1,             \
 
96
        G_MAXINT, 1, __VA_ARGS__, NULL)
 
97
 
 
98
/* same for audio - now with channels/sample rate
 
99
 */
 
100
 
 
101
#define GST_FF_AUD_CAPS_NEW(mimetype, ...)                      \
 
102
    (context != NULL) ?                                         \
 
103
    gst_caps_new_simple (mimetype,                              \
 
104
        "rate", G_TYPE_INT, context->sample_rate,               \
 
105
        "channels", G_TYPE_INT, context->channels,              \
 
106
        __VA_ARGS__, NULL)                                      \
 
107
    :                                                           \
 
108
    gst_caps_new_simple (mimetype,                              \
 
109
        "rate", GST_TYPE_INT_RANGE, 8000, 96000,                \
 
110
        "channels", GST_TYPE_INT_RANGE, 1, 2,                   \
 
111
        __VA_ARGS__, NULL)
 
112
 
 
113
/* Convert a FFMPEG codec ID and optional AVCodecContext
 
114
 * to a GstCaps. If the context is ommitted, no fixed values
 
115
 * for video/audio size will be included in the GstCaps
 
116
 *
 
117
 * CodecID is primarily meant for compressed data GstCaps!
 
118
 *
 
119
 * encode is a special parameter. gstffmpegdec will say
 
120
 * FALSE, gstffmpegenc will say TRUE. The output caps
 
121
 * depends on this, in such a way that it will be very
 
122
 * specific, defined, fixed and correct caps for encoders,
 
123
 * yet very wide, "forgiving" caps for decoders. Example
 
124
 * for mp3: decode: audio/mpeg,mpegversion=1,layer=[1-3]
 
125
 * but encode: audio/mpeg,mpegversion=1,layer=3,bitrate=x,
 
126
 * rate=x,channels=x.
 
127
 */
 
128
 
 
129
GstCaps *
 
130
gst_ffmpeg_codecid_to_caps (enum CodecID codec_id,
 
131
    AVCodecContext * context, gboolean encode)
 
132
{
 
133
  GstCaps *caps = NULL;
 
134
  gboolean buildcaps = FALSE;
 
135
 
 
136
  switch (codec_id) {
 
137
    case CODEC_ID_MPEG1VIDEO:
 
138
      /* For decoding, CODEC_ID_MPEG2VIDEO is preferred... So omit here */
 
139
      if (encode) {
 
140
        /* FIXME: bitrate */
 
141
        caps = GST_FF_VID_CAPS_NEW ("video/mpeg",
 
142
            "mpegversion", G_TYPE_INT, 1,
 
143
            "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
 
144
      }
 
145
      break;
 
146
 
 
147
    case CODEC_ID_MPEG2VIDEO:
 
148
      if (encode) {
 
149
        /* FIXME: bitrate */
 
150
        caps = GST_FF_VID_CAPS_NEW ("video/mpeg",
 
151
            "mpegversion", G_TYPE_INT, 2,
 
152
            "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
 
153
      } else {
 
154
        /* decode both MPEG-1 and MPEG-2; width/height/fps are all in
 
155
         * the MPEG video stream headers, so may be omitted from caps. */
 
156
        caps = gst_caps_new_simple ("video/mpeg",
 
157
            "mpegversion", GST_TYPE_INT_RANGE, 1, 2,
 
158
            "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
 
159
      }
 
160
      break;
 
161
 
 
162
    case CODEC_ID_MPEG2VIDEO_XVMC:
 
163
      /* this is a special ID - don't need it in GStreamer, I think */
 
164
      break;
 
165
 
 
166
      /* I don't know the exact differences between those... Anyone? */
 
167
    case CODEC_ID_H263:
 
168
    case CODEC_ID_H263P:
 
169
      caps = GST_FF_VID_CAPS_NEW ("video/x-h263", NULL);
 
170
      break;
 
171
 
 
172
    case CODEC_ID_H263I:
 
173
      caps = GST_FF_VID_CAPS_NEW ("video/x-intel-h263", NULL);
 
174
      break;
 
175
 
 
176
    case CODEC_ID_H261:
 
177
      caps = GST_FF_VID_CAPS_NEW ("video/x-h261", NULL);
 
178
      break;
 
179
 
 
180
    case CODEC_ID_RV10:
 
181
    case CODEC_ID_RV20:
 
182
      {
 
183
        gint version = (codec_id == CODEC_ID_RV10) ? 1 : 2;
 
184
 
 
185
        /* FIXME: context->sub_id must be filled in during decoding */
 
186
        caps = GST_FF_VID_CAPS_NEW ("video/x-pn-realvideo",
 
187
            "systemstream", G_TYPE_BOOLEAN, FALSE,
 
188
            "rmversion", G_TYPE_INT, version, NULL);
 
189
        if (context) {
 
190
          gst_caps_set_simple (caps,
 
191
              "rmsubid", GST_TYPE_FOURCC, context->sub_id, NULL);
 
192
        }
 
193
      }
 
194
      break;
 
195
 
 
196
    case CODEC_ID_MP2:
 
197
      /* we use CODEC_ID_MP3 for decoding */
 
198
      if (encode) {
 
199
        /* FIXME: bitrate */
 
200
        caps = GST_FF_AUD_CAPS_NEW ("audio/mpeg",
 
201
            "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 2, NULL);
 
202
      }
 
203
      break;
 
204
 
 
205
    case CODEC_ID_MP3:
 
206
      if (encode) {
 
207
        /* FIXME: bitrate */
 
208
        caps = GST_FF_AUD_CAPS_NEW ("audio/mpeg",
 
209
            "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, NULL);
 
210
      } else {
 
211
        /* Decodes MPEG-1 layer 1/2/3. Samplerate, channels et al are
 
212
         * in the MPEG audio header, so may be omitted from caps. */
 
213
        caps = gst_caps_new_simple ("audio/mpeg",
 
214
            "mpegversion", G_TYPE_INT, 1,
 
215
            "layer", GST_TYPE_INT_RANGE, 1, 3, NULL);
 
216
      }
 
217
      break;
 
218
 
 
219
    case CODEC_ID_VORBIS:
 
220
      /* This one is disabled for several reasons:
 
221
       * - GStreamer already has perfect Ogg and Vorbis support
 
222
       * - The ffmpeg implementation depends on libvorbis/libogg,
 
223
       *   which are not included in the ffmpeg that GStreamer ships.
 
224
       * - The ffmpeg implementation depends on shared objects between
 
225
       *   the ogg demuxer and vorbis decoder, which GStreamer doesn't.
 
226
       */
 
227
      break;
 
228
 
 
229
    case CODEC_ID_AC3:
 
230
      /* Decoding is disabled, because:
 
231
       * - it depends on liba52, which we don't ship in ffmpeg.
 
232
       * - we already have a liba52 plugin ourselves.
 
233
       */
 
234
      if (encode) {
 
235
        /* FIXME: bitrate */
 
236
        caps = GST_FF_AUD_CAPS_NEW ("audio/x-ac3", NULL);
 
237
      }
 
238
      break;
 
239
 
 
240
      /* MJPEG is normal JPEG, Motion-JPEG and Quicktime MJPEG-A. MJPEGB
 
241
       * is Quicktime's MJPEG-B. LJPEG is lossless JPEG. I don't know what
 
242
       * sp5x is, but it's apparently something JPEG... We don't separate
 
243
       * between those in GStreamer. Should we (at least between MJPEG,
 
244
       * MJPEG-B and sp5x decoding...)? */
 
245
    case CODEC_ID_MJPEG:
 
246
    case CODEC_ID_LJPEG:
 
247
    case CODEC_ID_SP5X:
 
248
      caps = GST_FF_VID_CAPS_NEW ("image/jpeg", NULL);
 
249
      break;
 
250
 
 
251
    case CODEC_ID_MJPEGB:
 
252
      caps = GST_FF_VID_CAPS_NEW ("video/x-mjpeg-b", NULL);
 
253
      break;
 
254
 
 
255
    case CODEC_ID_MPEG4:
 
256
      if (encode && context != NULL) {
 
257
        /* I'm not exactly sure what ffmpeg outputs... ffmpeg itself uses
 
258
         * the AVI fourcc 'DIVX', but 'mp4v' for Quicktime... */
 
259
        switch (context->codec_tag) {
 
260
          case GST_MAKE_FOURCC ('D', 'I', 'V', 'X'):
 
261
            caps = GST_FF_VID_CAPS_NEW ("video/x-divx",
 
262
                "divxversion", G_TYPE_INT, 5, NULL);
 
263
            break;
 
264
          case GST_MAKE_FOURCC ('m', 'p', '4', 'v'):
 
265
          default:
 
266
            /* FIXME: bitrate */
 
267
            caps = GST_FF_VID_CAPS_NEW ("video/mpeg",
 
268
                "systemstream", G_TYPE_BOOLEAN, FALSE,
 
269
                "mpegversion", G_TYPE_INT, 4, NULL);
 
270
            break;
 
271
        }
 
272
      } else {
 
273
        /* The trick here is to separate xvid, divx, mpeg4, 3ivx et al */
 
274
        caps = GST_FF_VID_CAPS_NEW ("video/mpeg",
 
275
            "mpegversion", G_TYPE_INT, 4,
 
276
            "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
 
277
        if (encode) {
 
278
          gst_caps_append (caps, GST_FF_VID_CAPS_NEW ("video/x-divx",
 
279
              "divxversion", G_TYPE_INT, 5, NULL));
 
280
        } else {
 
281
          gst_caps_append (caps, GST_FF_VID_CAPS_NEW ("video/x-divx",
 
282
              "divxversion", GST_TYPE_INT_RANGE, 4, 5, NULL));
 
283
          gst_caps_append (caps, GST_FF_VID_CAPS_NEW ("video/x-xvid", NULL));
 
284
          gst_caps_append (caps, GST_FF_VID_CAPS_NEW ("video/x-3ivx", NULL));
 
285
        }
 
286
      }
 
287
      break;
 
288
 
 
289
    case CODEC_ID_RAWVIDEO:
 
290
      caps = gst_ffmpeg_codectype_to_caps (CODEC_TYPE_VIDEO, context);
 
291
      break;
 
292
 
 
293
    case CODEC_ID_MSMPEG4V1:
 
294
    case CODEC_ID_MSMPEG4V2:
 
295
    case CODEC_ID_MSMPEG4V3:
 
296
      {
 
297
        gint version = 41 + codec_id - CODEC_ID_MSMPEG4V1;
 
298
 
 
299
        /* encode-FIXME: bitrate */
 
300
        caps = GST_FF_VID_CAPS_NEW ("video/x-msmpeg",
 
301
            "msmpegversion", G_TYPE_INT, version, NULL);
 
302
        if (!encode && codec_id == CODEC_ID_MSMPEG4V3) {
 
303
          gst_caps_append (caps, GST_FF_VID_CAPS_NEW ("video/x-divx",
 
304
              "divxversion", G_TYPE_INT, 3, NULL));
 
305
        }
 
306
      }
 
307
      break;
 
308
 
 
309
    case CODEC_ID_WMV1:
 
310
    case CODEC_ID_WMV2:
 
311
      {
 
312
        gint version = (codec_id == CODEC_ID_WMV1) ? 1 : 2;
 
313
 
 
314
        caps = GST_FF_VID_CAPS_NEW ("video/x-wmv",
 
315
            "wmvversion", G_TYPE_INT, version, NULL);
 
316
      }
 
317
      break;
 
318
 
 
319
    case CODEC_ID_FLV1:
 
320
      buildcaps = TRUE;
 
321
      break;
 
322
 
 
323
    case CODEC_ID_SVQ1:
 
324
      caps = GST_FF_VID_CAPS_NEW ("video/x-svq",
 
325
          "svqversion", G_TYPE_INT, 1, NULL);
 
326
      break;
 
327
 
 
328
    case CODEC_ID_SVQ3:
 
329
      caps = GST_FF_VID_CAPS_NEW ("video/x-svq",
 
330
          "svqversion", G_TYPE_INT, 3, NULL);
 
331
      break;
 
332
 
 
333
    case CODEC_ID_DVAUDIO:
 
334
      caps = GST_FF_AUD_CAPS_NEW ("audio/x-dv", NULL);
 
335
      break;
 
336
 
 
337
    case CODEC_ID_DVVIDEO:
 
338
      caps = GST_FF_VID_CAPS_NEW ("video/x-dv",
 
339
          "systemstream", G_TYPE_BOOLEAN, FALSE,
 
340
          NULL);
 
341
      break;
 
342
 
 
343
    case CODEC_ID_WMAV1:
 
344
    case CODEC_ID_WMAV2:
 
345
      {
 
346
        gint version = (codec_id == CODEC_ID_WMAV1) ? 1 : 2;
 
347
 
 
348
        if (context) {
 
349
          caps = GST_FF_AUD_CAPS_NEW ("audio/x-wma",
 
350
             "wmaversion", G_TYPE_INT, version,
 
351
             "block_align", G_TYPE_INT, context->block_align,
 
352
             "bitrate", G_TYPE_INT, context->bit_rate, NULL);
 
353
        } else {
 
354
          caps = GST_FF_AUD_CAPS_NEW ("audio/x-wma",
 
355
             "wmaversion", G_TYPE_INT, version,
 
356
             "block_align", GST_TYPE_INT_RANGE, 0, G_MAXINT,
 
357
             "bitrate", GST_TYPE_INT_RANGE, 0, G_MAXINT, NULL);
 
358
        }
 
359
      }
 
360
      break;
 
361
 
 
362
    case CODEC_ID_MACE3:
 
363
    case CODEC_ID_MACE6:
 
364
      {
 
365
        gint version = (codec_id == CODEC_ID_MACE3) ? 3 : 6;
 
366
 
 
367
        caps = GST_FF_AUD_CAPS_NEW ("audio/x-mace",
 
368
            "maceversion", G_TYPE_INT, version, NULL);
 
369
      }
 
370
      break;
 
371
 
 
372
    case CODEC_ID_HUFFYUV:
 
373
      caps = GST_FF_VID_CAPS_NEW ("video/x-huffyuv", NULL);
 
374
      if (context) {
 
375
        gst_caps_set_simple (caps,
 
376
            "bpp", G_TYPE_INT, context->bits_per_sample, NULL);
 
377
      }
 
378
      break;
 
379
 
 
380
    case CODEC_ID_CYUV:
 
381
      buildcaps = TRUE;
 
382
      break;
 
383
 
 
384
    case CODEC_ID_H264:
 
385
      caps = GST_FF_VID_CAPS_NEW ("video/x-h264", NULL);
 
386
      break;
 
387
 
 
388
    case CODEC_ID_INDEO3:
 
389
      caps = GST_FF_VID_CAPS_NEW ("video/x-indeo",
 
390
          "indeoversion", G_TYPE_INT, 3, NULL);
 
391
      break;
 
392
 
 
393
    case CODEC_ID_INDEO2:
 
394
      caps = GST_FF_VID_CAPS_NEW ("video/x-indeo",
 
395
          "indeoversion", G_TYPE_INT, 2, NULL);
 
396
      break;
 
397
 
 
398
    case CODEC_ID_VP3:
 
399
      caps = GST_FF_VID_CAPS_NEW ("video/x-vp3", NULL);
 
400
      break;
 
401
 
 
402
    case CODEC_ID_THEORA:
 
403
      caps = GST_FF_VID_CAPS_NEW ("video/x-theora", NULL);
 
404
      break;
 
405
 
 
406
    case CODEC_ID_AAC:
 
407
    case CODEC_ID_MPEG4AAC:
 
408
      caps = GST_FF_AUD_CAPS_NEW ("audio/mpeg",
 
409
          "mpegversion", G_TYPE_INT, 4, NULL);
 
410
      break;
 
411
 
 
412
    case CODEC_ID_ASV1:
 
413
    case CODEC_ID_ASV2:
 
414
      buildcaps = TRUE;
 
415
      break;
 
416
 
 
417
    case CODEC_ID_FFV1:
 
418
      caps = GST_FF_VID_CAPS_NEW ("video/x-ffv",
 
419
          "ffvversion", G_TYPE_INT, 1, NULL);
 
420
      break;
 
421
 
 
422
    case CODEC_ID_4XM:
 
423
      caps = GST_FF_VID_CAPS_NEW ("video/x-4xm", NULL);
 
424
      break;
 
425
 
 
426
    case CODEC_ID_XAN_WC3:
 
427
    case CODEC_ID_XAN_WC4:
 
428
      caps = GST_FF_VID_CAPS_NEW ("video/x-xan",
 
429
          "wcversion", G_TYPE_INT, 3 - CODEC_ID_XAN_WC3 + codec_id, NULL);
 
430
      break;
 
431
 
 
432
    case CODEC_ID_FRAPS:
 
433
    case CODEC_ID_VCR1:
 
434
    case CODEC_ID_CLJR:
 
435
    case CODEC_ID_MDEC:
 
436
    case CODEC_ID_ROQ:
 
437
    case CODEC_ID_INTERPLAY_VIDEO:
 
438
      buildcaps = TRUE;
 
439
      break;
 
440
 
 
441
    case CODEC_ID_RPZA:
 
442
      caps = GST_FF_VID_CAPS_NEW ("video/x-apple-video", NULL);
 
443
      break;
 
444
 
 
445
    case CODEC_ID_CINEPAK:
 
446
      caps = GST_FF_VID_CAPS_NEW ("video/x-cinepak", NULL);
 
447
      break;
 
448
 
 
449
    /* WS_VQA belogns here (order) */
 
450
 
 
451
    case CODEC_ID_MSRLE:
 
452
      caps = GST_FF_VID_CAPS_NEW ("video/x-rle",
 
453
          "layout", G_TYPE_STRING, "microsoft", NULL);
 
454
      if (context) {
 
455
        gst_caps_set_simple (caps,
 
456
            "depth", G_TYPE_INT, (gint) context->bits_per_sample, NULL);
 
457
      } else {
 
458
        gst_caps_set_simple (caps, "depth", GST_TYPE_INT_RANGE, 1, 64, NULL);
 
459
      }
 
460
      break;
 
461
 
 
462
    case CODEC_ID_QTRLE:
 
463
      caps = GST_FF_VID_CAPS_NEW ("video/x-rle",
 
464
          "layout", G_TYPE_STRING, "quicktime", NULL);
 
465
      if (context) {
 
466
        gst_caps_set_simple (caps,
 
467
            "depth", G_TYPE_INT, (gint) context->bits_per_sample, NULL);
 
468
      } else {
 
469
        gst_caps_set_simple (caps, "depth", GST_TYPE_INT_RANGE, 1, 64, NULL);
 
470
      }
 
471
      break;
 
472
 
 
473
    case CODEC_ID_MSVIDEO1:
 
474
      caps = GST_FF_VID_CAPS_NEW ("video/x-msvideocodec",
 
475
          "msvideoversion", G_TYPE_INT, 1, NULL);
 
476
      break;
 
477
 
 
478
    case CODEC_ID_WMV3:
 
479
    case CODEC_ID_VC9:
 
480
      caps = GST_FF_VID_CAPS_NEW ("video/x-wmv",
 
481
          "wmvversion", G_TYPE_INT, 3, NULL);
 
482
      break;
 
483
    case CODEC_ID_QDM2:
 
484
      caps = GST_FF_AUD_CAPS_NEW ("audio/x-qdm2", NULL);
 
485
      break;  
 
486
 
 
487
    case CODEC_ID_WS_VQA:
 
488
    case CODEC_ID_IDCIN:
 
489
    case CODEC_ID_8BPS:
 
490
    case CODEC_ID_SMC:
 
491
    case CODEC_ID_FLIC:
 
492
    case CODEC_ID_TRUEMOTION1:
 
493
    case CODEC_ID_TRUEMOTION2:
 
494
    case CODEC_ID_VMDVIDEO:
 
495
    case CODEC_ID_VMDAUDIO:
 
496
    case CODEC_ID_MSZH:
 
497
    case CODEC_ID_ZLIB:
 
498
    case CODEC_ID_SONIC:
 
499
    case CODEC_ID_SONIC_LS:
 
500
    case CODEC_ID_SNOW:
 
501
    case CODEC_ID_TSCC:
 
502
    case CODEC_ID_ULTI:
 
503
    case CODEC_ID_QDRAW:
 
504
    case CODEC_ID_VIXL:
 
505
    case CODEC_ID_QPEG:
 
506
    case CODEC_ID_XVID:
 
507
    case CODEC_ID_PNG:
 
508
    case CODEC_ID_PPM:
 
509
    case CODEC_ID_PBM:
 
510
    case CODEC_ID_PGM:
 
511
    case CODEC_ID_PGMYUV:
 
512
    case CODEC_ID_PAM:
 
513
    case CODEC_ID_FFVHUFF:
 
514
    case CODEC_ID_LOCO:
 
515
    case CODEC_ID_WNV1:
 
516
    case CODEC_ID_AASC:
 
517
    case CODEC_ID_MP3ADU:
 
518
    case CODEC_ID_MP3ON4:
 
519
    case CODEC_ID_WESTWOOD_SND1:
 
520
      buildcaps = TRUE;
 
521
      break;
 
522
 
 
523
      /* weird quasi-codecs for the demuxers only */
 
524
    case CODEC_ID_PCM_S16LE:
 
525
    case CODEC_ID_PCM_S16BE:
 
526
    case CODEC_ID_PCM_U16LE:
 
527
    case CODEC_ID_PCM_U16BE:
 
528
    case CODEC_ID_PCM_S8:
 
529
    case CODEC_ID_PCM_U8:
 
530
      {
 
531
        gint width = 0, depth = 0, endianness = 0;
 
532
        gboolean signedness = FALSE;    /* blabla */
 
533
 
 
534
        switch (codec_id) {
 
535
          case CODEC_ID_PCM_S16LE:
 
536
            width = 16;
 
537
            depth = 16;
 
538
            endianness = G_LITTLE_ENDIAN;
 
539
            signedness = TRUE;
 
540
            break;
 
541
          case CODEC_ID_PCM_S16BE:
 
542
            width = 16;
 
543
            depth = 16;
 
544
            endianness = G_BIG_ENDIAN;
 
545
            signedness = TRUE;
 
546
            break;
 
547
          case CODEC_ID_PCM_U16LE:
 
548
            width = 16;
 
549
            depth = 16;
 
550
            endianness = G_LITTLE_ENDIAN;
 
551
            signedness = FALSE;
 
552
            break;
 
553
          case CODEC_ID_PCM_U16BE:
 
554
            width = 16;
 
555
            depth = 16;
 
556
            endianness = G_BIG_ENDIAN;
 
557
            signedness = FALSE;
 
558
            break;
 
559
          case CODEC_ID_PCM_S8:
 
560
            width = 8;
 
561
            depth = 8;
 
562
            endianness = G_BYTE_ORDER;
 
563
            signedness = TRUE;
 
564
            break;
 
565
          case CODEC_ID_PCM_U8:
 
566
            width = 8;
 
567
            depth = 8;
 
568
            endianness = G_BYTE_ORDER;
 
569
            signedness = FALSE;
 
570
            break;
 
571
          default:
 
572
            g_assert (0);       /* don't worry, we never get here */
 
573
            break;
 
574
        }
 
575
 
 
576
        caps = GST_FF_AUD_CAPS_NEW ("audio/x-raw-int",
 
577
            "width", G_TYPE_INT, width,
 
578
            "depth", G_TYPE_INT, depth,
 
579
            "endianness", G_TYPE_INT, endianness,
 
580
            "signed", G_TYPE_BOOLEAN, signedness, NULL);
 
581
      }
 
582
      break;
 
583
 
 
584
    case CODEC_ID_PCM_MULAW:
 
585
      caps = GST_FF_AUD_CAPS_NEW ("audio/x-mulaw", NULL);
 
586
      break;
 
587
 
 
588
    case CODEC_ID_PCM_ALAW:
 
589
      caps = GST_FF_AUD_CAPS_NEW ("audio/x-alaw", NULL);
 
590
      break;
 
591
 
 
592
    case CODEC_ID_ADPCM_IMA_QT:
 
593
    case CODEC_ID_ADPCM_IMA_WAV:
 
594
    case CODEC_ID_ADPCM_IMA_DK3:
 
595
    case CODEC_ID_ADPCM_IMA_DK4:
 
596
    case CODEC_ID_ADPCM_IMA_WS:
 
597
    case CODEC_ID_ADPCM_IMA_SMJPEG:
 
598
    case CODEC_ID_ADPCM_MS:
 
599
    case CODEC_ID_ADPCM_4XM:
 
600
    case CODEC_ID_ADPCM_XA:
 
601
    case CODEC_ID_ADPCM_ADX:
 
602
    case CODEC_ID_ADPCM_EA:
 
603
    case CODEC_ID_ADPCM_G726:
 
604
    case CODEC_ID_ADPCM_CT:
 
605
    case CODEC_ID_ADPCM_SWF:
 
606
    case CODEC_ID_ADPCM_YAMAHA:
 
607
      {
 
608
        gchar *layout = NULL;
 
609
 
 
610
        switch (codec_id) {
 
611
          case CODEC_ID_ADPCM_IMA_QT:
 
612
            layout = "quicktime";
 
613
            break;
 
614
          case CODEC_ID_ADPCM_IMA_WAV:
 
615
            layout = "dvi";
 
616
            break;
 
617
          case CODEC_ID_ADPCM_IMA_DK3:
 
618
            layout = "dk3";
 
619
            break;
 
620
          case CODEC_ID_ADPCM_IMA_DK4:
 
621
            layout = "dk4";
 
622
            break;
 
623
          case CODEC_ID_ADPCM_IMA_WS:
 
624
            layout = "westwood";
 
625
            break;
 
626
          case CODEC_ID_ADPCM_IMA_SMJPEG:
 
627
            layout = "smjpeg";
 
628
            break;
 
629
          case CODEC_ID_ADPCM_MS:
 
630
            layout = "microsoft";
 
631
            break;
 
632
          case CODEC_ID_ADPCM_4XM:
 
633
            layout = "4xm";
 
634
            break;
 
635
          case CODEC_ID_ADPCM_XA:
 
636
            layout = "xa";
 
637
            break;
 
638
          case CODEC_ID_ADPCM_ADX:
 
639
            layout = "adx";
 
640
            break;
 
641
          case CODEC_ID_ADPCM_EA:
 
642
            layout = "ea";
 
643
            break;
 
644
          case CODEC_ID_ADPCM_G726:
 
645
            layout = "g726";
 
646
            break;
 
647
          case CODEC_ID_ADPCM_CT:
 
648
            layout = "ct";
 
649
            break;
 
650
          case CODEC_ID_ADPCM_SWF:
 
651
            layout = "swf";
 
652
            break;
 
653
          case CODEC_ID_ADPCM_YAMAHA:
 
654
            layout = "yamaha";
 
655
            break;
 
656
          default:
 
657
            g_assert (0);       /* don't worry, we never get here */
 
658
            break;
 
659
        }
 
660
 
 
661
        /* FIXME: someone please check whether we need additional properties
 
662
         * in this caps definition. */
 
663
        caps = GST_FF_AUD_CAPS_NEW ("audio/x-adpcm",
 
664
            "layout", G_TYPE_STRING, layout, NULL);
 
665
        if (context)
 
666
          gst_caps_set_simple (caps,
 
667
              "block_align", G_TYPE_INT, context->block_align,
 
668
              "bitrate", G_TYPE_INT, context->bit_rate, NULL);
 
669
      }
 
670
      break;
 
671
 
 
672
    case CODEC_ID_AMR_NB:
 
673
      caps = GST_FF_AUD_CAPS_NEW ("audio/x-amr-nb", NULL);
 
674
      break;
 
675
 
 
676
    case CODEC_ID_AMR_WB:
 
677
      caps = GST_FF_AUD_CAPS_NEW ("audio/x-amr-wb", NULL);
 
678
      break;
 
679
 
 
680
    case CODEC_ID_RA_144:
 
681
    case CODEC_ID_RA_288:
 
682
      {
 
683
        gint version = (codec_id == CODEC_ID_RA_144) ? 1 : 2;
 
684
 
 
685
        /* FIXME: properties? */
 
686
        caps = GST_FF_AUD_CAPS_NEW ("audio/x-pn-realaudio",
 
687
            "raversion", G_TYPE_INT, version, NULL);
 
688
      }
 
689
      break;
 
690
 
 
691
    case CODEC_ID_ROQ_DPCM:
 
692
    case CODEC_ID_INTERPLAY_DPCM:
 
693
    case CODEC_ID_XAN_DPCM:
 
694
    case CODEC_ID_SOL_DPCM:
 
695
      {
 
696
        gchar *layout = NULL;
 
697
 
 
698
        switch (codec_id) {
 
699
          case CODEC_ID_ROQ_DPCM:
 
700
            layout = "roq";
 
701
            break;
 
702
          case CODEC_ID_INTERPLAY_DPCM:
 
703
            layout = "interplay";
 
704
            break;
 
705
          case CODEC_ID_XAN_DPCM:
 
706
            layout = "xan";
 
707
            break;
 
708
          case CODEC_ID_SOL_DPCM:
 
709
            layout = "sol";
 
710
            break;
 
711
          default:
 
712
            g_assert (0);       /* don't worry, we never get here */
 
713
            break;
 
714
        }
 
715
 
 
716
        /* FIXME: someone please check whether we need additional properties
 
717
         * in this caps definition. */
 
718
        caps = GST_FF_AUD_CAPS_NEW ("audio/x-dpcm",
 
719
            "layout", G_TYPE_STRING, layout, NULL);
 
720
        if (context)
 
721
          gst_caps_set_simple (caps,
 
722
              "block_align", G_TYPE_INT, context->block_align,
 
723
              "bitrate", G_TYPE_INT, context->bit_rate, NULL);
 
724
      }
 
725
      break;
 
726
 
 
727
    case CODEC_ID_SHORTEN:
 
728
      caps = gst_caps_new_simple ("audio/x-shorten", NULL);
 
729
      break;
 
730
 
 
731
    case CODEC_ID_ALAC:
 
732
      caps = GST_FF_AUD_CAPS_NEW ("audio/x-alac", NULL);
 
733
      if (context) {
 
734
        gst_caps_set_simple (caps,
 
735
            "samplesize", G_TYPE_INT, context->bits_per_sample, NULL);
 
736
      }
 
737
      break;
 
738
 
 
739
    case CODEC_ID_FLAC:
 
740
      /* Note that ffmpeg has no encoder yet, but just for safety. In the
 
741
       * encoder case, we want to add things like samplerate, channels... */
 
742
      if (!encode) {
 
743
        caps = gst_caps_new_simple ("audio/x-flac", NULL);
 
744
      }
 
745
      break;
 
746
 
 
747
    case CODEC_ID_DVD_SUBTITLE:
 
748
    case CODEC_ID_DVB_SUBTITLE:
 
749
      caps = NULL;
 
750
      break;
 
751
 
 
752
    default:
 
753
      g_warning ("Unknown codec ID %d, please add here", codec_id);
 
754
      break;
 
755
  }
 
756
 
 
757
  if (buildcaps) {
 
758
    AVCodec *codec;
 
759
 
 
760
    if ((codec = avcodec_find_decoder (codec_id)) ||
 
761
        (codec = avcodec_find_encoder (codec_id))) {
 
762
      gchar *mime = NULL;
 
763
 
 
764
      switch (codec->type) {
 
765
        case CODEC_TYPE_VIDEO:
 
766
          mime = g_strdup_printf ("video/x-gst_ff-%s", codec->name);
 
767
          caps = GST_FF_VID_CAPS_NEW (mime, NULL);
 
768
          g_free (mime);
 
769
          break;
 
770
        case CODEC_TYPE_AUDIO:
 
771
          mime = g_strdup_printf ("audio/x-gst_ff-%s", codec->name);
 
772
          caps = GST_FF_AUD_CAPS_NEW (mime, NULL);
 
773
          if (context)
 
774
            gst_caps_set_simple (caps,
 
775
                "block_align", G_TYPE_INT, context->block_align,
 
776
                "bitrate", G_TYPE_INT, context->bit_rate, NULL);
 
777
          g_free (mime);
 
778
          break;
 
779
        default:
 
780
          break;
 
781
      }
 
782
    }
 
783
  }
 
784
 
 
785
  if (caps != NULL) {
 
786
 
 
787
    /* set private data */
 
788
    if (context && context->extradata_size > 0) {
 
789
      GstBuffer *data = gst_buffer_new_and_alloc (context->extradata_size);
 
790
 
 
791
      memcpy (GST_BUFFER_DATA (data), context->extradata,
 
792
          context->extradata_size);
 
793
      gst_caps_set_simple (caps,
 
794
          "codec_data", GST_TYPE_BUFFER, data, NULL);
 
795
      gst_buffer_unref (data);
 
796
    }
 
797
 
 
798
    /* palette */
 
799
    if (context) {
 
800
      gst_ffmpeg_set_palette (caps, context);
 
801
    }
 
802
 
 
803
    GST_DEBUG ("caps for codec_id=%d: %" GST_PTR_FORMAT, codec_id, caps);
 
804
 
 
805
  } else {
 
806
    GST_WARNING ("No caps found for codec_id=%d", codec_id);
 
807
  }
 
808
 
 
809
  return caps;
 
810
}
 
811
 
 
812
/* Convert a FFMPEG Pixel Format and optional AVCodecContext
 
813
 * to a GstCaps. If the context is ommitted, no fixed values
 
814
 * for video/audio size will be included in the GstCaps
 
815
 *
 
816
 * See below for usefullness
 
817
 */
 
818
 
 
819
static GstCaps *
 
820
gst_ffmpeg_pixfmt_to_caps (enum PixelFormat pix_fmt, AVCodecContext * context)
 
821
{
 
822
  GstCaps *caps = NULL;
 
823
 
 
824
  int bpp = 0, depth = 0, endianness = 0;
 
825
  gulong g_mask = 0, r_mask = 0, b_mask = 0, a_mask = 0;
 
826
  guint32 fmt = 0;
 
827
  
 
828
  switch (pix_fmt) {
 
829
    case PIX_FMT_YUVJ420P:
 
830
    case PIX_FMT_YUV420P:
 
831
      fmt = GST_MAKE_FOURCC ('I', '4', '2', '0');
 
832
      break;
 
833
    case PIX_FMT_YUV422:
 
834
      fmt = GST_MAKE_FOURCC ('Y', 'U', 'Y', '2');
 
835
      break;
 
836
    case PIX_FMT_RGB24:
 
837
      bpp = depth = 24;
 
838
      endianness = G_BIG_ENDIAN;
 
839
      r_mask = 0xff0000;
 
840
      g_mask = 0x00ff00;
 
841
      b_mask = 0x0000ff;
 
842
      break;
 
843
    case PIX_FMT_BGR24:
 
844
      bpp = depth = 24;
 
845
      endianness = G_BIG_ENDIAN;
 
846
      r_mask = 0x0000ff;
 
847
      g_mask = 0x00ff00;
 
848
      b_mask = 0xff0000;
 
849
      break;
 
850
    case PIX_FMT_YUVJ422P:
 
851
    case PIX_FMT_YUV422P:
 
852
      fmt = GST_MAKE_FOURCC ('Y', '4', '2', 'B');
 
853
      break;
 
854
    case PIX_FMT_YUVJ444P:
 
855
    case PIX_FMT_YUV444P:
 
856
      fmt = GST_MAKE_FOURCC ('Y', '4', '4', '4');
 
857
      break;
 
858
    case PIX_FMT_RGBA32:
 
859
      bpp = 32;
 
860
      depth = 32;
 
861
      endianness = G_BIG_ENDIAN;
 
862
#if (G_BYTE_ORDER == G_BIG_ENDIAN)
 
863
      r_mask = 0x000000ff;
 
864
      g_mask = 0x0000ff00;
 
865
      b_mask = 0x00ff0000;
 
866
      a_mask = 0xff000000;
 
867
#else
 
868
      r_mask = 0xff000000;
 
869
      g_mask = 0x00ff0000;
 
870
      b_mask = 0x0000ff00;
 
871
      a_mask = 0x000000ff;
 
872
#endif
 
873
      break;
 
874
    case PIX_FMT_YUV410P:
 
875
      fmt = GST_MAKE_FOURCC ('Y', 'U', 'V', '9');
 
876
      break;
 
877
    case PIX_FMT_YUV411P:
 
878
      fmt = GST_MAKE_FOURCC ('Y', '4', '1', 'B');
 
879
      break;
 
880
    case PIX_FMT_RGB565:
 
881
      bpp = depth = 16;
 
882
      endianness = G_BYTE_ORDER;
 
883
      r_mask = 0xf800;
 
884
      g_mask = 0x07e0;
 
885
      b_mask = 0x001f;
 
886
      break;
 
887
    case PIX_FMT_RGB555:
 
888
      bpp = 16;
 
889
      depth = 15;
 
890
      endianness = G_BYTE_ORDER;
 
891
      r_mask = 0x7c00;
 
892
      g_mask = 0x03e0;
 
893
      b_mask = 0x001f;
 
894
      break;
 
895
    case PIX_FMT_PAL8:
 
896
      bpp = depth = 8;
 
897
      endianness = G_BYTE_ORDER;
 
898
      break;
 
899
    case PIX_FMT_GRAY8:
 
900
      bpp = depth = 8;
 
901
      caps = GST_FF_VID_CAPS_NEW ("video/x-raw-gray",
 
902
                                  "bpp", G_TYPE_INT, bpp,
 
903
                                  "depth", G_TYPE_INT, depth, NULL);
 
904
      break;
 
905
    default:
 
906
      /* give up ... */
 
907
      break;
 
908
  }
 
909
  
 
910
  if (caps == NULL) {
 
911
    if (bpp != 0) {
 
912
      if (r_mask != 0) {
 
913
        caps = GST_FF_VID_CAPS_NEW ("video/x-raw-rgb",
 
914
                                    "bpp", G_TYPE_INT, bpp,
 
915
                                    "depth", G_TYPE_INT, depth,
 
916
                                    "red_mask", G_TYPE_INT, r_mask,
 
917
                                    "green_mask", G_TYPE_INT, g_mask,
 
918
                                    "blue_mask", G_TYPE_INT, b_mask,
 
919
                                    "endianness", G_TYPE_INT, endianness, NULL);
 
920
        if (a_mask) {
 
921
          gst_caps_set_simple (caps, "alpha_mask", G_TYPE_INT, a_mask, NULL);
 
922
        }
 
923
      } else {
 
924
        caps = GST_FF_VID_CAPS_NEW ("video/x-raw-rgb",
 
925
                                    "bpp", G_TYPE_INT, bpp,
 
926
                                    "depth", G_TYPE_INT, depth,
 
927
                                    "endianness", G_TYPE_INT, endianness, NULL);
 
928
        if (context) {
 
929
          gst_ffmpeg_set_palette (caps, context);
 
930
        }
 
931
      }
 
932
    } else if (fmt) {
 
933
      caps = GST_FF_VID_CAPS_NEW ("video/x-raw-yuv",
 
934
                                  "format", GST_TYPE_FOURCC, fmt, NULL);
 
935
    }
 
936
  }
 
937
 
 
938
  if (caps != NULL) {
 
939
    char *str = gst_caps_to_string (caps);
 
940
 
 
941
    GST_DEBUG ("caps for pix_fmt=%d: %s", pix_fmt, str);
 
942
    g_free (str);
 
943
  } else {
 
944
    GST_WARNING ("No caps found for pix_fmt=%d", pix_fmt);
 
945
  }
 
946
 
 
947
  return caps;
 
948
}
 
949
 
 
950
/* Convert a FFMPEG Sample Format and optional AVCodecContext
 
951
 * to a GstCaps. If the context is ommitted, no fixed values
 
952
 * for video/audio size will be included in the GstCaps
 
953
 *
 
954
 * See below for usefullness
 
955
 */
 
956
 
 
957
static GstCaps *
 
958
gst_ffmpeg_smpfmt_to_caps (enum SampleFormat sample_fmt,
 
959
    AVCodecContext * context)
 
960
{
 
961
  GstCaps *caps = NULL;
 
962
 
 
963
  int bpp = 0;
 
964
  gboolean signedness = FALSE;
 
965
 
 
966
  switch (sample_fmt) {
 
967
    case SAMPLE_FMT_S16:
 
968
      signedness = TRUE;
 
969
      bpp = 16;
 
970
      break;
 
971
 
 
972
    default:
 
973
      /* .. */
 
974
      break;
 
975
  }
 
976
 
 
977
  if (bpp) {
 
978
    caps = GST_FF_AUD_CAPS_NEW ("audio/x-raw-int",
 
979
        "signed", G_TYPE_BOOLEAN, signedness,
 
980
        "endianness", G_TYPE_INT, G_BYTE_ORDER,
 
981
        "width", G_TYPE_INT, bpp, "depth", G_TYPE_INT, bpp, NULL);
 
982
  }
 
983
 
 
984
  if (caps != NULL) {
 
985
    char *str = gst_caps_to_string (caps);
 
986
 
 
987
    GST_DEBUG ("caps for sample_fmt=%d: %s", sample_fmt, str);
 
988
    g_free (str);
 
989
  } else {
 
990
    GST_WARNING ("No caps found for sample_fmt=%d", sample_fmt);
 
991
  }
 
992
 
 
993
  return caps;
 
994
}
 
995
 
 
996
/* Convert a FFMPEG codec Type and optional AVCodecContext
 
997
 * to a GstCaps. If the context is ommitted, no fixed values
 
998
 * for video/audio size will be included in the GstCaps
 
999
 *
 
1000
 * CodecType is primarily meant for uncompressed data GstCaps!
 
1001
 */
 
1002
 
 
1003
GstCaps *
 
1004
gst_ffmpeg_codectype_to_caps (enum CodecType codec_type,
 
1005
    AVCodecContext * context)
 
1006
{
 
1007
  GstCaps *caps;
 
1008
 
 
1009
  switch (codec_type) {
 
1010
    case CODEC_TYPE_VIDEO:
 
1011
      if (context) {
 
1012
        caps = gst_ffmpeg_pixfmt_to_caps (context->pix_fmt,
 
1013
            context->width == -1 ? NULL : context);
 
1014
      } else {
 
1015
        GstCaps *temp;
 
1016
        enum PixelFormat i;
 
1017
 
 
1018
        caps = gst_caps_new_empty ();
 
1019
        for (i = 0; i < PIX_FMT_NB; i++) {
 
1020
          temp = gst_ffmpeg_pixfmt_to_caps (i, NULL);
 
1021
          if (temp != NULL) {
 
1022
            gst_caps_append (caps, temp);
 
1023
          }
 
1024
        }
 
1025
      }
 
1026
      break;
 
1027
 
 
1028
    case CODEC_TYPE_AUDIO:
 
1029
      if (context) {
 
1030
        caps = gst_ffmpeg_smpfmt_to_caps (context->sample_fmt, context);
 
1031
      } else {
 
1032
        GstCaps *temp;
 
1033
        enum SampleFormat i;
 
1034
 
 
1035
        caps = gst_caps_new_empty ();
 
1036
        for (i = 0; i <= SAMPLE_FMT_S16; i++) {
 
1037
          temp = gst_ffmpeg_smpfmt_to_caps (i, NULL);
 
1038
          if (temp != NULL) {
 
1039
            gst_caps_append (caps, temp);
 
1040
          }
 
1041
        }
 
1042
      }
 
1043
      break;
 
1044
 
 
1045
    default:
 
1046
      /* .. */
 
1047
      caps = NULL;
 
1048
      break;
 
1049
  }
 
1050
 
 
1051
  return caps;
 
1052
}
 
1053
 
 
1054
/* Convert a GstCaps (audio/raw) to a FFMPEG SampleFmt
 
1055
 * and other audio properties in a AVCodecContext.
 
1056
 *
 
1057
 * For usefullness, see below
 
1058
 */
 
1059
 
 
1060
static void
 
1061
gst_ffmpeg_caps_to_smpfmt (const GstCaps * caps,
 
1062
    AVCodecContext * context, gboolean raw)
 
1063
{
 
1064
  GstStructure *structure;
 
1065
  gint depth = 0, width = 0, endianness = 0;
 
1066
  gboolean signedness = FALSE;
 
1067
 
 
1068
  g_return_if_fail (gst_caps_get_size (caps) == 1);
 
1069
  structure = gst_caps_get_structure (caps, 0);
 
1070
 
 
1071
  gst_structure_get_int (structure, "channels", &context->channels);
 
1072
  gst_structure_get_int (structure, "rate", &context->sample_rate);
 
1073
  gst_structure_get_int (structure, "block_align", &context->block_align);
 
1074
  gst_structure_get_int (structure, "bitrate", &context->bit_rate);
 
1075
 
 
1076
  if (!raw)
 
1077
    return;
 
1078
 
 
1079
  if (gst_structure_get_int (structure, "width", &width) &&
 
1080
      gst_structure_get_int (structure, "depth", &depth) &&
 
1081
      gst_structure_get_int (structure, "signed", &signedness) &&
 
1082
      gst_structure_get_int (structure, "endianness", &endianness)) {
 
1083
    if (width == 16 && depth == 16 &&
 
1084
        endianness == G_BYTE_ORDER && signedness == TRUE) {
 
1085
      context->sample_fmt = SAMPLE_FMT_S16;
 
1086
    }
 
1087
  }
 
1088
}
 
1089
 
 
1090
 
 
1091
/* Convert a GstCaps (video/raw) to a FFMPEG PixFmt
 
1092
 * and other video properties in a AVCodecContext.
 
1093
 *
 
1094
 * For usefullness, see below
 
1095
 */
 
1096
 
 
1097
static void
 
1098
gst_ffmpeg_caps_to_pixfmt (const GstCaps * caps,
 
1099
    AVCodecContext * context, gboolean raw)
 
1100
{
 
1101
  GstStructure *structure;
 
1102
  const GValue *fps;
 
1103
 
 
1104
  g_return_if_fail (gst_caps_get_size (caps) == 1);
 
1105
  structure = gst_caps_get_structure (caps, 0);
 
1106
 
 
1107
  gst_structure_get_int (structure, "width", &context->width);
 
1108
  gst_structure_get_int (structure, "height", &context->height);
 
1109
  gst_structure_get_int (structure, "bpp", &context->bits_per_sample);
 
1110
 
 
1111
  fps = gst_structure_get_value (structure, "framerate");
 
1112
  if (fps != NULL && GST_VALUE_HOLDS_FRACTION (fps)) {
 
1113
 
 
1114
    /* somehow these seem mixed up.. */
 
1115
    context->time_base.den = gst_value_get_fraction_numerator (fps);
 
1116
    context->time_base.num = gst_value_get_fraction_denominator (fps);
 
1117
 
 
1118
    GST_DEBUG ("setting framerate %d/%d = %lf",
 
1119
            context->time_base.den, context->time_base.num, 
 
1120
            1. * context->time_base.den / context->time_base.num);
 
1121
  }
 
1122
 
 
1123
  if (!raw)
 
1124
    return;
 
1125
 
 
1126
  g_return_if_fail (fps != NULL && GST_VALUE_HOLDS_FRACTION (fps)); 
 
1127
 
 
1128
  if (strcmp (gst_structure_get_name (structure), "video/x-raw-yuv") == 0) {
 
1129
    guint32 fourcc;
 
1130
 
 
1131
    if (gst_structure_get_fourcc (structure, "format", &fourcc)) {
 
1132
      switch (fourcc) {
 
1133
        case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'):
 
1134
          context->pix_fmt = PIX_FMT_YUV422;
 
1135
          break;
 
1136
        case GST_MAKE_FOURCC ('I', '4', '2', '0'):
 
1137
          context->pix_fmt = PIX_FMT_YUV420P;
 
1138
          break;
 
1139
        case GST_MAKE_FOURCC ('Y', '4', '1', 'B'):
 
1140
          context->pix_fmt = PIX_FMT_YUV411P;
 
1141
          break;
 
1142
        case GST_MAKE_FOURCC ('Y', '4', '2', 'B'):
 
1143
          context->pix_fmt = PIX_FMT_YUV422P;
 
1144
          break;
 
1145
        case GST_MAKE_FOURCC ('Y', 'U', 'V', '9'):
 
1146
          context->pix_fmt = PIX_FMT_YUV410P;
 
1147
          break;
 
1148
#if 0
 
1149
        case FIXME:
 
1150
          context->pix_fmt = PIX_FMT_YUV444P;
 
1151
          break;
 
1152
#endif
 
1153
      }
 
1154
    }
 
1155
  } else if (strcmp (gst_structure_get_name (structure),
 
1156
          "video/x-raw-rgb") == 0) {
 
1157
    gint bpp = 0, rmask = 0, endianness = 0;
 
1158
 
 
1159
    if (gst_structure_get_int (structure, "bpp", &bpp) &&
 
1160
        gst_structure_get_int (structure, "endianness", &endianness)) {
 
1161
      if (gst_structure_get_int (structure, "red_mask", &rmask)) {
 
1162
        switch (bpp) {
 
1163
          case 32:
 
1164
#if (G_BYTE_ORDER == G_BIG_ENDIAN)
 
1165
            if (rmask == 0x00ff0000)
 
1166
#else
 
1167
            if (rmask == 0x0000ff00)
 
1168
#endif
 
1169
              context->pix_fmt = PIX_FMT_RGBA32;
 
1170
            break;
 
1171
          case 24:
 
1172
            if (rmask == 0x0000FF)
 
1173
              context->pix_fmt = PIX_FMT_BGR24;
 
1174
            else
 
1175
              context->pix_fmt = PIX_FMT_RGB24;
 
1176
            break;
 
1177
          case 16:
 
1178
            if (endianness == G_BYTE_ORDER)
 
1179
              context->pix_fmt = PIX_FMT_RGB565;
 
1180
            break;
 
1181
          case 15:
 
1182
            if (endianness == G_BYTE_ORDER)
 
1183
              context->pix_fmt = PIX_FMT_RGB555;
 
1184
            break;
 
1185
          default:
 
1186
            /* nothing */
 
1187
            break;
 
1188
        }
 
1189
      } else {
 
1190
        if (bpp == 8) {
 
1191
          context->pix_fmt = PIX_FMT_PAL8;
 
1192
          gst_ffmpeg_get_palette (caps, context);
 
1193
        }
 
1194
      }
 
1195
    }
 
1196
  }
 
1197
}
 
1198
 
 
1199
/* Convert a GstCaps and a FFMPEG codec Type to a
 
1200
 * AVCodecContext. If the context is ommitted, no fixed values
 
1201
 * for video/audio size will be included in the context
 
1202
 *
 
1203
 * CodecType is primarily meant for uncompressed data GstCaps!
 
1204
 */
 
1205
 
 
1206
void
 
1207
gst_ffmpeg_caps_with_codectype (enum CodecType type,
 
1208
    const GstCaps * caps, AVCodecContext * context)
 
1209
{
 
1210
  if (context == NULL)
 
1211
    return;
 
1212
 
 
1213
  switch (type) {
 
1214
    case CODEC_TYPE_VIDEO:
 
1215
      gst_ffmpeg_caps_to_pixfmt (caps, context, TRUE);
 
1216
      break;
 
1217
 
 
1218
    case CODEC_TYPE_AUDIO:
 
1219
      gst_ffmpeg_caps_to_smpfmt (caps, context, TRUE);
 
1220
      break;
 
1221
 
 
1222
    default:
 
1223
      /* unknown */
 
1224
      break;
 
1225
  }
 
1226
}
 
1227
 
 
1228
/*
 
1229
 * caps_with_codecid () transforms a GstCaps for a known codec
 
1230
 * ID into a filled-in context.
 
1231
 */
 
1232
 
 
1233
void
 
1234
gst_ffmpeg_caps_with_codecid (enum CodecID codec_id,
 
1235
    enum CodecType codec_type, const GstCaps *caps, AVCodecContext *context)
 
1236
{
 
1237
  GstStructure *str = gst_caps_get_structure (caps, 0);
 
1238
  const GValue *value;
 
1239
  const GstBuffer *buf;
 
1240
 
 
1241
  if (!context)
 
1242
    return;
 
1243
 
 
1244
  /* extradata parsing (esds [mpeg4], wma/wmv, msmpeg4v1/2/3, etc.) */
 
1245
  if ((value = gst_structure_get_value (str, "codec_data"))) {
 
1246
    buf = GST_BUFFER (gst_value_get_mini_object (value));
 
1247
    context->extradata = av_mallocz (GST_BUFFER_SIZE (buf));
 
1248
    memcpy (context->extradata, GST_BUFFER_DATA (buf),
 
1249
        GST_BUFFER_SIZE (buf));
 
1250
    context->extradata_size = GST_BUFFER_SIZE (buf);
 
1251
  }
 
1252
 
 
1253
  switch (codec_id) {
 
1254
    case CODEC_ID_MPEG4:
 
1255
      {
 
1256
        const gchar *mime = gst_structure_get_name (str);
 
1257
 
 
1258
        if (!strcmp (mime, "video/x-divx"))
 
1259
          context->codec_tag = GST_MAKE_FOURCC ('D', 'I', 'V', 'X');
 
1260
        else if (!strcmp (mime, "video/x-xvid"))
 
1261
          context->codec_tag = GST_MAKE_FOURCC ('X', 'V', 'I', 'D');
 
1262
        else if (!strcmp (mime, "video/x-3ivx"))
 
1263
          context->codec_tag = GST_MAKE_FOURCC ('3', 'I', 'V', '1');
 
1264
        else if (!strcmp (mime, "video/mpeg"))
 
1265
          context->codec_tag = GST_MAKE_FOURCC ('m', 'p', '4', 'v');
 
1266
      }
 
1267
      break;
 
1268
 
 
1269
     case CODEC_ID_SVQ3:
 
1270
       /* FIXME: this is a workaround for older gst-plugins releases
 
1271
        * (<= 0.8.9). This should be removed at some point, because
 
1272
        * it causes wrong decoded frame order. */
 
1273
       if (!context->extradata) {
 
1274
         gint halfpel_flag, thirdpel_flag, low_delay, unknown_svq3_flag;
 
1275
         guint16 flags;
 
1276
         
 
1277
         if (gst_structure_get_int (str, "halfpel_flag", &halfpel_flag) ||
 
1278
             gst_structure_get_int (str, "thirdpel_flag", &thirdpel_flag) ||
 
1279
             gst_structure_get_int (str, "low_delay", &low_delay) ||
 
1280
             gst_structure_get_int (str, "unknown_svq3_flag",
 
1281
                 &unknown_svq3_flag)) {
 
1282
           context->extradata = (guint8 *) av_mallocz (0x64);
 
1283
           g_stpcpy (context->extradata, "SVQ3");
 
1284
           flags = 1 << 3;
 
1285
           flags |= low_delay;
 
1286
           flags = flags << 2;
 
1287
           flags |= unknown_svq3_flag;
 
1288
           flags = flags << 6;
 
1289
           flags |= halfpel_flag;
 
1290
           flags = flags << 1;
 
1291
           flags |= thirdpel_flag;
 
1292
           flags = flags << 3;
 
1293
 
 
1294
           flags = GUINT16_FROM_LE (flags);
 
1295
 
 
1296
           memcpy (context->extradata + 0x62, &flags, 2);
 
1297
           context->extradata_size = 0x64;
 
1298
         }
 
1299
       }
 
1300
       break;
 
1301
 
 
1302
    case CODEC_ID_MSRLE:
 
1303
    case CODEC_ID_QTRLE:
 
1304
      {
 
1305
        gint depth;
 
1306
 
 
1307
        if (gst_structure_get_int (str, "depth", &depth))
 
1308
          context->bits_per_sample = depth;
 
1309
      }
 
1310
      break;
 
1311
 
 
1312
    case CODEC_ID_RV10:
 
1313
    case CODEC_ID_RV20:
 
1314
      {
 
1315
        guint32 fourcc;
 
1316
 
 
1317
        if (gst_structure_get_fourcc (str, "rmsubid", &fourcc))
 
1318
          context->sub_id = fourcc;
 
1319
      }
 
1320
      break;
 
1321
 
 
1322
    case CODEC_ID_ALAC:
 
1323
      gst_structure_get_int (str, "samplesize", &context->bits_per_sample);
 
1324
      break;
 
1325
 
 
1326
    default:
 
1327
      break;
 
1328
  }
 
1329
 
 
1330
  if (!gst_caps_is_fixed (caps))
 
1331
    return;
 
1332
 
 
1333
  /* common properties (width, height, fps) */
 
1334
  switch (codec_type) {
 
1335
    case CODEC_TYPE_VIDEO:
 
1336
      gst_ffmpeg_caps_to_pixfmt (caps, context, codec_id == CODEC_ID_RAWVIDEO);
 
1337
      gst_ffmpeg_get_palette (caps, context);
 
1338
      break;
 
1339
    case CODEC_TYPE_AUDIO:
 
1340
      gst_ffmpeg_caps_to_smpfmt (caps, context, FALSE);
 
1341
      break;
 
1342
    default:
 
1343
      break;
 
1344
  }
 
1345
}
 
1346
 
 
1347
/* _formatid_to_caps () is meant for muxers/demuxers, it
 
1348
 * transforms a name (ffmpeg way of ID'ing these, why don't
 
1349
 * they have unique numerical IDs?) to the corresponding
 
1350
 * caps belonging to that mux-format
 
1351
 *
 
1352
 * Note: we don't need any additional info because the caps
 
1353
 * isn't supposed to contain any useful info besides the
 
1354
 * media type anyway
 
1355
 */
 
1356
 
 
1357
GstCaps *
 
1358
gst_ffmpeg_formatid_to_caps (const gchar * format_name)
 
1359
{
 
1360
  GstCaps *caps = NULL;
 
1361
 
 
1362
  if (!strcmp (format_name, "mpeg")) {
 
1363
    caps = gst_caps_new_simple ("video/mpeg",
 
1364
        "systemstream", G_TYPE_BOOLEAN, TRUE, NULL);
 
1365
  } else if (!strcmp (format_name, "mpegts")) {
 
1366
    caps = gst_caps_new_simple ("video/mpegts",
 
1367
        "systemstream", G_TYPE_BOOLEAN, TRUE, NULL);
 
1368
  } else if (!strcmp (format_name, "rm")) {
 
1369
    caps = gst_caps_new_simple ("application/x-pn-realmedia",
 
1370
        "systemstream", G_TYPE_BOOLEAN, TRUE, NULL);
 
1371
  } else if (!strcmp (format_name, "asf")) {
 
1372
    caps = gst_caps_new_simple ("video/x-ms-asf", NULL);
 
1373
  } else if (!strcmp (format_name, "avi")) {
 
1374
    caps = gst_caps_new_simple ("video/x-msvideo", NULL);
 
1375
  } else if (!strcmp (format_name, "wav")) {
 
1376
    caps = gst_caps_new_simple ("audio/x-wav", NULL);
 
1377
  } else if (!strcmp (format_name, "swf")) {
 
1378
    caps = gst_caps_new_simple ("application/x-shockwave-flash", NULL);
 
1379
  } else if (!strcmp (format_name, "au")) {
 
1380
    caps = gst_caps_new_simple ("audio/x-au", NULL);
 
1381
  } else if (!strcmp (format_name, "mov_mp4_m4a_3gp")) {
 
1382
    caps = gst_caps_new_simple ("video/quicktime", NULL);
 
1383
  } else if (!strcmp (format_name, "dv")) {
 
1384
    caps = gst_caps_new_simple ("video/x-dv",
 
1385
        "systemstream", G_TYPE_BOOLEAN, TRUE, NULL);
 
1386
  } else if (!strcmp (format_name, "4xm")) {
 
1387
    caps = gst_caps_new_simple ("video/x-4xm", NULL);
 
1388
  } else if (!strcmp (format_name, "matroska")) {
 
1389
    caps = gst_caps_new_simple ("video/x-matroska", NULL);
 
1390
  } else if (!strcmp (format_name, "mp3")) {
 
1391
    caps = gst_caps_new_simple ("application/x-id3", NULL);
 
1392
  } else if (!strcmp (format_name, "flic")) {
 
1393
    caps = gst_caps_new_simple ("video/x-fli", NULL);
 
1394
  } else if (!strcmp (format_name, "flv")) {
 
1395
    caps = gst_caps_new_simple ("video/x-flv", NULL);
 
1396
  } else {
 
1397
    gchar *name;
 
1398
 
 
1399
    GST_WARNING ("Could not create stream format caps for %s", format_name);
 
1400
    name = g_strdup_printf ("application/x-gst_ff-%s", format_name);
 
1401
    caps = gst_caps_new_simple (name, NULL);
 
1402
    g_free (name);
 
1403
  }
 
1404
 
 
1405
  return caps;
 
1406
}
 
1407
 
 
1408
gboolean
 
1409
gst_ffmpeg_formatid_get_codecids (const gchar *format_name,
 
1410
    enum CodecID ** video_codec_list, enum CodecID ** audio_codec_list)
 
1411
{
 
1412
  if (!strcmp (format_name, "mp4")) {
 
1413
    static enum CodecID mp4_video_list[] = { CODEC_ID_MPEG4, CODEC_ID_H264, CODEC_ID_NONE };
 
1414
    static enum CodecID mp4_audio_list[] = { CODEC_ID_AAC, CODEC_ID_NONE };
 
1415
 
 
1416
    *video_codec_list = mp4_video_list;
 
1417
    *audio_codec_list = mp4_audio_list;
 
1418
  } else if (!strcmp (format_name, "mpeg")) {
 
1419
    static enum CodecID mpeg_video_list[] = { CODEC_ID_MPEG1VIDEO, CODEC_ID_NONE };
 
1420
    static enum CodecID mpeg_audio_list[] = { CODEC_ID_MP2, CODEC_ID_NONE };
 
1421
 
 
1422
    *video_codec_list = mpeg_video_list;
 
1423
    *audio_codec_list = mpeg_audio_list;
 
1424
  } else if (!strcmp (format_name, "vob")) {
 
1425
    static enum CodecID vob_video_list[] = { CODEC_ID_MPEG2VIDEO, CODEC_ID_NONE };
 
1426
    static enum CodecID vob_audio_list[] = { CODEC_ID_MP2, CODEC_ID_AC3, CODEC_ID_NONE };
 
1427
 
 
1428
    *video_codec_list = vob_video_list;
 
1429
    *audio_codec_list = vob_audio_list;
 
1430
  } else if (!strcmp (format_name, "flv")) {
 
1431
    static enum CodecID flv_video_list[] = { CODEC_ID_FLV1, CODEC_ID_NONE };
 
1432
    static enum CodecID flv_audio_list[] = { CODEC_ID_MP3, CODEC_ID_NONE };
 
1433
 
 
1434
    *video_codec_list = flv_video_list;
 
1435
    *audio_codec_list = flv_audio_list;
 
1436
  } else {
 
1437
    GST_WARNING ("Format %s not found", format_name);
 
1438
    return FALSE;
 
1439
  }
 
1440
 
 
1441
  return TRUE;
 
1442
}
 
1443
 
 
1444
/* Convert a GstCaps to a FFMPEG codec ID. Size et all
 
1445
 * are omitted, that can be queried by the user itself,
 
1446
 * we're not eating the GstCaps or anything
 
1447
 * A pointer to an allocated context is also needed for
 
1448
 * optional extra info
 
1449
 */
 
1450
 
 
1451
enum CodecID
 
1452
gst_ffmpeg_caps_to_codecid (const GstCaps * caps, AVCodecContext * context)
 
1453
{
 
1454
  enum CodecID id = CODEC_ID_NONE;
 
1455
  const gchar *mimetype;
 
1456
  const GstStructure *structure;
 
1457
  gboolean video = FALSE, audio = FALSE;        /* we want to be sure! */
 
1458
 
 
1459
  g_return_val_if_fail (caps != NULL, CODEC_ID_NONE);
 
1460
  g_return_val_if_fail (gst_caps_get_size (caps) == 1, CODEC_ID_NONE);
 
1461
  structure = gst_caps_get_structure (caps, 0);
 
1462
 
 
1463
  mimetype = gst_structure_get_name (structure);
 
1464
 
 
1465
  if (!strcmp (mimetype, "video/x-raw-rgb") ||
 
1466
      !strcmp (mimetype, "video/x-raw-yuv")) {
 
1467
    id = CODEC_ID_RAWVIDEO;
 
1468
    video = TRUE;
 
1469
  } else if (!strcmp (mimetype, "audio/x-raw-int")) {
 
1470
    gint depth, width, endianness;
 
1471
    gboolean signedness;
 
1472
 
 
1473
    if (gst_structure_get_int (structure, "endianness", &endianness) &&
 
1474
        gst_structure_get_boolean (structure, "signed", &signedness) &&
 
1475
        gst_structure_get_int (structure, "width", &width) &&
 
1476
        gst_structure_get_int (structure, "depth", &depth) &&
 
1477
        depth == width) {
 
1478
      switch (depth) {
 
1479
        case 8:
 
1480
          if (signedness) {
 
1481
            id = CODEC_ID_PCM_S8;
 
1482
          } else {
 
1483
            id = CODEC_ID_PCM_U8;
 
1484
          }
 
1485
          break;
 
1486
        case 16:
 
1487
          switch (endianness) {
 
1488
            case G_BIG_ENDIAN:
 
1489
              if (signedness) {
 
1490
                id = CODEC_ID_PCM_S16BE;
 
1491
              } else {
 
1492
                id = CODEC_ID_PCM_U16BE;
 
1493
              }
 
1494
              break;
 
1495
            case G_LITTLE_ENDIAN:
 
1496
              if (signedness) {
 
1497
                id = CODEC_ID_PCM_S16LE;
 
1498
              } else {
 
1499
                id = CODEC_ID_PCM_U16LE;
 
1500
              }
 
1501
              break;
 
1502
          }
 
1503
          break;
 
1504
      }
 
1505
      if (id != CODEC_ID_NONE)
 
1506
        audio = TRUE;
 
1507
    }
 
1508
  } else if (!strcmp (mimetype, "audio/x-mulaw")) {
 
1509
    id = CODEC_ID_PCM_MULAW;
 
1510
    audio = TRUE;
 
1511
  } else if (!strcmp (mimetype, "audio/x-alaw")) {
 
1512
    id = CODEC_ID_PCM_ALAW;
 
1513
    audio = TRUE;
 
1514
  } else if (!strcmp (mimetype, "video/x-dv")) {
 
1515
    gboolean sys_strm;
 
1516
 
 
1517
    if (gst_structure_get_boolean (structure, "systemstream", &sys_strm) &&
 
1518
        !sys_strm) {
 
1519
      id = CODEC_ID_DVVIDEO;
 
1520
      video = TRUE;
 
1521
    }
 
1522
  } else if (!strcmp (mimetype, "audio/x-dv")) {        /* ??? */
 
1523
    id = CODEC_ID_DVAUDIO;
 
1524
    audio = TRUE;
 
1525
  } else if (!strcmp (mimetype, "video/x-h263")) {
 
1526
    id = CODEC_ID_H263;         /* or H263P */
 
1527
    video = TRUE;
 
1528
  } else if (!strcmp (mimetype, "video/x-intel-h263")) {
 
1529
    id = CODEC_ID_H263I;
 
1530
    video = TRUE;
 
1531
  } else if (!strcmp (mimetype, "video/x-h261")) {
 
1532
    id = CODEC_ID_H261;
 
1533
    video = TRUE;
 
1534
  } else if (!strcmp (mimetype, "video/mpeg")) {
 
1535
    gboolean sys_strm;
 
1536
    gint mpegversion;
 
1537
 
 
1538
    if (gst_structure_get_boolean (structure, "systemstream", &sys_strm) &&
 
1539
        gst_structure_get_int (structure, "mpegversion", &mpegversion) &&
 
1540
        !sys_strm) {
 
1541
      switch (mpegversion) {
 
1542
        case 1:
 
1543
          id = CODEC_ID_MPEG1VIDEO;
 
1544
          break;
 
1545
        case 2:
 
1546
          id = CODEC_ID_MPEG2VIDEO;
 
1547
          break;
 
1548
        case 4:
 
1549
          id = CODEC_ID_MPEG4;
 
1550
          break;
 
1551
      }
 
1552
    }
 
1553
    if (id != CODEC_ID_NONE)
 
1554
      video = TRUE;
 
1555
  } else if (!strcmp (mimetype, "image/jpeg")) {
 
1556
    id = CODEC_ID_MJPEG;        /* A... B... */
 
1557
    video = TRUE;
 
1558
  } else if (!strcmp (mimetype, "video/x-jpeg-b")) {
 
1559
    id = CODEC_ID_MJPEGB;
 
1560
    video = TRUE;
 
1561
  } else if (!strcmp (mimetype, "video/x-wmv")) {
 
1562
    gint wmvversion = 0;
 
1563
 
 
1564
    if (gst_structure_get_int (structure, "wmvversion", &wmvversion)) {
 
1565
      switch (wmvversion) {
 
1566
        case 1:
 
1567
          id = CODEC_ID_WMV1;
 
1568
          break;
 
1569
        case 2:
 
1570
          id = CODEC_ID_WMV2;
 
1571
          break;
 
1572
        case 3:
 
1573
          id = CODEC_ID_WMV3;
 
1574
          break;
 
1575
      }
 
1576
    }
 
1577
    if (id != CODEC_ID_NONE)
 
1578
      video = TRUE;
 
1579
  } else if (!strcmp (mimetype, "audio/x-vorbis")) {
 
1580
    id = CODEC_ID_VORBIS;
 
1581
    audio = TRUE;
 
1582
  } else if (!strcmp (mimetype, "audio/x-qdm2")) {
 
1583
    id = CODEC_ID_QDM2;
 
1584
    audio = TRUE;
 
1585
  } else if (!strcmp (mimetype, "audio/mpeg")) {
 
1586
    gint layer = 0;
 
1587
    gint mpegversion = 0;
 
1588
 
 
1589
    if (gst_structure_get_int (structure, "mpegversion", &mpegversion)) {
 
1590
      switch (mpegversion) {
 
1591
        case 2:                /* ffmpeg uses faad for both... */
 
1592
        case 4:
 
1593
          id = CODEC_ID_AAC;
 
1594
          break;
 
1595
        case 1:
 
1596
          if (gst_structure_get_int (structure, "layer", &layer)) {
 
1597
            switch (layer) {
 
1598
              case 1:
 
1599
              case 2:
 
1600
                id = CODEC_ID_MP2;
 
1601
                break;
 
1602
              case 3:
 
1603
                id = CODEC_ID_MP3;
 
1604
                break;
 
1605
            }
 
1606
          }
 
1607
      }
 
1608
    }
 
1609
    if (id != CODEC_ID_NONE)
 
1610
      audio = TRUE;
 
1611
  } else if (!strcmp (mimetype, "audio/x-wma")) {
 
1612
    gint wmaversion = 0;
 
1613
 
 
1614
    if (gst_structure_get_int (structure, "wmaversion", &wmaversion)) {
 
1615
      switch (wmaversion) {
 
1616
        case 1:
 
1617
          id = CODEC_ID_WMAV1;
 
1618
          break;
 
1619
        case 2:
 
1620
          id = CODEC_ID_WMAV2;
 
1621
          break;
 
1622
      }
 
1623
    }
 
1624
    if (id != CODEC_ID_NONE)
 
1625
      audio = TRUE;
 
1626
  } else if (!strcmp (mimetype, "audio/x-ac3")) {
 
1627
    id = CODEC_ID_AC3;
 
1628
    audio = TRUE;
 
1629
  } else if (!strcmp (mimetype, "video/x-msmpeg")) {
 
1630
    gint msmpegversion = 0;
 
1631
 
 
1632
    if (gst_structure_get_int (structure, "msmpegversion", &msmpegversion)) {
 
1633
      switch (msmpegversion) {
 
1634
        case 41:
 
1635
          id = CODEC_ID_MSMPEG4V1;
 
1636
          break;
 
1637
        case 42:
 
1638
          id = CODEC_ID_MSMPEG4V2;
 
1639
          break;
 
1640
        case 43:
 
1641
          id = CODEC_ID_MSMPEG4V3;
 
1642
          break;
 
1643
      }
 
1644
    }
 
1645
    if (id != CODEC_ID_NONE)
 
1646
      video = TRUE;
 
1647
  } else if (!strcmp (mimetype, "video/x-svq")) {
 
1648
    gint svqversion = 0;
 
1649
 
 
1650
    if (gst_structure_get_int (structure, "svqversion", &svqversion)) {
 
1651
      switch (svqversion) {
 
1652
        case 1:
 
1653
          id = CODEC_ID_SVQ1;
 
1654
          break;
 
1655
        case 3:
 
1656
          id = CODEC_ID_SVQ3;
 
1657
          break;
 
1658
      }
 
1659
    }
 
1660
    if (id != CODEC_ID_NONE)
 
1661
      video = TRUE;
 
1662
  } else if (!strcmp (mimetype, "video/x-huffyuv")) {
 
1663
    id = CODEC_ID_HUFFYUV;
 
1664
    video = TRUE;
 
1665
  } else if (!strcmp (mimetype, "audio/x-mace")) {
 
1666
    gint maceversion = 0;
 
1667
 
 
1668
    if (gst_structure_get_int (structure, "maceversion", &maceversion)) {
 
1669
      switch (maceversion) {
 
1670
        case 3:
 
1671
          id = CODEC_ID_MACE3;
 
1672
          break;
 
1673
        case 6:
 
1674
          id = CODEC_ID_MACE6;
 
1675
          break;
 
1676
      }
 
1677
    }
 
1678
    if (id != CODEC_ID_NONE)
 
1679
      audio = TRUE;
 
1680
  } else if (!strcmp (mimetype, "video/x-theora")) {
 
1681
    id = CODEC_ID_THEORA;
 
1682
    video = TRUE;
 
1683
  } else if (!strcmp (mimetype, "video/x-vp3")) {
 
1684
    id = CODEC_ID_VP3;
 
1685
    video = TRUE;
 
1686
  } else if (!strcmp (mimetype, "video/x-indeo")) {
 
1687
    gint indeoversion = 0;
 
1688
 
 
1689
    if (gst_structure_get_int (structure, "indeoversion", &indeoversion)) {
 
1690
      switch (indeoversion) {
 
1691
        case 3:
 
1692
          id = CODEC_ID_INDEO3;
 
1693
          break;
 
1694
        case 2:
 
1695
          id = CODEC_ID_INDEO2;
 
1696
          break;
 
1697
      }
 
1698
      if (id != CODEC_ID_NONE)
 
1699
        video = TRUE;
 
1700
    }
 
1701
  } else if (!strcmp (mimetype, "video/x-divx")) {
 
1702
    gint divxversion = 0;
 
1703
 
 
1704
    if (gst_structure_get_int (structure, "divxversion", &divxversion)) {
 
1705
      switch (divxversion) {
 
1706
        case 3:
 
1707
          id = CODEC_ID_MSMPEG4V3;
 
1708
          break;
 
1709
        case 4:
 
1710
        case 5:
 
1711
          id = CODEC_ID_MPEG4;
 
1712
          break;
 
1713
      }
 
1714
    }
 
1715
    if (id != CODEC_ID_NONE)
 
1716
      video = TRUE;
 
1717
  } else if (!strcmp (mimetype, "video/x-3ivx")) {
 
1718
    id = CODEC_ID_MPEG4;
 
1719
    video = TRUE;
 
1720
  } else if (!strcmp (mimetype, "video/x-xvid")) {
 
1721
    id = CODEC_ID_MPEG4;
 
1722
    video = TRUE;
 
1723
  } else if (!strcmp (mimetype, "video/x-ffv")) {
 
1724
    gint ffvversion = 0;
 
1725
 
 
1726
    if (gst_structure_get_int (structure, "ffvversion", &ffvversion) &&
 
1727
        ffvversion == 1) {
 
1728
      id = CODEC_ID_FFV1;
 
1729
      video = TRUE;
 
1730
    }
 
1731
  } else if (!strcmp (mimetype, "x-adpcm")) {
 
1732
    const gchar *layout;
 
1733
 
 
1734
    layout = gst_structure_get_string (structure, "layout");
 
1735
    if (layout == NULL) {
 
1736
      /* break */
 
1737
    } else if (!strcmp (layout, "quicktime")) {
 
1738
      id = CODEC_ID_ADPCM_IMA_QT;
 
1739
    } else if (!strcmp (layout, "microsoft")) {
 
1740
      id = CODEC_ID_ADPCM_MS;
 
1741
    } else if (!strcmp (layout, "dvi")) {
 
1742
      id = CODEC_ID_ADPCM_IMA_WAV;
 
1743
    } else if (!strcmp (layout, "4xm")) {
 
1744
      id = CODEC_ID_ADPCM_4XM;
 
1745
    } else if (!strcmp (layout, "smjpeg")) {
 
1746
      id = CODEC_ID_ADPCM_IMA_SMJPEG;
 
1747
    } else if (!strcmp (layout, "dk3")) {
 
1748
      id = CODEC_ID_ADPCM_IMA_DK3;
 
1749
    } else if (!strcmp (layout, "dk4")) {
 
1750
      id = CODEC_ID_ADPCM_IMA_DK4;
 
1751
    } else if (!strcmp (layout, "westwood")) {
 
1752
      id = CODEC_ID_ADPCM_IMA_WS;
 
1753
    } else if (!strcmp (layout, "xa")) {
 
1754
      id = CODEC_ID_ADPCM_XA;
 
1755
    } else if (!strcmp (layout, "adx")) {
 
1756
      id = CODEC_ID_ADPCM_ADX;
 
1757
    } else if (!strcmp (layout, "ea")) {
 
1758
      id = CODEC_ID_ADPCM_EA;
 
1759
    } else if (!strcmp (layout, "g726")) {
 
1760
      id = CODEC_ID_ADPCM_G726;
 
1761
    } else if (!strcmp (layout, "ct")) {
 
1762
      id = CODEC_ID_ADPCM_CT;
 
1763
    } else if (!strcmp (layout, "swf")) {
 
1764
      id = CODEC_ID_ADPCM_SWF;
 
1765
    } else if (!strcmp (layout, "yamaha")) {
 
1766
      id = CODEC_ID_ADPCM_YAMAHA;
 
1767
    }
 
1768
    if (id != CODEC_ID_NONE)
 
1769
      audio = TRUE;
 
1770
  } else if (!strcmp (mimetype, "video/x-4xm")) {
 
1771
    id = CODEC_ID_4XM;
 
1772
    video = TRUE;
 
1773
  } else if (!strcmp (mimetype, "audio/x-dpcm")) {
 
1774
    const gchar *layout;
 
1775
 
 
1776
    layout = gst_structure_get_string (structure, "layout");
 
1777
    if (!layout) {
 
1778
      /* .. */
 
1779
    } else if (!strcmp (layout, "roq")) {
 
1780
      id = CODEC_ID_ROQ_DPCM;
 
1781
    } else if (!strcmp (layout, "interplay")) {
 
1782
      id = CODEC_ID_INTERPLAY_DPCM;
 
1783
    } else if (!strcmp (layout, "xan")) {
 
1784
      id = CODEC_ID_XAN_DPCM;
 
1785
    } else if (!strcmp (layout, "sol")) {
 
1786
      id = CODEC_ID_SOL_DPCM;
 
1787
    }
 
1788
    if (id != CODEC_ID_NONE)
 
1789
      audio = TRUE;
 
1790
  } else if (!strcmp (mimetype, "audio/x-flac")) {
 
1791
    id = CODEC_ID_FLAC;
 
1792
    audio = TRUE;
 
1793
  } else if (!strcmp (mimetype, "audio/x-shorten")) {
 
1794
    id = CODEC_ID_SHORTEN;
 
1795
    audio = TRUE;
 
1796
  } else if (!strcmp (mimetype, "audio/x-alac")) {
 
1797
    id = CODEC_ID_ALAC;
 
1798
    audio = TRUE;
 
1799
  } else if (!strcmp (mimetype, "video/x-cinepak")) {
 
1800
    id = CODEC_ID_CINEPAK;
 
1801
    video = TRUE;
 
1802
  } else if (!strcmp (mimetype, "video/x-pn-realvideo")) {
 
1803
    gint rmversion;
 
1804
 
 
1805
    if (gst_structure_get_int (structure, "rmversion", &rmversion)) {
 
1806
      switch (rmversion) {
 
1807
        case 1:
 
1808
          id = CODEC_ID_RV10;
 
1809
          break;
 
1810
        case 2:
 
1811
          id = CODEC_ID_RV20;
 
1812
          break;
 
1813
      }
 
1814
    }
 
1815
    if (id != CODEC_ID_NONE)
 
1816
      video = TRUE;
 
1817
  } else if (!strcmp (mimetype, "audio/x-pn-realaudio")) {
 
1818
    gint raversion;
 
1819
 
 
1820
    if (gst_structure_get_int (structure, "raversion", &raversion)) {
 
1821
      switch (raversion) {
 
1822
        case 1:
 
1823
          id = CODEC_ID_RA_144;
 
1824
          break;
 
1825
        case 2:
 
1826
          id = CODEC_ID_RA_288;
 
1827
          break;
 
1828
      }
 
1829
    }
 
1830
    if (id != CODEC_ID_NONE)
 
1831
      audio = TRUE;
 
1832
  } else if (!strcmp (mimetype, "video/x-rle")) {
 
1833
    const gchar *layout;
 
1834
 
 
1835
    if ((layout = gst_structure_get_string (structure, "layout"))) {
 
1836
      if (!strcmp (layout, "microsoft")) {
 
1837
        id = CODEC_ID_MSRLE;
 
1838
        video = TRUE;
 
1839
      }
 
1840
    }
 
1841
  } else if (!strcmp (mimetype, "video/x-xan")) {
 
1842
    gint wcversion = 0;
 
1843
 
 
1844
    if ((gst_structure_get_int (structure, "wcversion", &wcversion))) {
 
1845
      switch (wcversion) {
 
1846
        case 3:
 
1847
          id = CODEC_ID_XAN_WC3;
 
1848
          video = TRUE;
 
1849
          break;
 
1850
        case 4:
 
1851
          id = CODEC_ID_XAN_WC4;
 
1852
          video = TRUE;
 
1853
          break;
 
1854
        default:
 
1855
          break;
 
1856
      }
 
1857
    }
 
1858
  } else if (!strcmp (mimetype, "audio/x-amrnb")) {
 
1859
    audio = TRUE;
 
1860
    id = CODEC_ID_AMR_NB;
 
1861
  } else if (!strcmp (mimetype, "audio/x-amrwb")) {
 
1862
    id = CODEC_ID_AMR_WB;
 
1863
    audio = TRUE;
 
1864
  } else if (!strcmp (mimetype, "video/x-h264")) {
 
1865
    id = CODEC_ID_H264;
 
1866
    video = TRUE;
 
1867
  } else if (!strncmp (mimetype, "audio/x-gst_ff-", 15) ) {
 
1868
    gchar ext[16];
 
1869
    AVCodec *codec;
 
1870
    if (strlen (mimetype) <= 30 &&
 
1871
        sscanf (mimetype, "audio/x-gst_ff-%s", ext) == 1) {
 
1872
      if ((codec = avcodec_find_decoder_by_name (ext)) ||
 
1873
          (codec = avcodec_find_encoder_by_name (ext))) {
 
1874
        id = codec->id;
 
1875
        audio = TRUE;
 
1876
      }
 
1877
    }
 
1878
  } else if (!strncmp (mimetype, "video/x-gst_ff-", 15)) {
 
1879
    gchar ext[16];
 
1880
    AVCodec *codec;
 
1881
    if (strlen (mimetype) <= 30 &&
 
1882
        sscanf (mimetype, "video/x-gst_ff-%s", ext) == 1) {
 
1883
      if ((codec = avcodec_find_decoder_by_name (ext)) ||
 
1884
          (codec = avcodec_find_encoder_by_name (ext))) {
 
1885
        id = codec->id;
 
1886
        video = TRUE;
 
1887
      }
 
1888
    }
 
1889
  }
 
1890
 
 
1891
  if (context != NULL) {
 
1892
    if (video == TRUE) {
 
1893
      context->codec_type = CODEC_TYPE_VIDEO;
 
1894
    } else if (audio == TRUE) {
 
1895
      context->codec_type = CODEC_TYPE_AUDIO;
 
1896
    } else {
 
1897
      context->codec_type = CODEC_TYPE_UNKNOWN;
 
1898
    }
 
1899
    context->codec_id = id;
 
1900
    gst_ffmpeg_caps_with_codecid (id, context->codec_type, caps, context);
 
1901
  }
 
1902
 
 
1903
  if (id != CODEC_ID_NONE) {
 
1904
    char *str = gst_caps_to_string (caps);
 
1905
 
 
1906
    GST_DEBUG ("The id=%d belongs to the caps %s", id, str);
 
1907
    g_free (str);
 
1908
  }
 
1909
 
 
1910
  return id;
 
1911
}
 
1912
 
 
1913
G_CONST_RETURN gchar *
 
1914
gst_ffmpeg_get_codecid_longname (enum CodecID codec_id)
 
1915
{
 
1916
  const gchar *name = NULL;
 
1917
 
 
1918
  switch (codec_id) {
 
1919
    case CODEC_ID_MPEG1VIDEO:
 
1920
      name = "MPEG-1 video";
 
1921
      break;
 
1922
    case CODEC_ID_MPEG2VIDEO:
 
1923
      name = "MPEG-2 video";
 
1924
      break;
 
1925
    case CODEC_ID_H263:
 
1926
      name = "H.263 video";
 
1927
      break;
 
1928
    case CODEC_ID_H261:
 
1929
      name = "H.261 video";
 
1930
      break;
 
1931
    case CODEC_ID_RV10:
 
1932
      name = "Realvideo 1.0";
 
1933
      break;
 
1934
    case CODEC_ID_RV20:
 
1935
      name = "Realvideo 2.0";
 
1936
      break;
 
1937
    case CODEC_ID_MP2:
 
1938
      name = "MPEG-1 layer 2 audio";
 
1939
      break;
 
1940
    case CODEC_ID_MP3:
 
1941
      name = "MPEG-1 layer 3 audio";
 
1942
      break;
 
1943
    case CODEC_ID_VORBIS:
 
1944
      name = "Vorbis audio";
 
1945
      break;
 
1946
    case CODEC_ID_QDM2:
 
1947
      name = "QDesign Music 2";
 
1948
      break;
 
1949
    case CODEC_ID_AC3:
 
1950
      name = "AC-3 audio";
 
1951
      break;
 
1952
    case CODEC_ID_MJPEG:
 
1953
      name = "Motion-JPEG";
 
1954
      break;
 
1955
    case CODEC_ID_MJPEGB:
 
1956
      name = "Quicktime Motion-JPEG B";
 
1957
      break;
 
1958
    case CODEC_ID_LJPEG:
 
1959
      name = "Lossless JPEG";
 
1960
      break;
 
1961
    case CODEC_ID_SP5X:
 
1962
      name = "Sp5x-like JPEG";
 
1963
      break;
 
1964
    case CODEC_ID_MPEG4:
 
1965
      name = "MPEG-4 compatible video";
 
1966
      break;
 
1967
    case CODEC_ID_MSMPEG4V1:
 
1968
      name = "Microsoft MPEG-4 v1";
 
1969
      break;
 
1970
    case CODEC_ID_MSMPEG4V2:
 
1971
      name = "Microsoft MPEG-4 v2";
 
1972
      break;
 
1973
    case CODEC_ID_MSMPEG4V3:
 
1974
      name = "Microsoft MPEG-4 v3";
 
1975
      break;
 
1976
    case CODEC_ID_WMV1:
 
1977
      name = "Windows Media Video v7";
 
1978
      break;
 
1979
    case CODEC_ID_WMV2:
 
1980
      name = "Windows Media Video v8";
 
1981
      break;
 
1982
    case CODEC_ID_WMV3:
 
1983
      name = "Windows Media Video v9";
 
1984
      break;
 
1985
    case CODEC_ID_VC9:
 
1986
      name = "Microsoft Video Codec v1";
 
1987
      break;
 
1988
    case CODEC_ID_H263P:
 
1989
      name = "H.263 (P) video";
 
1990
      break;
 
1991
    case CODEC_ID_H263I:
 
1992
      name = "Intel H.263 video";
 
1993
      break;
 
1994
    case CODEC_ID_FLV1:
 
1995
      name = "FLV video";
 
1996
      break;
 
1997
    case CODEC_ID_SVQ1:
 
1998
      name = "Sorensen-1 video";
 
1999
      break;
 
2000
    case CODEC_ID_SVQ3:
 
2001
      name = "Sorensen-3 video";
 
2002
      break;
 
2003
    case CODEC_ID_DVVIDEO:
 
2004
      name = "Digital video";
 
2005
      break;
 
2006
    case CODEC_ID_DVAUDIO:
 
2007
      name = "Digital audio";
 
2008
      break;
 
2009
    case CODEC_ID_WMAV1:
 
2010
      name = "Windows Media Audio v7";
 
2011
      break;
 
2012
    case CODEC_ID_WMAV2:
 
2013
      name = "Windows Media Audio v8/9";
 
2014
      break;
 
2015
    case CODEC_ID_MACE3:
 
2016
      name = "MACE-3 audio";
 
2017
      break;
 
2018
    case CODEC_ID_MACE6:
 
2019
      name = "MACE-6 audio";
 
2020
      break;
 
2021
    case CODEC_ID_HUFFYUV:
 
2022
      name = "Huffyuv lossless video";
 
2023
      break;
 
2024
    case CODEC_ID_CYUV:
 
2025
      name = "CYUV lossless video";
 
2026
      break;
 
2027
    case CODEC_ID_H264:
 
2028
      name = "H.264 video";
 
2029
      break;
 
2030
    case CODEC_ID_INDEO3:
 
2031
      name = "Indeo-3 video";
 
2032
      break;
 
2033
    case CODEC_ID_INDEO2:
 
2034
      name = "Indeo=2 video";
 
2035
      break;
 
2036
    case CODEC_ID_VP3:
 
2037
      name = "VP3 video";
 
2038
      break;
 
2039
    case CODEC_ID_THEORA:
 
2040
      name = "Theora video";
 
2041
      break;
 
2042
    case CODEC_ID_AAC:
 
2043
    case CODEC_ID_MPEG4AAC:
 
2044
      name = "MPEG-2/4 AAC audio";
 
2045
      break;
 
2046
    case CODEC_ID_ASV1:
 
2047
      name = "Asus video v1";
 
2048
      break;
 
2049
    case CODEC_ID_ASV2:
 
2050
      name = "Asus video v2";
 
2051
      break;
 
2052
    case CODEC_ID_FFV1:
 
2053
      name = "FFMpeg video v1";
 
2054
      break;
 
2055
    case CODEC_ID_4XM:
 
2056
      name = "4-XM video";
 
2057
      break;
 
2058
    case CODEC_ID_VCR1:
 
2059
      name = "ATI VCR-1 video";
 
2060
      break;
 
2061
    case CODEC_ID_CLJR:
 
2062
      name = "Cirrus Logipak AccuPak video";
 
2063
      break;
 
2064
    case CODEC_ID_MDEC:
 
2065
      name = "Playstation MDEC video";
 
2066
      break;
 
2067
    case CODEC_ID_ROQ:
 
2068
      name = "ID/RoQ video";
 
2069
      break;
 
2070
    case CODEC_ID_INTERPLAY_VIDEO:
 
2071
      name = "Interplay video";
 
2072
      break;
 
2073
    case CODEC_ID_XAN_WC3:
 
2074
      name = "XAN Wing Commander 3 video";
 
2075
      break;
 
2076
    case CODEC_ID_XAN_WC4:
 
2077
      name = "XAN Wing Commander 4 video";
 
2078
      break;
 
2079
    case CODEC_ID_RPZA:
 
2080
      name = "Apple RPZA video";
 
2081
      break;
 
2082
    case CODEC_ID_CINEPAK:
 
2083
      name = "Cinepak video";
 
2084
      break;
 
2085
    case CODEC_ID_WS_VQA:
 
2086
      name = "Westwood VQA video";
 
2087
      break;
 
2088
    case CODEC_ID_MSRLE:
 
2089
      name = "Microsoft RLE video";
 
2090
      break;
 
2091
    case CODEC_ID_MSVIDEO1:
 
2092
      name = "Microsoft video v1";
 
2093
      break;
 
2094
    case CODEC_ID_IDCIN:
 
2095
      name = "ID Quake II CIN video";
 
2096
      break;
 
2097
    case CODEC_ID_8BPS:
 
2098
      name = "Quicktime planar 8bps video";
 
2099
      break;
 
2100
    case CODEC_ID_SMC:
 
2101
      name = "Quicktime SMC graphics video";
 
2102
      break;
 
2103
    case CODEC_ID_FLIC:
 
2104
      name = "FLIC animation video";
 
2105
      break;
 
2106
    case CODEC_ID_TRUEMOTION1:
 
2107
      name = "Duck Truemotion video";
 
2108
      break;
 
2109
    case CODEC_ID_TRUEMOTION2:
 
2110
      name = "Duck Truemotion 2 video";
 
2111
      break;
 
2112
    case CODEC_ID_VMDVIDEO:
 
2113
      name = "Sierra VMD video";
 
2114
      break;
 
2115
    case CODEC_ID_VMDAUDIO:
 
2116
      name = "Sierra VMD audio";
 
2117
      break;
 
2118
    case CODEC_ID_MSZH:
 
2119
      name = "Lossless MSZH video";
 
2120
      break;
 
2121
    case CODEC_ID_ZLIB:
 
2122
      name = "Lossless zlib video";
 
2123
      break;
 
2124
    case CODEC_ID_QTRLE:
 
2125
      name = "Quicktime RLE animation video";
 
2126
      break;
 
2127
    case CODEC_ID_SONIC:
 
2128
      name = "Sonic audio";
 
2129
      break;
 
2130
    case CODEC_ID_SONIC_LS:
 
2131
      name = "Sonic lossless audio";
 
2132
      break;
 
2133
    case CODEC_ID_SNOW:
 
2134
      name = "Snow wave video";
 
2135
      break;
 
2136
    case CODEC_ID_TSCC:
 
2137
      name = "Techsmith Camtasia video";
 
2138
      break;
 
2139
    case CODEC_ID_ULTI:
 
2140
      name = "Ultimotion video";
 
2141
      break;
 
2142
    case CODEC_ID_QDRAW:
 
2143
      name = "Applet Quickdraw video";
 
2144
      break;
 
2145
    case CODEC_ID_VIXL:
 
2146
      name = "Miro VideoXL";
 
2147
      break;
 
2148
    case CODEC_ID_QPEG:
 
2149
      name = "QPEG video";
 
2150
      break;
 
2151
    case CODEC_ID_XVID:
 
2152
      name = "XviD video";
 
2153
      break;
 
2154
    case CODEC_ID_PNG:
 
2155
      name = "PNG image";
 
2156
      break;
 
2157
    case CODEC_ID_PPM:
 
2158
      name = "PPM image";
 
2159
      break;
 
2160
    case CODEC_ID_PBM:
 
2161
      name = "PBM image";
 
2162
      break;
 
2163
    case CODEC_ID_PGM:
 
2164
      name = "PGM image";
 
2165
      break;
 
2166
    case CODEC_ID_PGMYUV:
 
2167
      name = "PGM-YUV image";
 
2168
      break;
 
2169
    case CODEC_ID_PAM:
 
2170
      name = "PAM image";
 
2171
      break;
 
2172
    case CODEC_ID_FFVHUFF:
 
2173
      name = "FFMPEG non-compliant Huffyuv video";
 
2174
      break;
 
2175
    case CODEC_ID_LOCO:
 
2176
      name = "LOCO video";
 
2177
      break;
 
2178
    case CODEC_ID_WNV1:
 
2179
      name = "Winnov video 1";
 
2180
      break;
 
2181
    case CODEC_ID_AASC:
 
2182
      name = "Autodesk RLE video";
 
2183
      break;
 
2184
    case CODEC_ID_MP3ADU:
 
2185
      name = "ADU-formatted MPEG-1 layer 3 audio";
 
2186
      break;
 
2187
    case CODEC_ID_MP3ON4:
 
2188
      name = "MP3ON4";
 
2189
      break;
 
2190
    case CODEC_ID_WESTWOOD_SND1:
 
2191
      name = "Westwood Sound-1";
 
2192
      break;
 
2193
    case CODEC_ID_PCM_MULAW:
 
2194
      name = "Mu-law audio";
 
2195
      break;
 
2196
    case CODEC_ID_PCM_ALAW:
 
2197
      name = "A-law audio";
 
2198
      break;
 
2199
    case CODEC_ID_ADPCM_IMA_QT:
 
2200
      name = "IMA/Quicktime ADPCM audio";
 
2201
      break;
 
2202
    case CODEC_ID_ADPCM_IMA_WAV:
 
2203
      name = "IMA/DVI ADPCM audio";
 
2204
      break;
 
2205
    case CODEC_ID_ADPCM_IMA_DK3:
 
2206
      name = "IMA/DK3 ADPCM audio";
 
2207
      break;
 
2208
    case CODEC_ID_ADPCM_IMA_DK4:
 
2209
      name = "IMA/DK4 ADPCM";
 
2210
      break;
 
2211
    case CODEC_ID_ADPCM_IMA_WS:
 
2212
      name = "IMA/Westwood ADPCM audio";
 
2213
      break;
 
2214
    case CODEC_ID_ADPCM_IMA_SMJPEG:
 
2215
      name = "IMA/SMJPEG ADPCM audio";
 
2216
      break;
 
2217
    case CODEC_ID_ADPCM_MS:
 
2218
      name = "Microsoft ADPCM audio";
 
2219
      break;
 
2220
    case CODEC_ID_ADPCM_4XM:
 
2221
      name = "4-XM ADPCM audio";
 
2222
      break;
 
2223
    case CODEC_ID_ADPCM_XA:
 
2224
      name = "CD-ROM XA ADPCM";
 
2225
      break;
 
2226
    case CODEC_ID_ADPCM_ADX:
 
2227
      name = "ADX ADPCM";
 
2228
      break;
 
2229
    case CODEC_ID_ADPCM_EA:
 
2230
      name = "Electronic Arts ADPCM";
 
2231
      break;
 
2232
    case CODEC_ID_ADPCM_G726:
 
2233
      name = "G.726 ADPCM";
 
2234
      break;
 
2235
    case CODEC_ID_ADPCM_CT:
 
2236
      name = "CT ADPCM";
 
2237
      break;
 
2238
    case CODEC_ID_ADPCM_SWF:
 
2239
      name = "Shockwave ADPCM";
 
2240
      break;
 
2241
    case CODEC_ID_ADPCM_YAMAHA:
 
2242
      name = "Yamaha ADPCM";
 
2243
      break;
 
2244
    case CODEC_ID_RA_144:
 
2245
      name = "Realaudio 14k4bps";
 
2246
      break;
 
2247
    case CODEC_ID_RA_288:
 
2248
      name = "Realaudio 28k8bps";
 
2249
      break;
 
2250
    case CODEC_ID_ROQ_DPCM:
 
2251
      name = "RoQ DPCM audio";
 
2252
      break;
 
2253
    case CODEC_ID_INTERPLAY_DPCM:
 
2254
      name = "Interplay DPCM audio";
 
2255
      break;
 
2256
    case CODEC_ID_XAN_DPCM:
 
2257
      name = "XAN DPCM audio";
 
2258
      break;
 
2259
    case CODEC_ID_SOL_DPCM:
 
2260
      name = "SOL DPCM audio";
 
2261
      break;
 
2262
    case CODEC_ID_FLAC:
 
2263
      name = "FLAC lossless audio";
 
2264
      break;
 
2265
    case CODEC_ID_SHORTEN:
 
2266
      name = "Shorten lossless audio";
 
2267
      break;
 
2268
    case CODEC_ID_ALAC:
 
2269
      name = "Apple lossless audio";
 
2270
      break;
 
2271
    case CODEC_ID_DVD_SUBTITLE:
 
2272
      name = "DVD subtitle";
 
2273
      break;
 
2274
    case CODEC_ID_DVB_SUBTITLE:
 
2275
      name = "DVB subtitle";
 
2276
      break;
 
2277
    case CODEC_ID_FRAPS:
 
2278
      name = "FRAPS video";
 
2279
      break;
 
2280
    default:
 
2281
      GST_WARNING ("Unknown codecID 0x%x", codec_id);
 
2282
      break;
 
2283
  }
 
2284
 
 
2285
  return name;
 
2286
}
 
2287
 
 
2288
/*
 
2289
 * Fill in pointers to memory in a AVPicture, where
 
2290
 * everything is aligned by 4 (as required by X).
 
2291
 * This is mostly a copy from imgconvert.c with some
 
2292
 * small changes.
 
2293
 */
 
2294
 
 
2295
#define FF_COLOR_RGB      0 /* RGB color space */
 
2296
#define FF_COLOR_GRAY     1 /* gray color space */
 
2297
#define FF_COLOR_YUV      2 /* YUV color space. 16 <= Y <= 235, 16 <= U, V <= 240 */
 
2298
#define FF_COLOR_YUV_JPEG 3 /* YUV color space. 0 <= Y <= 255, 0 <= U, V <= 255 */
 
2299
 
 
2300
#define FF_PIXEL_PLANAR   0 /* each channel has one component in AVPicture */
 
2301
#define FF_PIXEL_PACKED   1 /* only one components containing all the channels */
 
2302
#define FF_PIXEL_PALETTE  2  /* one components containing indexes for a palette */
 
2303
 
 
2304
typedef struct PixFmtInfo {
 
2305
    const char *name;
 
2306
    uint8_t nb_channels;     /* number of channels (including alpha) */
 
2307
    uint8_t color_type;      /* color type (see FF_COLOR_xxx constants) */
 
2308
    uint8_t pixel_type;      /* pixel storage type (see FF_PIXEL_xxx constants) */
 
2309
    uint8_t is_alpha : 1;    /* true if alpha can be specified */
 
2310
    uint8_t x_chroma_shift;  /* X chroma subsampling factor is 2 ^ shift */
 
2311
    uint8_t y_chroma_shift;  /* Y chroma subsampling factor is 2 ^ shift */
 
2312
    uint8_t depth;           /* bit depth of the color components */
 
2313
} PixFmtInfo;
 
2314
 
 
2315
/* this table gives more information about formats */
 
2316
static PixFmtInfo pix_fmt_info[PIX_FMT_NB] = {
 
2317
    /* YUV formats */
 
2318
    [PIX_FMT_YUV420P] = {
 
2319
        .name = "yuv420p",
 
2320
        .nb_channels = 3,
 
2321
        .color_type = FF_COLOR_YUV,
 
2322
        .pixel_type = FF_PIXEL_PLANAR,
 
2323
        .depth = 8,
 
2324
        .x_chroma_shift = 1, .y_chroma_shift = 1, 
 
2325
    },
 
2326
    [PIX_FMT_YUV422P] = {
 
2327
        .name = "yuv422p",
 
2328
        .nb_channels = 3,
 
2329
        .color_type = FF_COLOR_YUV,
 
2330
        .pixel_type = FF_PIXEL_PLANAR,
 
2331
        .depth = 8,
 
2332
        .x_chroma_shift = 1, .y_chroma_shift = 0, 
 
2333
    },
 
2334
    [PIX_FMT_YUV444P] = {
 
2335
        .name = "yuv444p",
 
2336
        .nb_channels = 3,
 
2337
        .color_type = FF_COLOR_YUV,
 
2338
        .pixel_type = FF_PIXEL_PLANAR,
 
2339
        .depth = 8,
 
2340
        .x_chroma_shift = 0, .y_chroma_shift = 0, 
 
2341
    },
 
2342
    [PIX_FMT_YUV422] = {
 
2343
        .name = "yuv422",
 
2344
        .nb_channels = 1,
 
2345
        .color_type = FF_COLOR_YUV,
 
2346
        .pixel_type = FF_PIXEL_PACKED,
 
2347
        .depth = 8,
 
2348
        .x_chroma_shift = 1, .y_chroma_shift = 0,
 
2349
    },
 
2350
    [PIX_FMT_YUV410P] = {
 
2351
        .name = "yuv410p",
 
2352
        .nb_channels = 3,
 
2353
        .color_type = FF_COLOR_YUV,
 
2354
        .pixel_type = FF_PIXEL_PLANAR,
 
2355
        .depth = 8,
 
2356
        .x_chroma_shift = 2, .y_chroma_shift = 2,
 
2357
    },
 
2358
    [PIX_FMT_YUV411P] = {
 
2359
        .name = "yuv411p",
 
2360
        .nb_channels = 3,
 
2361
        .color_type = FF_COLOR_YUV,
 
2362
        .pixel_type = FF_PIXEL_PLANAR,
 
2363
        .depth = 8,
 
2364
        .x_chroma_shift = 2, .y_chroma_shift = 0,
 
2365
    },
 
2366
 
 
2367
    /* JPEG YUV */
 
2368
    [PIX_FMT_YUVJ420P] = {
 
2369
        .name = "yuvj420p",
 
2370
        .nb_channels = 3,
 
2371
        .color_type = FF_COLOR_YUV_JPEG,
 
2372
        .pixel_type = FF_PIXEL_PLANAR,
 
2373
        .depth = 8,
 
2374
        .x_chroma_shift = 1, .y_chroma_shift = 1, 
 
2375
    },
 
2376
    [PIX_FMT_YUVJ422P] = {
 
2377
        .name = "yuvj422p",
 
2378
        .nb_channels = 3,
 
2379
        .color_type = FF_COLOR_YUV_JPEG,
 
2380
        .pixel_type = FF_PIXEL_PLANAR,
 
2381
        .depth = 8,
 
2382
        .x_chroma_shift = 1, .y_chroma_shift = 0, 
 
2383
    },
 
2384
    [PIX_FMT_YUVJ444P] = {
 
2385
        .name = "yuvj444p",
 
2386
        .nb_channels = 3,
 
2387
        .color_type = FF_COLOR_YUV_JPEG,
 
2388
        .pixel_type = FF_PIXEL_PLANAR,
 
2389
        .depth = 8,
 
2390
        .x_chroma_shift = 0, .y_chroma_shift = 0, 
 
2391
    },
 
2392
 
 
2393
    /* RGB formats */
 
2394
    [PIX_FMT_RGB24] = {
 
2395
        .name = "rgb24",
 
2396
        .nb_channels = 3,
 
2397
        .color_type = FF_COLOR_RGB,
 
2398
        .pixel_type = FF_PIXEL_PACKED,
 
2399
        .depth = 8,
 
2400
        .x_chroma_shift = 0, .y_chroma_shift = 0,
 
2401
    },
 
2402
    [PIX_FMT_BGR24] = {
 
2403
        .name = "bgr24",
 
2404
        .nb_channels = 3,
 
2405
        .color_type = FF_COLOR_RGB,
 
2406
        .pixel_type = FF_PIXEL_PACKED,
 
2407
        .depth = 8,
 
2408
        .x_chroma_shift = 0, .y_chroma_shift = 0,
 
2409
    },
 
2410
    [PIX_FMT_RGBA32] = {
 
2411
        .name = "rgba32",
 
2412
        .nb_channels = 4, .is_alpha = 1,
 
2413
        .color_type = FF_COLOR_RGB,
 
2414
        .pixel_type = FF_PIXEL_PACKED,
 
2415
        .depth = 8,
 
2416
        .x_chroma_shift = 0, .y_chroma_shift = 0,
 
2417
    },
 
2418
    [PIX_FMT_RGB565] = {
 
2419
        .name = "rgb565",
 
2420
        .nb_channels = 3,
 
2421
        .color_type = FF_COLOR_RGB,
 
2422
        .pixel_type = FF_PIXEL_PACKED,
 
2423
        .depth = 5,
 
2424
        .x_chroma_shift = 0, .y_chroma_shift = 0,
 
2425
    },
 
2426
    [PIX_FMT_RGB555] = {
 
2427
        .name = "rgb555",
 
2428
        .nb_channels = 4, .is_alpha = 1,
 
2429
        .color_type = FF_COLOR_RGB,
 
2430
        .pixel_type = FF_PIXEL_PACKED,
 
2431
        .depth = 5,
 
2432
        .x_chroma_shift = 0, .y_chroma_shift = 0,
 
2433
    },
 
2434
 
 
2435
    /* gray / mono formats */
 
2436
    [PIX_FMT_GRAY8] = {
 
2437
        .name = "gray",
 
2438
        .nb_channels = 1,
 
2439
        .color_type = FF_COLOR_GRAY,
 
2440
        .pixel_type = FF_PIXEL_PLANAR,
 
2441
        .depth = 8,
 
2442
    },
 
2443
    [PIX_FMT_MONOWHITE] = {
 
2444
        .name = "monow",
 
2445
        .nb_channels = 1,
 
2446
        .color_type = FF_COLOR_GRAY,
 
2447
        .pixel_type = FF_PIXEL_PLANAR,
 
2448
        .depth = 1,
 
2449
    },
 
2450
    [PIX_FMT_MONOBLACK] = {
 
2451
        .name = "monob",
 
2452
        .nb_channels = 1,
 
2453
        .color_type = FF_COLOR_GRAY,
 
2454
        .pixel_type = FF_PIXEL_PLANAR,
 
2455
        .depth = 1,
 
2456
    },
 
2457
 
 
2458
    /* paletted formats */
 
2459
    [PIX_FMT_PAL8] = {
 
2460
        .name = "pal8",
 
2461
        .nb_channels = 4, .is_alpha = 1,
 
2462
        .color_type = FF_COLOR_RGB,
 
2463
        .pixel_type = FF_PIXEL_PALETTE,
 
2464
        .depth = 8,
 
2465
    },
 
2466
};
 
2467
 
 
2468
int
 
2469
gst_ffmpeg_avpicture_get_size (int pix_fmt, int width, int height)
 
2470
{
 
2471
  AVPicture dummy_pict;
 
2472
 
 
2473
  return gst_ffmpeg_avpicture_fill (&dummy_pict, NULL, pix_fmt, width, height);
 
2474
}
 
2475
 
 
2476
#define GEN_MASK(x) ((1<<(x))-1)
 
2477
#define ROUND_UP_X(v,x) (((v) + GEN_MASK(x)) & ~GEN_MASK(x))
 
2478
#define ROUND_UP_2(x) ROUND_UP_X (x, 1)
 
2479
#define ROUND_UP_4(x) ROUND_UP_X (x, 2)
 
2480
#define ROUND_UP_8(x) ROUND_UP_X (x, 3)
 
2481
#define DIV_ROUND_UP_X(v,x) (((v) + GEN_MASK(x)) >> (x))
 
2482
 
 
2483
int
 
2484
gst_ffmpeg_avpicture_fill (AVPicture * picture,
 
2485
    uint8_t * ptr, enum PixelFormat pix_fmt, int width, int height)
 
2486
{
 
2487
  int size, w2, h2, size2;
 
2488
  int stride, stride2;
 
2489
  PixFmtInfo *pinfo;
 
2490
 
 
2491
  pinfo = &pix_fmt_info[pix_fmt];
 
2492
 
 
2493
  switch (pix_fmt) {
 
2494
    case PIX_FMT_YUV420P:
 
2495
    case PIX_FMT_YUV422P:
 
2496
    case PIX_FMT_YUV444P:
 
2497
    case PIX_FMT_YUV410P:
 
2498
    case PIX_FMT_YUV411P:
 
2499
    case PIX_FMT_YUVJ420P:
 
2500
    case PIX_FMT_YUVJ422P:
 
2501
    case PIX_FMT_YUVJ444P:
 
2502
      stride = ROUND_UP_4 (width);
 
2503
      h2 = ROUND_UP_X (height, pinfo->y_chroma_shift);
 
2504
      size = stride * h2;
 
2505
      w2 = DIV_ROUND_UP_X (width, pinfo->x_chroma_shift);
 
2506
      stride2 = ROUND_UP_4 (w2);
 
2507
      h2 = DIV_ROUND_UP_X (height, pinfo->y_chroma_shift);
 
2508
      size2 = stride2 * h2;
 
2509
      picture->data[0] = ptr;
 
2510
      picture->data[1] = picture->data[0] + size;
 
2511
      picture->data[2] = picture->data[1] + size2;
 
2512
      picture->linesize[0] = stride;
 
2513
      picture->linesize[1] = stride2;
 
2514
      picture->linesize[2] = stride2;
 
2515
      return size + 2 * size2;
 
2516
    case PIX_FMT_RGB24:
 
2517
    case PIX_FMT_BGR24:
 
2518
      stride = ROUND_UP_4 (width * 3);
 
2519
      size = stride * height;
 
2520
      picture->data[0] = ptr;
 
2521
      picture->data[1] = NULL;
 
2522
      picture->data[2] = NULL;
 
2523
      picture->linesize[0] = stride;
 
2524
      return size;
 
2525
    /*case PIX_FMT_AYUV4444:
 
2526
    case PIX_FMT_RGB32:*/
 
2527
    case PIX_FMT_RGBA32:
 
2528
      stride = width * 4;
 
2529
      size = stride * height;
 
2530
      picture->data[0] = ptr;
 
2531
      picture->data[1] = NULL;
 
2532
      picture->data[2] = NULL;
 
2533
      picture->linesize[0] = stride;
 
2534
      return size;
 
2535
    case PIX_FMT_RGB555:
 
2536
    case PIX_FMT_RGB565:
 
2537
    case PIX_FMT_YUV422:
 
2538
    case PIX_FMT_UYVY422:
 
2539
      stride = ROUND_UP_4 (width * 2);
 
2540
      size = stride * height;
 
2541
      picture->data[0] = ptr;
 
2542
      picture->data[1] = NULL;
 
2543
      picture->data[2] = NULL;
 
2544
      picture->linesize[0] = stride;
 
2545
      return size;
 
2546
    case PIX_FMT_UYVY411:
 
2547
      /* FIXME, probably not the right stride */
 
2548
      stride = ROUND_UP_4 (width);
 
2549
      size = stride * height;
 
2550
      picture->data[0] = ptr;
 
2551
      picture->data[1] = NULL;
 
2552
      picture->data[2] = NULL;
 
2553
      picture->linesize[0] = width + width / 2;
 
2554
      return size + size / 2;
 
2555
    case PIX_FMT_GRAY8:
 
2556
      stride = ROUND_UP_4 (width);
 
2557
      size = stride * height;
 
2558
      picture->data[0] = ptr;
 
2559
      picture->data[1] = NULL;
 
2560
      picture->data[2] = NULL;
 
2561
      picture->linesize[0] = stride;
 
2562
      return size;
 
2563
    case PIX_FMT_MONOWHITE:
 
2564
    case PIX_FMT_MONOBLACK:
 
2565
      stride = ROUND_UP_4 ((width + 7) >> 3);
 
2566
      size = stride * height;
 
2567
      picture->data[0] = ptr;
 
2568
      picture->data[1] = NULL;
 
2569
      picture->data[2] = NULL;
 
2570
      picture->linesize[0] = stride;
 
2571
      return size;
 
2572
    case PIX_FMT_PAL8:
 
2573
      /* already forced to be with stride, so same result as other function */
 
2574
      stride = ROUND_UP_4 (width);
 
2575
      size = stride * height;
 
2576
      picture->data[0] = ptr;
 
2577
      picture->data[1] = ptr + size;    /* palette is stored here as 256 32 bit words */
 
2578
      picture->data[2] = NULL;
 
2579
      picture->linesize[0] = stride;
 
2580
      picture->linesize[1] = 4;
 
2581
      return size + 256 * 4;
 
2582
    default:
 
2583
      picture->data[0] = NULL;
 
2584
      picture->data[1] = NULL;
 
2585
      picture->data[2] = NULL;
 
2586
      picture->data[3] = NULL;
 
2587
      return -1;
 
2588
  }
 
2589
 
 
2590
  return 0;
 
2591
}
 
2592
 
 
2593
/**
 
2594
 * Convert image 'src' to 'dst'.
 
2595
 *
 
2596
 * We use this code to copy two pictures between the same
 
2597
 * colorspaces, so this function is not realy used to do
 
2598
 * colorspace conversion.
 
2599
 * The ffmpeg code has a bug in it where odd sized frames were
 
2600
 * not copied completely. We adjust the input parameters for
 
2601
 * the original ffmpeg img_convert function here so that it
 
2602
 * still does the right thing.
 
2603
 */
 
2604
int
 
2605
gst_ffmpeg_img_convert (AVPicture * dst, int dst_pix_fmt,
 
2606
    const AVPicture * src, int src_pix_fmt, int src_width, int src_height)
 
2607
{
 
2608
  PixFmtInfo *pf = &pix_fmt_info[src_pix_fmt];
 
2609
 
 
2610
  pf = &pix_fmt_info[src_pix_fmt];
 
2611
  switch (pf->pixel_type) {
 
2612
    case FF_PIXEL_PACKED:
 
2613
      /* nothing wrong here */
 
2614
      break;
 
2615
    case FF_PIXEL_PLANAR:
 
2616
      /* patch up, so that img_copy copies all of the pixels */
 
2617
      src_width = ROUND_UP_X (src_width, pf->x_chroma_shift);
 
2618
      src_height = ROUND_UP_X (src_height, pf->y_chroma_shift);
 
2619
      break;
 
2620
    case FF_PIXEL_PALETTE:
 
2621
      /* nothing wrong here */
 
2622
      break;
 
2623
  }
 
2624
  return img_convert (dst, dst_pix_fmt, src, src_pix_fmt, src_width, src_height);
 
2625
}