gstffmpegcodecmap.c 97.3 KB
Newer Older
1 2
/* GStreamer
 * 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 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

22
#ifdef HAVE_CONFIG_H
23
#include "config.h"
24
#endif
25
#include <gst/gst.h>
26
#ifdef HAVE_LIBAV_UNINSTALLED
27 28
#include <avcodec.h>
#else
29
#include <libavcodec/avcodec.h>
30
#endif
31
#include <string.h>
32

33
#include "gstffmpeg.h"
34 35
#include "gstffmpegcodecmap.h"

Wim Taymans's avatar
Wim Taymans committed
36
#include <gst/video/video.h>
Wim Taymans's avatar
Wim Taymans committed
37
#include <gst/audio/audio.h>
38 39
#include <gst/pbutils/codec-utils.h>

40 41 42 43 44
/*
 * Read a palette from a caps.
 */

static void
45
gst_ffmpeg_get_palette (const GstCaps * caps, AVCodecContext * context)
46 47 48
{
  GstStructure *str = gst_caps_get_structure (caps, 0);
  const GValue *palette_v;
Wim Taymans's avatar
Wim Taymans committed
49
  GstBuffer *palette;
50 51

  /* do we have a palette? */
52
  if ((palette_v = gst_structure_get_value (str, "palette_data")) && context) {
53
    palette = gst_value_get_buffer (palette_v);
Wim Taymans's avatar
Wim Taymans committed
54
    if (gst_buffer_get_size (palette) >= AVPALETTE_SIZE) {
55 56 57 58
      if (context->palctrl)
        av_free (context->palctrl);
      context->palctrl = av_malloc (sizeof (AVPaletteControl));
      context->palctrl->palette_changed = 1;
Wim Taymans's avatar
Wim Taymans committed
59
      gst_buffer_extract (palette, 0, context->palctrl->palette,
60 61 62 63 64 65
          AVPALETTE_SIZE);
    }
  }
}

static void
66
gst_ffmpeg_set_palette (GstCaps * caps, AVCodecContext * context)
67 68
{
  if (context->palctrl) {
69
    GstBuffer *palette = gst_buffer_new_and_alloc (AVPALETTE_SIZE);
70

Wim Taymans's avatar
Wim Taymans committed
71
    gst_buffer_fill (palette, 0, context->palctrl->palette, AVPALETTE_SIZE);
72
    gst_caps_set_simple (caps, "palette_data", GST_TYPE_BUFFER, palette, NULL);
73 74 75
  }
}

