gstffmpegcodecmap.c 101 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 27 28
#ifdef HAVE_FFMPEG_UNINSTALLED
#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"

36 37 38 39 40
/*
 * Read a palette from a caps.
 */

static void
41
gst_ffmpeg_get_palette (const GstCaps * caps, AVCodecContext * context)
42 43 44 45 46 47
{
  GstStructure *str = gst_caps_get_structure (caps, 0);
  const GValue *palette_v;
  const GstBuffer *palette;

  /* do we have a palette? */
48
  if ((palette_v = gst_structure_get_value (str, "palette_data")) && context) {
49
    palette = gst_value_get_buffer (palette_v);
50
    if (GST_BUFFER_SIZE (palette) >= AVPALETTE_SIZE) {
51 52 53 54 55 56 57 58 59 60 61
      if (context->palctrl)
        av_free (context->palctrl);
      context->palctrl = av_malloc (sizeof (AVPaletteControl));
      context->palctrl->palette_changed = 1;
      memcpy (context->palctrl->palette, GST_BUFFER_DATA (palette),
          AVPALETTE_SIZE);
    }
  }
}

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

    memcpy (GST_BUFFER_DATA (palette), context->palctrl->palette,
        AVPALETTE_SIZE);
69
    gst_caps_set_simple (caps, "palette_data", GST_TYPE_BUFFER, palette, NULL);
70 71 72
  }
}

73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
/* 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}, {
  CH_LOW_FREQUENCY, GST_AUDIO_CHANNEL_POSITION_LFE}, {
  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}, {
  CH_TOP_CENTER, GST_AUDIO_CHANNEL_POSITION_NONE}, {
  CH_TOP_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_NONE}, {
  CH_TOP_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_NONE}, {
  CH_TOP_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_NONE}, {
  CH_TOP_BACK_LEFT, GST_AUDIO_CHANNEL_POSITION_NONE}, {
  CH_TOP_BACK_CENTER, GST_AUDIO_CHANNEL_POSITION_NONE}, {
  CH_TOP_BACK_RIGHT, GST_AUDIO_CHANNEL_POSITION_NONE}, {
  CH_STEREO_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT}, {
  CH_STEREO_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}
};

static GstAudioChannelPosition *
gst_ff_channel_layout_to_gst (guint64 channel_layout, guint channels)
{
  guint nchannels = 0, i, j;
  GstAudioChannelPosition *pos = NULL;
  gboolean none_layout = FALSE;

  for (i = 0; i < 64; i++) {
    if ((channel_layout & (G_GUINT64_CONSTANT (1) << i)) != 0) {
      nchannels++;
    }
  }

  if (channel_layout == 0) {
    nchannels = channels;
    none_layout = TRUE;
  }

  if (nchannels != channels) {
    GST_ERROR ("Number of channels is different (%u != %u)", channels,
        nchannels);
    return NULL;
  }

  pos = g_new (GstAudioChannelPosition, nchannels);

  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;

      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");
    none_layout = TRUE;
  }

142 143 144
  if (!none_layout && !gst_audio_check_channel_positions (pos, nchannels)) {
    GST_ERROR ("Invalid channel layout %" G_GUINT64_FORMAT
        " - assuming NONE layout", channel_layout);
145 146 147 148 149 150 151 152 153
    none_layout = TRUE;
  }

  if (none_layout) {
    if (nchannels == 1) {
      pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_MONO;
    } else if (nchannels == 2) {
      pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
      pos[1] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
154 155 156
    } else if (channel_layout == 0) {
      g_free (pos);
      pos = NULL;
157 158 159 160 161 162 163 164 165 166 167 168
    } else {
      for (i = 0; i < nchannels; i++)
        pos[i] = GST_AUDIO_CHANNEL_POSITION_NONE;
    }
  }

  if (nchannels == 1 && pos[0] == GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER)
    pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_MONO;

  return pos;
}

169 170 171 172
/* 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.
173 174 175
 *
 * We should actually do this stuff at the end, like in riff-media.c,
 * but I'm too lazy today. Maybe later.
176
 */
177
static GstCaps *
178 179
gst_ff_vid_caps_new (AVCodecContext * context, enum CodecID codec_id,
    const char *mimetype, const char *fieldname, ...)
180 181 182 183
{
  GstStructure *structure = NULL;
  GstCaps *caps = NULL;
  va_list var_args;
184
  gint i;
185

186 187
  /* fixed, non probing context */
  if (context != NULL && context->width != -1) {
188 189 190 191
    caps = gst_caps_new_simple (mimetype,
        "width", G_TYPE_INT, context->width,
        "height", G_TYPE_INT, context->height,
        "framerate", GST_TYPE_FRACTION,
192
        context->time_base.den, context->time_base.num, NULL);
193 194
  } else if (context) {
    /* so we are after restricted caps in this case */
195
    switch (codec_id) {
196 197 198 199 200 201 202 203 204 205 206 207
      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;
      }
208 209 210 211 212 213 214 215 216
      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);
217

218 219 220 221 222 223
        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);
224

225 226 227 228
          gst_caps_append (caps, temp);
        }
        break;
      }
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
      case CODEC_ID_DVVIDEO:
      {
        const static gint widths[] = { 720, 720 };
        const static gint heights[] = { 576, 480 };
        GstCaps *temp;
        gint n_sizes = G_N_ELEMENTS (widths);

        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);

          gst_caps_append (caps, temp);
244
        }
245 246
        break;
      }
247 248
      case CODEC_ID_DNXHD:
      {
249
        caps = gst_caps_new_simple (mimetype,
250 251
            "width", G_TYPE_INT, 1920,
            "height", G_TYPE_INT, 1080,
252
            "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
253 254 255 256 257 258 259
        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:
260 261 262 263
        break;
    }
  }

264 265 266 267 268 269 270 271
  /* no fixed caps or special restrictions applied;
   * default unfixed setting */
  if (!caps)
    caps = gst_caps_new_simple (mimetype,
        "width", GST_TYPE_INT_RANGE, 16, 4096,
        "height", GST_TYPE_INT_RANGE, 16, 4096,
        "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);

272
  for (i = 0; i < gst_caps_get_size (caps); i++) {
273
    va_start (var_args, fieldname);
274
    structure = gst_caps_get_structure (caps, i);
275 276 277 278 279 280
    gst_structure_set_valist (structure, fieldname, var_args);
    va_end (var_args);
  }

  return caps;
}
281 282 283 284

/* same for audio - now with channels/sample rate
 */

285
static GstCaps *
286 287
gst_ff_aud_caps_new (AVCodecContext * context, enum CodecID codec_id,
    const char *mimetype, const char *fieldname, ...)
288 289 290
{
  GstCaps *caps = NULL;
  GstStructure *structure = NULL;
291
  gint i;
292 293
  va_list var_args;

294 295
  /* fixed, non-probing context */
  if (context != NULL && context->channels != -1) {
296 297
    GstAudioChannelPosition *pos;

298 299
    caps = gst_caps_new_simple (mimetype,
        "rate", G_TYPE_INT, context->sample_rate,
300
        "channels", G_TYPE_INT, context->channels, NULL);
301 302 303 304 305 306 307 308

    pos =
        gst_ff_channel_layout_to_gst (context->channel_layout,
        context->channels);
    if (pos != NULL) {
      gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos);
      g_free (pos);
    }
309
  } else {
310 311 312
    gint maxchannels = 2;
    const gint *rates = NULL;
    gint n_rates = 0;
313

314
    if (context) {
315 316 317 318 319 320 321 322 323 324
      /* so we must be after restricted caps in this particular case */
      switch (codec_id) {
        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;
        }
325
        case CODEC_ID_EAC3:
326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349
        case CODEC_ID_AC3:
        {
          const static gint l_rates[] = { 48000, 44100, 32000 };
          n_rates = G_N_ELEMENTS (l_rates);
          rates = l_rates;
          break;
        }
        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_ADPCM_G726:
          maxchannels = 1;
          break;
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
        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;
        }
366 367 368
        default:
          break;
      }