76 77 78 79 80 81 82 83 84 85
/* IMPORTANT: Keep this sorted by the ffmpeg channel masks */
static const struct
{
  guint64 ff;
  GstAudioChannelPosition gst;
} _ff_to_gst_layout[] = {
  {
  CH_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT}, {
  CH_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}, {
  CH_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER}, {
86
  CH_LOW_FREQUENCY, GST_AUDIO_CHANNEL_POSITION_LFE1}, {
87 88 89 90 91 92 93
  CH_BACK_LEFT, GST_AUDIO_CHANNEL_POSITION_REAR_LEFT}, {
  CH_BACK_RIGHT, GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, {
  CH_FRONT_LEFT_OF_CENTER, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER}, {
  CH_FRONT_RIGHT_OF_CENTER, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER}, {
  CH_BACK_CENTER, GST_AUDIO_CHANNEL_POSITION_REAR_CENTER}, {
  CH_SIDE_LEFT, GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT}, {
  CH_SIDE_RIGHT, GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT}, {
94 95 96 97 98 99 100
  CH_TOP_CENTER, GST_AUDIO_CHANNEL_POSITION_TOP_CENTER}, {
  CH_TOP_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_LEFT}, {
  CH_TOP_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_CENTER}, {
  CH_TOP_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_RIGHT}, {
  CH_TOP_BACK_LEFT, GST_AUDIO_CHANNEL_POSITION_TOP_REAR_LEFT}, {
  CH_TOP_BACK_CENTER, GST_AUDIO_CHANNEL_POSITION_TOP_REAR_CENTER}, {
  CH_TOP_BACK_RIGHT, GST_AUDIO_CHANNEL_POSITION_TOP_REAR_RIGHT}, {
101 102 103 104
  CH_STEREO_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT}, {
  CH_STEREO_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}
};

105 106
gboolean
gst_ffmpeg_channel_layout_to_gst (AVCodecContext * context,
107
    GstAudioChannelPosition * pos)
108
{
109 110
  guint nchannels = 0, channels = context->channels;
  guint64 channel_layout = context->channel_layout;
111 112 113 114 115
  gboolean none_layout = FALSE;

  if (channel_layout == 0) {
    nchannels = channels;
    none_layout = TRUE;
116 117
  } else {
    guint i, j;
118

119 120 121 122 123 124 125 126 127 128 129 130
    for (i = 0; i < 64; i++) {
      if ((channel_layout & (G_GUINT64_CONSTANT (1) << i)) != 0) {
        nchannels++;
      }
    }

    if (nchannels != channels) {
      GST_ERROR ("Number of channels is different (%u != %u)", channels,
          nchannels);
      nchannels = channels;
      none_layout = TRUE;
    } else {
131

132 133 134
      for (i = 0, j = 0; i < G_N_ELEMENTS (_ff_to_gst_layout); i++) {
        if ((channel_layout & _ff_to_gst_layout[i].ff) != 0) {
          pos[j++] = _ff_to_gst_layout[i].gst;
135

136 137 138 139 140 141 142 143
          if (_ff_to_gst_layout[i].gst == GST_AUDIO_CHANNEL_POSITION_NONE)
            none_layout = TRUE;
        }
      }

      if (j != nchannels) {
        GST_WARNING
            ("Unknown channels in channel layout - assuming NONE layout");
144
        none_layout = TRUE;
145
      }
146 147 148
    }
  }

149
  if (!none_layout
150
      && !gst_audio_check_valid_channel_positions (pos, nchannels, FALSE)) {
151 152
    GST_ERROR ("Invalid channel layout %" G_GUINT64_FORMAT
        " - assuming NONE layout", channel_layout);
153 154 155 156 157
    none_layout = TRUE;
  }

  if (none_layout) {
    if (nchannels == 1) {
158
      pos[0] = GST_AUDIO_CHANNEL_POSITION_MONO;
159 160 161 162
    } else if (nchannels == 2) {
      pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
      pos[1] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
    } else {
163 164
      guint i;

165 166 167 168 169
      for (i = 0; i < nchannels; i++)
        pos[i] = GST_AUDIO_CHANNEL_POSITION_NONE;
    }
  }

170
  return TRUE;
171 172
}

173 174 175 176
/* this macro makes a caps width fixed or unfixed width/height
 * properties depending on whether we've got a context.
 *
 * See below for why we use this.
177 178 179
 *
 * We should actually do this stuff at the end, like in riff-media.c,
 * but I'm too lazy today. Maybe later.
180
 */
181
static GstCaps *
182 183
gst_ff_vid_caps_new (AVCodecContext * context, enum CodecID codec_id,
    const char *mimetype, const char *fieldname, ...)
184 185 186 187
{
  GstStructure *structure = NULL;
  GstCaps *caps = NULL;
  va_list var_args;
188
  gint i;
189

190 191
  GST_LOG ("context:%p, codec_id:%d, mimetype:%s", context, codec_id, mimetype);

192 193
  /* fixed, non probing context */
  if (context != NULL && context->width != -1) {
194 195
    gint num, denom;

196 197
    caps = gst_caps_new_simple (mimetype,
        "width", G_TYPE_INT, context->width,
198 199 200 201 202
        "height", G_TYPE_INT, context->height, NULL);

    num = context->time_base.den / context->ticks_per_frame;
    denom = context->time_base.num;

203 204 205 206
    if (!denom) {
      GST_LOG ("invalid framerate: %d/0, -> %d/1", num, num);
      denom = 1;
    }
207 208 209 210 211 212 213 214
    if (gst_util_fraction_compare (num, denom, 1000, 1) > 0) {
      GST_LOG ("excessive framerate: %d/%d, -> 0/1", num, denom);
      num = 0;
      denom = 1;
    }
    GST_LOG ("setting framerate: %d/%d", num, denom);
    gst_caps_set_simple (caps,
        "framerate", GST_TYPE_FRACTION, num, denom, NULL);
215
  } else {
216
    /* so we are after restricted caps in this case */
217
    switch (codec_id) {
218 219 220 221 222 223 224 225 226 227 228 229
      case CODEC_ID_H261:
      {
        caps = gst_caps_new_simple (mimetype,
            "width", G_TYPE_INT, 352,
            "height", G_TYPE_INT, 288,
            "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
        gst_caps_append (caps, gst_caps_new_simple (mimetype,
                "width", G_TYPE_INT, 176,
                "height", G_TYPE_INT, 144,
                "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL));
        break;
      }
230 231 232 233 234 235 236 237 238
      case CODEC_ID_H263:
      {
        /* 128x96, 176x144, 352x288, 704x576, and 1408x1152. slightly reordered
         * because we want automatic negotiation to go as close to 320x240 as
         * possible. */
        const static gint widths[] = { 352, 704, 176, 1408, 128 };
        const static gint heights[] = { 288, 576, 144, 1152, 96 };
        GstCaps *temp;
        gint n_sizes = G_N_ELEMENTS (widths);
239

240 241 242 243 244 245
        caps = gst_caps_new_empty ();
        for (i = 0; i < n_sizes; i++) {
          temp = gst_caps_new_simple (mimetype,
              "width", G_TYPE_INT, widths[i],
              "height", G_TYPE_INT, heights[i],
              "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
246

247 248 249 250
          gst_caps_append (caps, temp);
        }
        break;
      }
251 252
      case CODEC_ID_DVVIDEO:
      {
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
        static struct
        {
          guint32 csp;
          gint width, height;
          gint par_n, par_d;
          gint framerate_n, framerate_d;
        } profiles[] = {
          {
          GST_MAKE_FOURCC ('Y', '4', '1', 'B'), 720, 480, 10, 11, 30000, 1001}, {
          GST_MAKE_FOURCC ('Y', '4', '1', 'B'), 720, 480, 40, 33, 30000, 1001}, {
          GST_MAKE_FOURCC ('I', '4', '2', '0'), 720, 576, 59, 54, 25, 1}, {
          GST_MAKE_FOURCC ('I', '4', '2', '0'), 720, 576, 118, 81, 25, 1}, {
          GST_MAKE_FOURCC ('Y', '4', '1', 'B'), 720, 576, 59, 54, 25, 1}, {
          GST_MAKE_FOURCC ('Y', '4', '1', 'B'), 720, 576, 118, 81, 25, 1}
        };
268
        GstCaps *temp;
269
        gint n_sizes = G_N_ELEMENTS (profiles);
270 271 272 273

        caps = gst_caps_new_empty ();
        for (i = 0; i < n_sizes; i++) {
          temp = gst_caps_new_simple (mimetype,
274 275 276 277 278
              "width", G_TYPE_INT, profiles[i].width,
              "height", G_TYPE_INT, profiles[i].height,
              "framerate", GST_TYPE_FRACTION, profiles[i].framerate_n,
              profiles[i].framerate_d, "pixel-aspect-ratio", GST_TYPE_FRACTION,
              profiles[i].par_n, profiles[i].par_d, NULL);
279 280

          gst_caps_append (caps, temp);
281
        }
282 283
        break;
      }
284 285
      case CODEC_ID_DNXHD:
      {
286
        caps = gst_caps_new_simple (mimetype,
287 288
            "width", G_TYPE_INT, 1920,
            "height", G_TYPE_INT, 1080,
289
            "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
290 291 292 293 294 295 296
        gst_caps_append (caps, gst_caps_new_simple (mimetype,
                "width", G_TYPE_INT, 1280,
                "height", G_TYPE_INT, 720,
                "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL));
        break;
      }
      default:
297 298 299 300
        break;
    }
  }

301 302
  /* no fixed caps or special restrictions applied;
   * default unfixed setting */
303 304
  if (!caps) {
    GST_DEBUG ("Creating default caps");
305
    caps = gst_caps_new_simple (mimetype, NULL, NULL, NULL);
306
  }
307

308
  for (i = 0; i < gst_caps_get_size (caps); i++) {
309
    va_start (var_args, fieldname);
310
    structure = gst_caps_get_structure (caps, i);
311 312 313 314 315 316
    gst_structure_set_valist (structure, fieldname, var_args);
    va_end (var_args);
  }

  return caps;
}
317 318 319

/* same for audio - now with channels/sample rate
 */
320
static GstCaps *
321 322
gst_ff_aud_caps_new (AVCodecContext * context, enum CodecID codec_id,
    const char *mimetype, const char *fieldname, ...)
323 324 325
{
  GstCaps *caps = NULL;
  GstStructure *structure = NULL;
326
  gint i;
327 328
  va_list var_args;

329 330
  /* fixed, non-probing context */
  if (context != NULL && context->channels != -1) {
331
    GstAudioChannelPosition pos[64];
332

333 334
    caps = gst_caps_new_simple (mimetype,
        "rate", G_TYPE_INT, context->sample_rate,
335
        "channels", G_TYPE_INT, context->channels, NULL);
336

337
    if (gst_ffmpeg_channel_layout_to_gst (context, pos)) {
338 339 340
      guint64 mask;

      if (gst_audio_channel_positions_to_mask (pos, context->channels, &mask)) {
341
        gst_caps_set_simple (caps, "channel-mask", GST_TYPE_BITMASK, mask,
342 343
            NULL);
      }
344
    }
345
  } else {
346 347 348
    gint maxchannels = 2;
    const gint *rates = NULL;
    gint n_rates = 0;
349

350
    /* so we must be after restricted caps in this case */
351 352
    switch (codec_id) {
      case CODEC_ID_AAC:
353
      case CODEC_ID_AAC_LATM:
354 355 356
      case CODEC_ID_DTS:
        maxchannels = 6;
        break;
357 358 359 360 361 362 363
      case CODEC_ID_MP2:
      {
        const static gint l_rates[] =
            { 48000, 44100, 32000, 24000, 22050, 16000 };
        n_rates = G_N_ELEMENTS (l_rates);
        rates = l_rates;
        break;
364
      }
365 366 367 368 369 370 371 372 373 374
      case CODEC_ID_EAC3:
      case CODEC_ID_AC3:
      {
        const static gint l_rates[] = { 48000, 44100, 32000 };
        maxchannels = 6;
        n_rates = G_N_ELEMENTS (l_rates);
        rates = l_rates;
        break;
      }
      case CODEC_ID_ADPCM_G722:
375 376 377 378 379 380 381
      {
        const static gint l_rates[] = { 16000 };
        n_rates = G_N_ELEMENTS (l_rates);
        rates = l_rates;
        maxchannels = 1;
        break;
      }
382
      case CODEC_ID_ADPCM_G726:
383 384 385 386
      {
        const static gint l_rates[] = { 8000 };
        n_rates = G_N_ELEMENTS (l_rates);
        rates = l_rates;
387 388
        maxchannels = 1;
        break;
389
      }
390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421
      case CODEC_ID_ADPCM_SWF:
      {
        const static gint l_rates[] = { 11025, 22050, 44100 };
        n_rates = G_N_ELEMENTS (l_rates);
        rates = l_rates;
        break;
      }
      case CODEC_ID_ROQ_DPCM:
      {
        const static gint l_rates[] = { 22050 };
        n_rates = G_N_ELEMENTS (l_rates);
        rates = l_rates;
        break;
      }
      case CODEC_ID_AMR_NB:
      {
        const static gint l_rates[] = { 8000 };
        maxchannels = 1;
        n_rates = G_N_ELEMENTS (l_rates);
        rates = l_rates;
        break;
      }
      case CODEC_ID_AMR_WB:
      {
        const static gint l_rates[] = { 16000 };
        maxchannels = 1;
        n_rates = G_N_ELEMENTS (l_rates);
        rates = l_rates;
        break;
      }
      default:
        break;
422 423
    }

424 425 426 427
    /* TODO: handle context->channel_layouts here to set
     * the list of channel layouts supported by the encoder.
     * Unfortunately no encoder uses this yet....
     */
428 429 430 431
    /* regardless of encode/decode, open up channels if applicable */
    /* Until decoders/encoders expose the maximum number of channels
     * they support, we whitelist them here. */
    switch (codec_id) {
432 433 434 435
      case CODEC_ID_WMAPRO:
      case CODEC_ID_TRUEHD:
        maxchannels = 8;
        break;
436 437 438
      default:
        break;
    }
439

440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462
    if (maxchannels == 1)
      caps = gst_caps_new_simple (mimetype,
          "channels", G_TYPE_INT, maxchannels, NULL);
    else
      caps = gst_caps_new_simple (mimetype,
          "channels", GST_TYPE_INT_RANGE, 1, maxchannels, NULL);
    if (n_rates) {
      GValue list = { 0, };
      GstStructure *structure;

      g_value_init (&list, GST_TYPE_LIST);
      for (i = 0; i < n_rates; i++) {
        GValue v = { 0, };

        g_value_init (&v, G_TYPE_INT);
        g_value_set_int (&v, rates[i]);
        gst_value_list_append_value (&list, &v);
        g_value_unset (&v);
      }
      structure = gst_caps_get_structure (caps, 0);
      gst_structure_set_value (structure, "rate", &list);
      g_value_unset (&list);
    } else
463
      gst_caps_set_simple (caps, "rate", GST_TYPE_INT_RANGE, 4000, 96000, NULL);
464 465
  }

466
  for (i = 0; i < gst_caps_get_size (caps); i++) {
467
    va_start (var_args, fieldname);
468
    structure = gst_caps_get_structure (caps, i);
469 470 471 472 473 474
    gst_structure_set_valist (structure, fieldname, var_args);
    va_end (var_args);
  }

  return caps;
}
475 476 477 478 479 480

/* Convert a FFMPEG codec ID and optional AVCodecContext
 * to a GstCaps. If the context is ommitted, no fixed values
 * for video/audio size will be included in the GstCaps
 *
 * CodecID is primarily meant for compressed data GstCaps!
481 482 483 484 485 486 487 488 489
 *
 * encode is a special parameter. gstffmpegdec will say
 * FALSE, gstffmpegenc will say TRUE. The output caps
 * depends on this, in such a way that it will be very
 * specific, defined, fixed and correct caps for encoders,
 * yet very wide, "forgiving" caps for decoders. Example
 * for mp3: decode: audio/mpeg,mpegversion=1,layer=[1-3]
 * but encode: audio/mpeg,mpegversion=1,layer=3,bitrate=x,
 * rate=x,channels=x.
490 491
 */

492
GstCaps *
Thomas Vander Stichele's avatar
indent  
Thomas Vander Stichele committed
493 494
gst_ffmpeg_codecid_to_caps (enum CodecID codec_id,
    AVCodecContext * context, gboolean encode)
495
{
496
  GstCaps *caps = NULL;
497
  gboolean buildcaps = FALSE;
498

499 500
  GST_LOG ("codec_id:%d, context:%p, encode:%d", codec_id, context, encode);

501
  switch (codec_id) {
502
    case CODEC_ID_MPEG1VIDEO:
503 504 505 506
      /* FIXME: bitrate */
      caps = gst_ff_vid_caps_new (context, codec_id, "video/mpeg",
          "mpegversion", G_TYPE_INT, 1,
          "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
507 508 509 510 511
      break;

    case CODEC_ID_MPEG2VIDEO:
      if (encode) {
        /* FIXME: bitrate */
512
        caps = gst_ff_vid_caps_new (context, codec_id, "video/mpeg",
Thomas Vander Stichele's avatar
indent  
Thomas Vander Stichele committed
513 514
            "mpegversion", G_TYPE_INT, 2,
            "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
515 516 517 518
      } else {
        /* decode both MPEG-1 and MPEG-2; width/height/fps are all in
         * the MPEG video stream headers, so may be omitted from caps. */
        caps = gst_caps_new_simple ("video/mpeg",
Thomas Vander Stichele's avatar
indent  
Thomas Vander Stichele committed
519 520
            "mpegversion", GST_TYPE_INT_RANGE, 1, 2,
            "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
521
      }
522
      break;
523 524 525 526 527 528

    case CODEC_ID_MPEG2VIDEO_XVMC:
      /* this is a special ID - don't need it in GStreamer, I think */
      break;

    case CODEC_ID_H263:
529
      if (encode) {
530
        caps = gst_ff_vid_caps_new (context, codec_id, "video/x-h263",
531 532 533
            "variant", G_TYPE_STRING, "itu",
            "h263version", G_TYPE_STRING, "h263", NULL);
      } else {
534 535 536 537
        /* don't pass codec_id, we can decode other variants with the H263
         * decoder that don't have specific size requirements
         */
        caps = gst_ff_vid_caps_new (context, CODEC_ID_NONE, "video/x-h263",
538 539
            "variant", G_TYPE_STRING, "itu", NULL);
      }
540 541 542
      break;

    case CODEC_ID_H263P:
543
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-h263",
544 545
          "variant", G_TYPE_STRING, "itu",
          "h263version", G_TYPE_STRING, "h263p", NULL);
546 547 548 549 550 551 552 553 554
      if (encode && context) {

        gst_caps_set_simple (caps,
            "annex-f", G_TYPE_BOOLEAN, context->flags & CODEC_FLAG_4MV,
            "annex-j", G_TYPE_BOOLEAN, context->flags & CODEC_FLAG_LOOP_FILTER,
            "annex-i", G_TYPE_BOOLEAN, context->flags & CODEC_FLAG_AC_PRED,
            "annex-t", G_TYPE_BOOLEAN, context->flags & CODEC_FLAG_AC_PRED,
            NULL);
      }
555
      break;
556

557
    case CODEC_ID_H263I:
558
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-intel-h263",
559
          "variant", G_TYPE_STRING, "intel", NULL);
560 561
      break;

562
    case CODEC_ID_H261:
563
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-h261", NULL);
564 565
      break;

566
    case CODEC_ID_RV10:
567
    case CODEC_ID_RV20:
568
    case CODEC_ID_RV30:
569
    case CODEC_ID_RV40:
570 571
    {
      gint version;
572

573 574 575 576
      switch (codec_id) {
        case CODEC_ID_RV40:
          version = 4;
          break;
577 578 579
        case CODEC_ID_RV30:
          version = 3;
          break;
580 581 582 583 584 585 586
        case CODEC_ID_RV20:
          version = 2;
          break;
        default:
          version = 1;
          break;
      }
587

588 589 590 591 592
      /* FIXME: context->sub_id must be filled in during decoding */
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-pn-realvideo",
          "systemstream", G_TYPE_BOOLEAN, FALSE,
          "rmversion", G_TYPE_INT, version, NULL);
      if (context) {
593
        gst_caps_set_simple (caps, "format", G_TYPE_INT, context->sub_id, NULL);
594 595
        if (context->extradata_size >= 8) {
          gst_caps_set_simple (caps,
596 597 598
              "subformat", G_TYPE_INT, GST_READ_UINT32_BE (context->extradata),
              NULL);
        }
599
      }
600
    }
601
      break;
602

603 604 605 606 607 608
    case CODEC_ID_MP1:
      /* FIXME: bitrate */
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/mpeg",
          "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 1, NULL);
      break;

609
    case CODEC_ID_MP2:
610 611 612
      /* FIXME: bitrate */
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/mpeg",
          "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 2, NULL);
613
      break;
614

615 616 617
    case CODEC_ID_MP3:
      if (encode) {
        /* FIXME: bitrate */
618
        caps = gst_ff_aud_caps_new (context, codec_id, "audio/mpeg",
Thomas Vander Stichele's avatar
indent  
Thomas Vander Stichele committed
619
            "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, NULL);
620 621 622 623
      } else {
        /* Decodes MPEG-1 layer 1/2/3. Samplerate, channels et al are
         * in the MPEG audio header, so may be omitted from caps. */
        caps = gst_caps_new_simple ("audio/mpeg",
Thomas Vander Stichele's avatar
indent  
Thomas Vander Stichele committed
624 625
            "mpegversion", G_TYPE_INT, 1,
            "layer", GST_TYPE_INT_RANGE, 1, 3, NULL);
626
      }
627
      break;
628

629 630 631 632 633 634 635
    case CODEC_ID_MUSEPACK7:
      caps =
          gst_ff_aud_caps_new (context, codec_id,
          "audio/x-ffmpeg-parsed-musepack", "streamversion", G_TYPE_INT, 7,
          NULL);
      break;

636 637 638 639 640 641 642
    case CODEC_ID_MUSEPACK8:
      caps =
          gst_ff_aud_caps_new (context, codec_id,
          "audio/x-ffmpeg-parsed-musepack", "streamversion", G_TYPE_INT, 8,
          NULL);
      break;

643 644 645
    case CODEC_ID_AC3:
      /* FIXME: bitrate */
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-ac3", NULL);
646
      break;
647

648 649 650 651 652
    case CODEC_ID_EAC3:
      /* FIXME: bitrate */
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-eac3", NULL);
      break;

653 654 655 656 657
    case CODEC_ID_TRUEHD:
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-true-hd", NULL);
      break;

    case CODEC_ID_ATRAC1:
658
      caps =
659
          gst_ff_aud_caps_new (context, codec_id, "audio/x-vnd.sony.atrac1",
660
          NULL);
661
      break;
662

663 664
    case CODEC_ID_ATRAC3:
      caps =
665
          gst_ff_aud_caps_new (context, codec_id, "audio/x-vnd.sony.atrac3",
666 667 668
          NULL);
      break;

669
    case CODEC_ID_DTS:
670
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-dts", NULL);
671
      break;
672

673 674 675 676 677 678
    case CODEC_ID_APE:
      caps =
          gst_ff_aud_caps_new (context, codec_id, "audio/x-ffmpeg-parsed-ape",
          NULL);
      if (context) {
        gst_caps_set_simple (caps,
679
            "depth", G_TYPE_INT, context->bits_per_coded_sample, NULL);
680 681 682
      }
      break;

683 684 685
    case CODEC_ID_MLP:
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-mlp", NULL);
      break;
686

687 688 689
    case CODEC_ID_IMC:
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-imc", NULL);
      break;
690

Thomas Vander Stichele's avatar
indent  
Thomas Vander Stichele committed
691 692 693 694 695
      /* MJPEG is normal JPEG, Motion-JPEG and Quicktime MJPEG-A. MJPEGB
       * is Quicktime's MJPEG-B. LJPEG is lossless JPEG. I don't know what
       * sp5x is, but it's apparently something JPEG... We don't separate
       * between those in GStreamer. Should we (at least between MJPEG,
       * MJPEG-B and sp5x decoding...)? */
696
    case CODEC_ID_MJPEG:
697
    case CODEC_ID_LJPEG:
698
      caps = gst_ff_vid_caps_new (context, codec_id, "image/jpeg", NULL);
Wim Taymans's avatar
Wim Taymans committed
699
      break;
700

701
    case CODEC_ID_SP5X:
702
      caps = gst_ff_vid_caps_new (context, codec_id, "video/sp5x", NULL);
703 704
      break;

705
    case CODEC_ID_MJPEGB:
706
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-mjpeg-b", NULL);
707 708
      break;

709
    case CODEC_ID_MPEG4:
710
      if (encode && context != NULL) {
711 712
        /* I'm not exactly sure what ffmpeg outputs... ffmpeg itself uses
         * the AVI fourcc 'DIVX', but 'mp4v' for Quicktime... */
713
        switch (context->codec_tag) {
714
          case GST_MAKE_FOURCC ('D', 'I', 'V', 'X'):
715
            caps = gst_ff_vid_caps_new (context, codec_id, "video/x-divx",
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
716
                "divxversion", G_TYPE_INT, 5, NULL);
717 718 719 720
            break;
          case GST_MAKE_FOURCC ('m', 'p', '4', 'v'):
          default:
            /* FIXME: bitrate */
721
            caps = gst_ff_vid_caps_new (context, codec_id, "video/mpeg",
722 723 724 725
                "systemstream", G_TYPE_BOOLEAN, FALSE,
                "mpegversion", G_TYPE_INT, 4, NULL);
            break;
        }
726 727
      } else {
        /* The trick here is to separate xvid, divx, mpeg4, 3ivx et al */
728
        caps = gst_ff_vid_caps_new (context, codec_id, "video/mpeg",
Thomas Vander Stichele's avatar
indent  
Thomas Vander Stichele committed
729 730
            "mpegversion", G_TYPE_INT, 4,
            "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
731
        if (encode) {
732 733
          gst_caps_append (caps, gst_ff_vid_caps_new (context, codec_id,
                  "video/x-divx", "divxversion", G_TYPE_INT, 5, NULL));
734
        } else {
735 736 737 738 739 740 741
          gst_caps_append (caps, gst_ff_vid_caps_new (context, codec_id,
                  "video/x-divx", "divxversion", GST_TYPE_INT_RANGE, 4, 5,
                  NULL));
          gst_caps_append (caps, gst_ff_vid_caps_new (context, codec_id,
                  "video/x-xvid", NULL));
          gst_caps_append (caps, gst_ff_vid_caps_new (context, codec_id,
                  "video/x-3ivx", NULL));
742
        }
743
      }
744
      break;
745

746
    case CODEC_ID_RAWVIDEO:
747 748
      caps =
          gst_ffmpeg_codectype_to_caps (AVMEDIA_TYPE_VIDEO, context, codec_id,
749
          encode);
750
      break;
751

752
    case CODEC_ID_MSMPEG4V1:
753 754
    case CODEC_ID_MSMPEG4V2:
    case CODEC_ID_MSMPEG4V3:
755 756 757 758 759 760 761 762 763
    {
      gint version = 41 + codec_id - CODEC_ID_MSMPEG4V1;

      /* encode-FIXME: bitrate */
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-msmpeg",
          "msmpegversion", G_TYPE_INT, version, NULL);
      if (!encode && codec_id == CODEC_ID_MSMPEG4V3) {
        gst_caps_append (caps, gst_ff_vid_caps_new (context, codec_id,
                "video/x-divx", "divxversion", G_TYPE_INT, 3, NULL));
764
      }
765
    }
766
      break;
767

768
    case CODEC_ID_WMV1:
769
    case CODEC_ID_WMV2:
770 771
    {
      gint version = (codec_id == CODEC_ID_WMV1) ? 1 : 2;
772

773 774 775
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-wmv",
          "wmvversion", G_TYPE_INT, version, NULL);
    }
776
      break;
777

778
    case CODEC_ID_FLV1:
779 780
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-flash-video",
          "flvversion", G_TYPE_INT, 1, NULL);
781
      break;
782

783
    case CODEC_ID_SVQ1:
784
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-svq",
Thomas Vander Stichele's avatar
indent  
Thomas Vander Stichele committed
785
          "svqversion", G_TYPE_INT, 1, NULL);
786
      break;
787 788

    case CODEC_ID_SVQ3:
789
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-svq",
790
          "svqversion", G_TYPE_INT, 3, NULL);
791
      break;
792

793
    case CODEC_ID_DVAUDIO:
794
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-dv", NULL);
795
      break;
796

797
    case CODEC_ID_DVVIDEO:
798 799
    {
      if (encode && context) {
Wim Taymans's avatar
Wim Taymans committed
800
        const gchar *format;
801 802

        switch (context->pix_fmt) {
803
          case PIX_FMT_YUYV422:
Wim Taymans's avatar
Wim Taymans committed
804
            format = "YUY2";
805 806
            break;
          case PIX_FMT_YUV420P:
Wim Taymans's avatar
Wim Taymans committed
807
            format = "I420";
808
            break;
809
          case PIX_FMT_YUVA420P:
Wim Taymans's avatar
Wim Taymans committed
810
            format = "A420";
811
            break;
812
          case PIX_FMT_YUV411P:
Wim Taymans's avatar
Wim Taymans committed
813
            format = "Y41B";
814 815
            break;
          case PIX_FMT_YUV422P:
Wim Taymans's avatar
Wim Taymans committed
816
            format = "Y42B";
817 818
            break;
          case PIX_FMT_YUV410P:
Wim Taymans's avatar
Wim Taymans committed
819
            format = "YUV9";
820 821 822
            break;
          default:
            GST_WARNING
Wim Taymans's avatar
Wim Taymans committed
823
                ("Couldnt' find format for pixfmt %d, defaulting to I420",
824
                context->pix_fmt);
Wim Taymans's avatar
Wim Taymans committed
825
            format = "I420";
826 827 828 829
            break;
        }
        caps = gst_ff_vid_caps_new (context, codec_id, "video/x-dv",
            "systemstream", G_TYPE_BOOLEAN, FALSE,
Wim Taymans's avatar
Wim Taymans committed
830
            "format", G_TYPE_STRING, format, NULL);
831 832 833
      } else {
        caps = gst_ff_vid_caps_new (context, codec_id, "video/x-dv",
            "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
834
      }
835
    }
836
      break;
837

838 839
    case CODEC_ID_WMAV1:
    case CODEC_ID_WMAV2:
840 841
    {
      gint version = (codec_id == CODEC_ID_WMAV1) ? 1 : 2;
842

843 844 845 846 847 848 849 850 851 852
      if (context) {
        caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-wma",
            "wmaversion", G_TYPE_INT, version,
            "block_align", G_TYPE_INT, context->block_align,
            "bitrate", G_TYPE_INT, context->bit_rate, NULL);
      } else {
        caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-wma",
            "wmaversion", G_TYPE_INT, version,
            "block_align", GST_TYPE_INT_RANGE, 0, G_MAXINT,
            "bitrate", GST_TYPE_INT_RANGE, 0, G_MAXINT, NULL);
853
      }
854
    }
855
      break;
856 857 858 859 860 861
    case CODEC_ID_WMAPRO:
    {
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-wma",
          "wmaversion", G_TYPE_INT, 3, NULL);
      break;
    }
862

863 864 865 866 867 868
    case CODEC_ID_WMAVOICE:
    {
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-wms", NULL);
      break;
    }

869 870
    case CODEC_ID_MACE3:
    case CODEC_ID_MACE6:
871 872
    {
      gint version = (codec_id == CODEC_ID_MACE3) ? 3 : 6;
873

874 875 876
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-mace",
          "maceversion", G_TYPE_INT, version, NULL);
    }
877
      break;
878

Wim Taymans's avatar
Wim Taymans committed
879
    case CODEC_ID_HUFFYUV:
880
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-huffyuv", NULL);
881 882
      if (context) {
        gst_caps_set_simple (caps,
883
            "bpp", G_TYPE_INT, context->bits_per_coded_sample, NULL);
884
      }
885 886 887
      break;

    case CODEC_ID_CYUV:
888 889 890
      caps =
          gst_ff_vid_caps_new (context, codec_id, "video/x-compressed-yuv",
          NULL);
891 892 893
      break;

    case CODEC_ID_H264:
894
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-h264", NULL);
895 896
      break;

897 898 899 900 901
    case CODEC_ID_INDEO5:
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-indeo",
          "indeoversion", G_TYPE_INT, 5, NULL);
      break;

902 903 904 905 906
    case CODEC_ID_INDEO4:
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-indeo",
          "indeoversion", G_TYPE_INT, 4, NULL);
      break;

907
    case CODEC_ID_INDEO3:
908
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-indeo",
Thomas Vander Stichele's avatar
indent  
Thomas Vander Stichele committed
909
          "indeoversion", G_TYPE_INT, 3, NULL);
910 911
      break;

912
    case CODEC_ID_INDEO2:
913
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-indeo",
914 915 916
          "indeoversion", G_TYPE_INT, 2, NULL);
      break;

917
    case CODEC_ID_FLASHSV:
918 919
      caps =
          gst_ff_vid_caps_new (context, codec_id, "video/x-flash-screen", NULL);
920 921
      break;

922
    case CODEC_ID_VP3:
923
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-vp3", NULL);
924 925
      break;

926
    case CODEC_ID_VP5:
927
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-vp5", NULL);
928 929 930
      break;

    case CODEC_ID_VP6:
931
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-vp6", NULL);
932 933 934
      break;

    case CODEC_ID_VP6F:
935
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-vp6-flash", NULL);
936 937
      break;

938 939 940 941
    case CODEC_ID_VP6A:
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-vp6-alpha", NULL);
      break;

942 943 944 945
    case CODEC_ID_VP8:
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-vp8", NULL);
      break;

946
    case CODEC_ID_THEORA:
947
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-theora", NULL);
948 949
      break;

950
    case CODEC_ID_AAC:
951
    {
952
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/mpeg", NULL);
953 954 955 956 957

      if (!encode) {
        GValue arr = { 0, };
        GValue item = { 0, };

958 959 960 961 962 963 964 965 966 967 968
        g_value_init (&arr, GST_TYPE_LIST);
        g_value_init (&item, G_TYPE_INT);
        g_value_set_int (&item, 2);
        gst_value_list_append_value (&arr, &item);
        g_value_set_int (&item, 4);
        gst_value_list_append_value (&arr, &item);
        g_value_unset (&item);

        gst_caps_set_value (caps, "mpegversion", &arr);
        g_value_unset (&arr);

969 970 971 972 973 974 975 976 977 978 979 980 981
        g_value_init (&arr, GST_TYPE_LIST);
        g_value_init (&item, G_TYPE_STRING);
        g_value_set_string (&item, "raw");
        gst_value_list_append_value (&arr, &item);
        g_value_set_string (&item, "adts");
        gst_value_list_append_value (&arr, &item);
        g_value_set_string (&item, "adif");
        gst_value_list_append_value (&arr, &item);
        g_value_unset (&item);

        gst_caps_set_value (caps, "stream-format", &arr);
        g_value_unset (&arr);
      } else {
982 983
        gst_caps_set_simple (caps, "mpegversion", G_TYPE_INT, 4,
            "stream-format", G_TYPE_STRING, "raw",
984 985 986 987 988
            "base-profile", G_TYPE_STRING, "lc", NULL);

        if (context && context->extradata_size > 0)
          gst_codec_utils_aac_caps_set_level_and_profile (caps,
              context->extradata, context->extradata_size);
989 990 991 992 993
      }

      break;
    }
    case CODEC_ID_AAC_LATM:    /* LATM/LOAS AAC syntax */