369 370 371 372 373

      /* TODO: handle context->channel_layouts here to set
       * the list of channel layouts supported by the encoder.
       * Unfortunately no encoder uses this yet....
       */
374 375 376 377 378 379 380
    }

    /* 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) {
      case CODEC_ID_AC3:
381
      case CODEC_ID_EAC3:
382 383 384 385 386 387 388
      case CODEC_ID_AAC:
      case CODEC_ID_DTS:
        maxchannels = 6;
        break;
      default:
        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
    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
      gst_caps_set_simple (caps, "rate", GST_TYPE_INT_RANGE, 8000, 96000, NULL);
414 415
  }

416
  for (i = 0; i < gst_caps_get_size (caps); i++) {
417
    va_start (var_args, fieldname);
418
    structure = gst_caps_get_structure (caps, i);
419 420 421 422 423 424
    gst_structure_set_valist (structure, fieldname, var_args);
    va_end (var_args);
  }

  return caps;
}
425 426 427 428 429 430

/* 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!
431 432 433 434 435 436 437 438 439
 *
 * 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.
440 441
 */

442
GstCaps *
Thomas Vander Stichele's avatar
indent  
Thomas Vander Stichele committed
443 444
gst_ffmpeg_codecid_to_caps (enum CodecID codec_id,
    AVCodecContext * context, gboolean encode)
445
{
446
  GstCaps *caps = NULL;
447
  gboolean buildcaps = FALSE;
448

449
  switch (codec_id) {
450
    case CODEC_ID_MPEG1VIDEO:
451 452 453 454
      /* FIXME: bitrate */
      caps = gst_ff_vid_caps_new (context, codec_id, "video/mpeg",
          "mpegversion", G_TYPE_INT, 1,
          "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
455 456 457 458 459
      break;

    case CODEC_ID_MPEG2VIDEO:
      if (encode) {
        /* FIXME: bitrate */
460
        caps = gst_ff_vid_caps_new (context, codec_id, "video/mpeg",
Thomas Vander Stichele's avatar
indent  
Thomas Vander Stichele committed
461 462
            "mpegversion", G_TYPE_INT, 2,
            "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
463 464 465 466
      } 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
467 468
            "mpegversion", GST_TYPE_INT_RANGE, 1, 2,
            "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
469
      }
470
      break;
471 472 473 474 475 476

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

    case CODEC_ID_H263:
477
      if (encode) {
478
        caps = gst_ff_vid_caps_new (context, codec_id, "video/x-h263",
479 480 481
            "variant", G_TYPE_STRING, "itu",
            "h263version", G_TYPE_STRING, "h263", NULL);
      } else {
482 483 484 485
        /* 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",
486 487
            "variant", G_TYPE_STRING, "itu", NULL);
      }
488 489 490
      break;

    case CODEC_ID_H263P:
491
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-h263",
492 493
          "variant", G_TYPE_STRING, "itu",
          "h263version", G_TYPE_STRING, "h263p", NULL);
494
      break;
495

496
    case CODEC_ID_H263I:
497
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-intel-h263",
498
          "variant", G_TYPE_STRING, "intel", NULL);
499 500
      break;

501
    case CODEC_ID_H261:
502
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-h261", NULL);
503 504
      break;

505
    case CODEC_ID_RV10:
506
    case CODEC_ID_RV20:
507
    case CODEC_ID_RV30:
508
    case CODEC_ID_RV40:
509 510
    {
      gint version;
511

512 513 514 515
      switch (codec_id) {
        case CODEC_ID_RV40:
          version = 4;
          break;
516 517 518
        case CODEC_ID_RV30:
          version = 3;
          break;
519 520 521 522 523 524 525
        case CODEC_ID_RV20:
          version = 2;
          break;
        default:
          version = 1;
          break;
      }
526

527 528 529 530 531
      /* 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) {
532
        gst_caps_set_simple (caps, "format", G_TYPE_INT, context->sub_id, NULL);
533 534
        if (context->extradata_size >= 8) {
          gst_caps_set_simple (caps,
535 536 537
              "subformat", G_TYPE_INT, GST_READ_UINT32_BE (context->extradata),
              NULL);
        }
538
      }
539
    }
540
      break;
541

542
    case CODEC_ID_MP2:
543 544 545
      /* FIXME: bitrate */
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/mpeg",
          "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 2, NULL);
546
      break;
547

548 549 550
    case CODEC_ID_MP3:
      if (encode) {
        /* FIXME: bitrate */
551
        caps = gst_ff_aud_caps_new (context, codec_id, "audio/mpeg",
Thomas Vander Stichele's avatar
indent  
Thomas Vander Stichele committed
552
            "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, NULL);
553 554 555 556
      } 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
557 558
            "mpegversion", G_TYPE_INT, 1,
            "layer", GST_TYPE_INT_RANGE, 1, 3, NULL);
559
      }
560
      break;
561

562 563 564 565 566 567 568
    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;

569 570 571 572 573 574 575
    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;

576 577 578
    case CODEC_ID_AC3:
      /* FIXME: bitrate */
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-ac3", NULL);
579
      break;
580

581 582 583 584 585
    case CODEC_ID_EAC3:
      /* FIXME: bitrate */
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-eac3", NULL);
      break;

586 587
    case CODEC_ID_ATRAC3:
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/atrac3", NULL);
588
      break;
589

590
    case CODEC_ID_DTS:
591
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-dts", NULL);
592
      break;
593

594 595 596 597 598 599
    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,
600
            "depth", G_TYPE_INT, context->bits_per_coded_sample, NULL);
601 602 603
      }
      break;

604 605 606 607 608 609 610 611
  case CODEC_ID_MLP:
    caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-mlp", NULL);
    break;

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

Thomas Vander Stichele's avatar
indent  
Thomas Vander Stichele committed
612 613 614 615 616
      /* 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...)? */
617
    case CODEC_ID_MJPEG:
618
    case CODEC_ID_LJPEG:
619
      caps = gst_ff_vid_caps_new (context, codec_id, "image/jpeg", NULL);
Wim Taymans's avatar
Wim Taymans committed
620
      break;
621

622
    case CODEC_ID_SP5X:
623
      caps = gst_ff_vid_caps_new (context, codec_id, "video/sp5x", NULL);
624 625
      break;

626
    case CODEC_ID_MJPEGB:
627
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-mjpeg-b", NULL);
628 629
      break;

630
    case CODEC_ID_MPEG4:
631
      if (encode && context != NULL) {
632 633
        /* I'm not exactly sure what ffmpeg outputs... ffmpeg itself uses
         * the AVI fourcc 'DIVX', but 'mp4v' for Quicktime... */
634
        switch (context->codec_tag) {
635
          case GST_MAKE_FOURCC ('D', 'I', 'V', 'X'):
636
            caps = gst_ff_vid_caps_new (context, codec_id, "video/x-divx",
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
637
                "divxversion", G_TYPE_INT, 5, NULL);
638 639 640 641
            break;
          case GST_MAKE_FOURCC ('m', 'p', '4', 'v'):
          default:
            /* FIXME: bitrate */
642
            caps = gst_ff_vid_caps_new (context, codec_id, "video/mpeg",
643 644 645 646
                "systemstream", G_TYPE_BOOLEAN, FALSE,
                "mpegversion", G_TYPE_INT, 4, NULL);
            break;
        }
647 648
      } else {
        /* The trick here is to separate xvid, divx, mpeg4, 3ivx et al */
649
        caps = gst_ff_vid_caps_new (context, codec_id, "video/mpeg",
Thomas Vander Stichele's avatar
indent  
Thomas Vander Stichele committed
650 651
            "mpegversion", G_TYPE_INT, 4,
            "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
652
        if (encode) {
653 654
          gst_caps_append (caps, gst_ff_vid_caps_new (context, codec_id,
                  "video/x-divx", "divxversion", G_TYPE_INT, 5, NULL));
655
        } else {
656 657 658 659 660 661 662
          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));
663
        }
664
      }