994
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/mpeg",
995 996
          "mpegversion", G_TYPE_INT, 4, "stream-format", G_TYPE_STRING, "loas",
          NULL);
997 998 999
      break;

    case CODEC_ID_ASV1:
1000 1001
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-asus",
          "asusversion", G_TYPE_INT, 1, NULL);
1002
      break;
1003
    case CODEC_ID_ASV2:
1004 1005
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-asus",
          "asusversion", G_TYPE_INT, 2, NULL);
1006 1007
      break;

1008
    case CODEC_ID_FFV1:
1009
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-ffv",
Thomas Vander Stichele's avatar
indent  
Thomas Vander Stichele committed
1010
          "ffvversion", G_TYPE_INT, 1, NULL);
1011 1012 1013
      break;

    case CODEC_ID_4XM:
1014
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-4xm", NULL);
1015 1016
      break;

1017 1018
    case CODEC_ID_XAN_WC3:
    case CODEC_ID_XAN_WC4:
1019
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-xan",
1020 1021 1022
          "wcversion", G_TYPE_INT, 3 - CODEC_ID_XAN_WC3 + codec_id, NULL);
      break;

1023
    case CODEC_ID_CLJR:
1024 1025 1026
      caps =
          gst_ff_vid_caps_new (context, codec_id,
          "video/x-cirrus-logic-accupak", NULL);
1027 1028 1029
      break;

    case CODEC_ID_FRAPS:
1030 1031 1032
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-fraps", NULL);
      break;

1033 1034 1035 1036 1037 1038
    case CODEC_ID_MDEC:
    case CODEC_ID_ROQ:
    case CODEC_ID_INTERPLAY_VIDEO:
      buildcaps = TRUE;
      break;

1039
    case CODEC_ID_VCR1:
1040 1041
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-ati-vcr",
          "vcrversion", G_TYPE_INT, 1, NULL);
1042 1043
      break;

1044
    case CODEC_ID_RPZA:
1045 1046
      caps =
          gst_ff_vid_caps_new (context, codec_id, "video/x-apple-video", NULL);
1047 1048
      break;