665
      break;
666

667
    case CODEC_ID_RAWVIDEO:
668 669
      caps = gst_ffmpeg_codectype_to_caps (CODEC_TYPE_VIDEO, context, codec_id,
          encode);
670
      break;
671

672
    case CODEC_ID_MSMPEG4V1:
673 674
    case CODEC_ID_MSMPEG4V2:
    case CODEC_ID_MSMPEG4V3:
675 676 677 678 679 680 681 682 683
    {
      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));
684
      }
685
    }
686
      break;
687

688
    case CODEC_ID_WMV1:
689
    case CODEC_ID_WMV2:
690 691
    {
      gint version = (codec_id == CODEC_ID_WMV1) ? 1 : 2;
692

693 694 695
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-wmv",
          "wmvversion", G_TYPE_INT, version, NULL);
    }
696
      break;
697

698
    case CODEC_ID_FLV1:
699 700
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-flash-video",
          "flvversion", G_TYPE_INT, 1, NULL);
701
      break;
702

703
    case CODEC_ID_SVQ1:
704
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-svq",
Thomas Vander Stichele's avatar
indent  
Thomas Vander Stichele committed
705
          "svqversion", G_TYPE_INT, 1, NULL);
706
      break;
707 708

    case CODEC_ID_SVQ3:
709
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-svq",
710
          "svqversion", G_TYPE_INT, 3, NULL);
711
      break;
712

713
    case CODEC_ID_DVAUDIO:
714
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-dv", NULL);
715
      break;
716

717
    case CODEC_ID_DVVIDEO:
718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750
    {
      if (encode && context) {
        guint32 fourcc;

        switch (context->pix_fmt) {
          case PIX_FMT_YUV422:
            fourcc = GST_MAKE_FOURCC ('Y', 'U', 'Y', '2');
            break;
          case PIX_FMT_YUV420P:
            fourcc = GST_MAKE_FOURCC ('I', '4', '2', '0');
            break;
          case PIX_FMT_YUV411P:
            fourcc = GST_MAKE_FOURCC ('Y', '4', '1', 'B');
            break;
          case PIX_FMT_YUV422P:
            fourcc = GST_MAKE_FOURCC ('Y', '4', '2', 'B');
            break;
          case PIX_FMT_YUV410P:
            fourcc = GST_MAKE_FOURCC ('Y', 'U', 'V', '9');
            break;
          default:
            GST_WARNING
                ("Couldnt' find fourcc for pixfmt %d, defaulting to I420",
                context->pix_fmt);
            fourcc = GST_MAKE_FOURCC ('I', '4', '2', '0');
            break;
        }
        caps = gst_ff_vid_caps_new (context, codec_id, "video/x-dv",
            "systemstream", G_TYPE_BOOLEAN, FALSE,
            "format", GST_TYPE_FOURCC, fourcc, NULL);
      } else {
        caps = gst_ff_vid_caps_new (context, codec_id, "video/x-dv",
            "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
751
      }
752
    }
753
      break;
754

755 756
    case CODEC_ID_WMAV1:
    case CODEC_ID_WMAV2:
757 758
    {
      gint version = (codec_id == CODEC_ID_WMAV1) ? 1 : 2;
759

760 761 762 763 764 765 766 767 768 769
      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);
770
      }
771
    }
772
      break;
773

774 775
    case CODEC_ID_MACE3:
    case CODEC_ID_MACE6:
776 777
    {
      gint version = (codec_id == CODEC_ID_MACE3) ? 3 : 6;
778

779 780 781
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-mace",
          "maceversion", G_TYPE_INT, version, NULL);
    }
782
      break;
783

Wim Taymans's avatar
Wim Taymans committed
784
    case CODEC_ID_HUFFYUV:
785
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-huffyuv", NULL);
786 787
      if (context) {
        gst_caps_set_simple (caps,
788
            "bpp", G_TYPE_INT, context->bits_per_coded_sample, NULL);
789
      }
790 791 792
      break;

    case CODEC_ID_CYUV:
793 794 795
      caps =
          gst_ff_vid_caps_new (context, codec_id, "video/x-compressed-yuv",
          NULL);
796 797 798
      break;

    case CODEC_ID_H264:
799
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-h264", NULL);
800 801 802
      break;

    case CODEC_ID_INDEO3:
803
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-indeo",
Thomas Vander Stichele's avatar
indent  
Thomas Vander Stichele committed
804
          "indeoversion", G_TYPE_INT, 3, NULL);
805 806
      break;

807
    case CODEC_ID_INDEO2:
808
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-indeo",
809 810 811
          "indeoversion", G_TYPE_INT, 2, NULL);
      break;

812
    case CODEC_ID_FLASHSV:
813 814
      caps =
          gst_ff_vid_caps_new (context, codec_id, "video/x-flash-screen", NULL);
815 816
      break;

817
    case CODEC_ID_VP3:
818
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-vp3", NULL);
819 820
      break;

821
    case CODEC_ID_VP5:
822
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-vp5", NULL);
823 824 825
      break;

    case CODEC_ID_VP6:
826
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-vp6", NULL);
827 828 829
      break;

    case CODEC_ID_VP6F:
830
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-vp6-flash", NULL);
831 832
      break;

833 834 835 836
    case CODEC_ID_VP6A:
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-vp6-alpha", NULL);
      break;

837
    case CODEC_ID_THEORA:
838
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-theora", NULL);
839 840
      break;

841
    case CODEC_ID_AAC:
842
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/mpeg",
843
          "mpegversion", G_TYPE_INT, 4, NULL);
844 845 846
      break;

    case CODEC_ID_ASV1:
847 848
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-asus",
          "asusversion", G_TYPE_INT, 1, NULL);
849
      break;
850
    case CODEC_ID_ASV2:
851 852
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-asus",
          "asusversion", G_TYPE_INT, 2, NULL);
853 854
      break;

855
    case CODEC_ID_FFV1:
856
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-ffv",
Thomas Vander Stichele's avatar
indent  
Thomas Vander Stichele committed
857
          "ffvversion", G_TYPE_INT, 1, NULL);
858 859 860
      break;

    case CODEC_ID_4XM:
861
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-4xm", NULL);
862 863
      break;

864 865
    case CODEC_ID_XAN_WC3:
    case CODEC_ID_XAN_WC4:
866
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-xan",
867 868 869
          "wcversion", G_TYPE_INT, 3 - CODEC_ID_XAN_WC3 + codec_id, NULL);
      break;

870
    case CODEC_ID_CLJR:
871 872 873
      caps =
          gst_ff_vid_caps_new (context, codec_id,
          "video/x-cirrus-logic-accupak", NULL);
874 875 876
      break;

    case CODEC_ID_FRAPS:
877 878 879 880 881 882
    case CODEC_ID_MDEC:
    case CODEC_ID_ROQ:
    case CODEC_ID_INTERPLAY_VIDEO:
      buildcaps = TRUE;
      break;

883
    case CODEC_ID_VCR1:
884 885
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-ati-vcr",
          "vcrversion", G_TYPE_INT, 1, NULL);
886 887
      break;

888
    case CODEC_ID_RPZA:
889 890
      caps =
          gst_ff_vid_caps_new (context, codec_id, "video/x-apple-video", NULL);
891 892
      break;

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

897
      /* WS_VQA belogns here (order) */
898 899

    case CODEC_ID_MSRLE:
900
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-rle",
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
901
          "layout", G_TYPE_STRING, "microsoft", NULL);
902 903
      if (context) {
        gst_caps_set_simple (caps,
904
            "depth", G_TYPE_INT, (gint) context->bits_per_coded_sample, NULL);
905 906 907 908 909
      } else {
        gst_caps_set_simple (caps, "depth", GST_TYPE_INT_RANGE, 1, 64, NULL);
      }
      break;

910
    case CODEC_ID_QTRLE:
911
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-rle",
912 913 914
          "layout", G_TYPE_STRING, "quicktime", NULL);
      if (context) {
        gst_caps_set_simple (caps,
915
            "depth", G_TYPE_INT, (gint) context->bits_per_coded_sample, NULL);
916 917 918 919 920
      } else {
        gst_caps_set_simple (caps, "depth", GST_TYPE_INT_RANGE, 1, 64, NULL);
      }
      break;

921
    case CODEC_ID_MSVIDEO1:
922
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-msvideocodec",
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
923
          "msvideoversion", G_TYPE_INT, 1, NULL);
924 925
      break;

926
    case CODEC_ID_WMV3:
927
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-wmv",
928 929
          "wmvversion", G_TYPE_INT, 3, NULL);
      break;
930 931
    case CODEC_ID_VC1:
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-wmv",
932 933
          "wmvversion", G_TYPE_INT, 3, "fourcc", GST_TYPE_FOURCC,
          GST_MAKE_FOURCC ('W', 'V', 'C', '1'), NULL);
934
      break;
935
    case CODEC_ID_QDM2:
936 937
      caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-qdm2", NULL);
      break;
938

939
    case CODEC_ID_MSZH:
940
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-mszh", NULL);
941 942 943
      break;

    case CODEC_ID_ZLIB:
944
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-zlib", NULL);
945 946 947
      break;

    case CODEC_ID_TRUEMOTION1:
948 949
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-truemotion",
          "trueversion", G_TYPE_INT, 1, NULL);
950 951
      break;
    case CODEC_ID_TRUEMOTION2:
952 953
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-truemotion",
          "trueversion", G_TYPE_INT, 2, NULL);
954 955 956
      break;

    case CODEC_ID_ULTI:
957 958
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-ultimotion",
          NULL);
959 960 961
      break;

    case CODEC_ID_TSCC:
962
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-camtasia", NULL);
963 964
      if (context) {
        gst_caps_set_simple (caps,
965
            "depth", G_TYPE_INT, (gint) context->bits_per_coded_sample, NULL);
966 967 968
      } else {
        gst_caps_set_simple (caps, "depth", GST_TYPE_INT_RANGE, 8, 32, NULL);
      }
969 970
      break;

971 972 973 974 975 976 977 978
    case CODEC_ID_KMVC:
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-kmvc", NULL);
      break;

    case CODEC_ID_NUV:
      caps = gst_ff_vid_caps_new (context, codec_id, "video/x-nuv", NULL);
      break;

979 980 981 982
    case CODEC_ID_GIF:
      caps = gst_ff_vid_caps_new (context, codec_id, "image/gif", NULL);
      break;

983
    case CODEC_ID_PNG:
984
      caps = gst_ff_vid_caps_new (context, codec_id, "image/png", NULL);
985 986
      break;

987
    case CODEC_ID_PPM:
988
      caps = gst_ff_vid_caps_new (context, codec_id, "image/ppm", NULL);
989
      break;
990