2 * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
4 * riff-media.h: RIFF-id to/from caps routines
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.
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.
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.
27 #include "riff-media.h"
29 #include <gst/audio/multichannel.h>
34 GST_DEBUG_CATEGORY_EXTERN (riff_debug);
35 #define GST_CAT_DEFAULT riff_debug
38 * gst_riff_create_video_caps:
39 * @codec_fcc: fourCC codec for this codec.
40 * @strh: pointer to the strh stream header structure.
41 * @strf: pointer to the strf stream header structure, including any
42 * data that is within the range of strf.size, but excluding any
43 * additional data withint this chunk but outside strf.size.
44 * @strf_data: a #GstBuffer containing the additional data in the strf
45 * chunk outside reach of strf.size. Ususally a palette.
46 * @strd_data: a #GstBuffer containing the data in the strd stream header
47 * chunk. Usually codec initialization data.
48 * @codec_name: if given, will be filled with a human-readable codec name.
52 gst_riff_create_video_caps (guint32 codec_fcc,
53 gst_riff_strh * strh, gst_riff_strf_vids * strf,
54 GstBuffer * strf_data, GstBuffer * strd_data, char **codec_name)
57 GstBuffer *palette = NULL;
59 GST_DEBUG ("video fourcc %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (codec_fcc));
62 case GST_MAKE_FOURCC ('D', 'I', 'B', ' '): /* uncompressed RGB */
63 case GST_MAKE_FOURCC (0x00, 0x00, 0x00, 0x00):
64 case GST_MAKE_FOURCC ('R', 'G', 'B', ' '):
65 case GST_MAKE_FOURCC ('R', 'A', 'W', ' '):
67 gint bpp = (strf && strf->bit_cnt != 0) ? strf->bit_cnt : 8;
71 caps = gst_caps_new_simple ("video/x-raw-rgb",
72 "bpp", G_TYPE_INT, 8, "depth", G_TYPE_INT, 8,
73 "endianness", G_TYPE_INT, G_BYTE_ORDER, NULL);
74 } else if (bpp == 24) {
75 caps = gst_caps_new_simple ("video/x-raw-rgb",
76 "bpp", G_TYPE_INT, 24, "depth", G_TYPE_INT, 24,
77 "endianness", G_TYPE_INT, G_BIG_ENDIAN,
78 "red_mask", G_TYPE_INT, 0xff, "green_mask", G_TYPE_INT, 0xff00,
79 "blue_mask", G_TYPE_INT, 0xff0000, NULL);
80 } else if (bpp == 32) {
81 caps = gst_caps_new_simple ("video/x-raw-rgb",
82 "bpp", G_TYPE_INT, 32, "depth", G_TYPE_INT, 24,
83 "endianness", G_TYPE_INT, G_BIG_ENDIAN,
84 "red_mask", G_TYPE_INT, 0xff00, "green_mask", G_TYPE_INT,
85 0xff0000, "blue_mask", G_TYPE_INT, 0xff000000, NULL);
87 GST_WARNING ("Unhandled DIB RGB depth: %d", bpp);
93 gst_caps_from_string ("video/x-raw-rgb, bpp = (int) { 8, 24, 32 }, "
94 "depth = (int) { 8, 24}");
101 *codec_name = g_strdup_printf ("Palettized %d-bit RGB", bpp);
103 *codec_name = g_strdup_printf ("%d-bit RGB", bpp);
107 case GST_MAKE_FOURCC ('I', '4', '2', '0'):
108 caps = gst_caps_new_simple ("video/x-raw-yuv",
109 "format", GST_TYPE_FOURCC, codec_fcc, NULL);
111 *codec_name = g_strdup ("Uncompressed planar YUV 4:2:0");
114 case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'):
115 case GST_MAKE_FOURCC ('Y', 'U', 'N', 'V'):
116 caps = gst_caps_new_simple ("video/x-raw-yuv",
117 "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'),
120 *codec_name = g_strdup ("Uncompressed packed YUV 4:2:2");
123 case GST_MAKE_FOURCC ('Y', 'V', 'U', '9'):
124 caps = gst_caps_new_simple ("video/x-raw-yuv",
125 "format", GST_TYPE_FOURCC, codec_fcc, NULL);
127 *codec_name = g_strdup ("Uncompressed packed YVU 4:1:0");
130 case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'):
131 case GST_MAKE_FOURCC ('2', 'v', 'u', 'y'):
132 caps = gst_caps_new_simple ("video/x-raw-yuv",
133 "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'),
136 *codec_name = g_strdup ("Uncompressed packed YUV 4:2:2");
139 case GST_MAKE_FOURCC ('Y', 'V', '1', '2'):
140 caps = gst_caps_new_simple ("video/x-raw-yuv",
141 "format", GST_TYPE_FOURCC, codec_fcc, NULL);
143 *codec_name = g_strdup ("Uncompressed packed YVU 4:2:2");
146 case GST_MAKE_FOURCC ('M', 'J', 'P', 'G'): /* YUY2 MJPEG */
147 case GST_MAKE_FOURCC ('A', 'V', 'R', 'n'):
148 case GST_MAKE_FOURCC ('I', 'J', 'P', 'G'):
149 case GST_MAKE_FOURCC ('i', 'j', 'p', 'g'):
150 case GST_MAKE_FOURCC ('d', 'm', 'b', '1'):
151 case GST_MAKE_FOURCC ('A', 'C', 'D', 'V'):
152 case GST_MAKE_FOURCC ('Q', 'I', 'V', 'G'):
153 caps = gst_caps_new_simple ("image/jpeg", NULL);
155 *codec_name = g_strdup ("Motion JPEG");
158 case GST_MAKE_FOURCC ('J', 'P', 'E', 'G'): /* generic (mostly RGB) MJPEG */
159 case GST_MAKE_FOURCC ('j', 'p', 'e', 'g'): /* generic (mostly RGB) MJPEG */
160 caps = gst_caps_new_simple ("image/jpeg", NULL);
162 *codec_name = g_strdup ("JPEG Still Image");
165 case GST_MAKE_FOURCC ('P', 'I', 'X', 'L'): /* Miro/Pinnacle fourccs */
166 case GST_MAKE_FOURCC ('V', 'I', 'X', 'L'): /* Miro/Pinnacle fourccs */
167 caps = gst_caps_new_simple ("image/jpeg", NULL);
169 *codec_name = g_strdup ("Miro/Pinnacle Motion JPEG");
172 case GST_MAKE_FOURCC ('C', 'J', 'P', 'G'):
173 caps = gst_caps_new_simple ("image/jpeg", NULL);
175 *codec_name = g_strdup ("Creative Webcam JPEG");
178 case GST_MAKE_FOURCC ('S', 'L', 'M', 'J'):
179 caps = gst_caps_new_simple ("image/jpeg", NULL);
181 *codec_name = g_strdup ("SL Motion JPEG");
184 case GST_MAKE_FOURCC ('J', 'P', 'G', 'L'):
185 caps = gst_caps_new_simple ("image/jpeg", NULL);
187 *codec_name = g_strdup ("Pegasus Lossless JPEG");
190 case GST_MAKE_FOURCC ('L', 'O', 'C', 'O'):
191 caps = gst_caps_new_simple ("video/x-loco", NULL);
193 *codec_name = g_strdup ("LOCO Lossless");
196 case GST_MAKE_FOURCC ('S', 'P', '5', '3'):
197 case GST_MAKE_FOURCC ('S', 'P', '5', '4'):
198 case GST_MAKE_FOURCC ('S', 'P', '5', '5'):
199 case GST_MAKE_FOURCC ('S', 'P', '5', '6'):
200 case GST_MAKE_FOURCC ('S', 'P', '5', '7'):
201 case GST_MAKE_FOURCC ('S', 'P', '5', '8'):
202 caps = gst_caps_new_simple ("video/sp5x", NULL);
204 *codec_name = g_strdup ("Sp5x-like JPEG");
207 case GST_MAKE_FOURCC ('Z', 'M', 'B', 'V'):
208 caps = gst_caps_new_simple ("video/x-zmbv", NULL);
210 *codec_name = g_strdup ("Zip Motion Block video");
213 case GST_MAKE_FOURCC ('H', 'F', 'Y', 'U'):
214 caps = gst_caps_new_simple ("video/x-huffyuv", NULL);
216 gst_caps_set_simple (caps, "bpp",
217 G_TYPE_INT, (int) strf->bit_cnt, NULL);
220 *codec_name = g_strdup ("Huffman Lossless Codec");
223 case GST_MAKE_FOURCC ('M', 'P', 'E', 'G'):
224 case GST_MAKE_FOURCC ('M', 'P', 'G', 'I'):
225 case GST_MAKE_FOURCC ('m', 'p', 'g', '1'):
226 case GST_MAKE_FOURCC ('M', 'P', 'G', '1'):
227 case GST_MAKE_FOURCC ('P', 'I', 'M', '1'):
228 case GST_MAKE_FOURCC (0x01, 0x00, 0x00, 0x10):
229 caps = gst_caps_new_simple ("video/mpeg",
230 "systemstream", G_TYPE_BOOLEAN, FALSE,
231 "mpegversion", G_TYPE_INT, 1, NULL);
233 *codec_name = g_strdup ("MPEG-1 video");
236 case GST_MAKE_FOURCC ('M', 'P', 'G', '2'):
237 case GST_MAKE_FOURCC ('m', 'p', 'g', '2'):
238 case GST_MAKE_FOURCC ('P', 'I', 'M', '2'):
239 case GST_MAKE_FOURCC ('D', 'V', 'R', ' '):
240 case GST_MAKE_FOURCC (0x02, 0x00, 0x00, 0x10):
241 caps = gst_caps_new_simple ("video/mpeg",
242 "systemstream", G_TYPE_BOOLEAN, FALSE,
243 "mpegversion", G_TYPE_INT, 2, NULL);
245 *codec_name = g_strdup ("MPEG-2 video");
248 case GST_MAKE_FOURCC ('L', 'M', 'P', '2'):
249 caps = gst_caps_new_simple ("video/mpeg",
250 "systemstream", G_TYPE_BOOLEAN, FALSE,
251 "mpegversion", G_TYPE_INT, 2, NULL);
253 *codec_name = g_strdup ("Lead MPEG-2 video");
256 case GST_MAKE_FOURCC ('H', '2', '6', '3'):
257 case GST_MAKE_FOURCC ('h', '2', '6', '3'):
258 case GST_MAKE_FOURCC ('i', '2', '6', '3'):
259 case GST_MAKE_FOURCC ('U', '2', '6', '3'):
260 case GST_MAKE_FOURCC ('v', 'i', 'v', '1'):
261 case GST_MAKE_FOURCC ('T', '2', '6', '3'):
262 caps = gst_caps_new_simple ("video/x-h263",
263 "variant", G_TYPE_STRING, "itu", NULL);
265 *codec_name = g_strdup ("ITU H.26n");
268 case GST_MAKE_FOURCC ('L', '2', '6', '3'):
269 /* http://www.leadcodecs.com/Codecs/LEAD-H263.htm */
270 caps = gst_caps_new_simple ("video/x-h263",
271 "variant", G_TYPE_STRING, "lead", NULL);
273 *codec_name = g_strdup ("Lead H.263");
276 case GST_MAKE_FOURCC ('M', '2', '6', '3'):
277 case GST_MAKE_FOURCC ('m', '2', '6', '3'):
278 caps = gst_caps_new_simple ("video/x-h263",
279 "variant", G_TYPE_STRING, "microsoft", NULL);
281 *codec_name = g_strdup ("Microsoft H.263");
284 case GST_MAKE_FOURCC ('V', 'D', 'O', 'W'):
285 caps = gst_caps_new_simple ("video/x-h263",
286 "variant", G_TYPE_STRING, "vdolive", NULL);
288 *codec_name = g_strdup ("VDOLive");
291 case GST_MAKE_FOURCC ('V', 'I', 'V', 'O'):
292 caps = gst_caps_new_simple ("video/x-h263",
293 "variant", G_TYPE_STRING, "vivo", NULL);
295 *codec_name = g_strdup ("Vivo H.263");
298 case GST_MAKE_FOURCC ('x', '2', '6', '3'):
299 caps = gst_caps_new_simple ("video/x-h263",
300 "variant", G_TYPE_STRING, "xirlink", NULL);
302 *codec_name = g_strdup ("Xirlink H.263");
305 /* apparently not standard H.263...? */
306 case GST_MAKE_FOURCC ('I', '2', '6', '3'):
307 caps = gst_caps_new_simple ("video/x-intel-h263",
308 "variant", G_TYPE_STRING, "intel", NULL);
310 *codec_name = g_strdup ("Intel H.263");
313 case GST_MAKE_FOURCC ('V', 'X', '1', 'K'):
314 caps = gst_caps_new_simple ("video/x-h263",
315 "variant", G_TYPE_STRING, "lucent", NULL);
317 *codec_name = g_strdup ("Lucent VX1000S H.263");
320 case GST_MAKE_FOURCC ('X', '2', '6', '4'):
321 case GST_MAKE_FOURCC ('x', '2', '6', '4'):
322 case GST_MAKE_FOURCC ('H', '2', '6', '4'):
323 case GST_MAKE_FOURCC ('h', '2', '6', '4'):
324 case GST_MAKE_FOURCC ('a', 'v', 'c', '1'):
325 case GST_MAKE_FOURCC ('A', 'V', 'C', '1'):
326 caps = gst_caps_new_simple ("video/x-h264",
327 "variant", G_TYPE_STRING, "itu", NULL);
329 *codec_name = g_strdup ("ITU H.264");
332 case GST_MAKE_FOURCC ('V', 'S', 'S', 'H'):
333 caps = gst_caps_new_simple ("video/x-h264",
334 "variant", G_TYPE_STRING, "videosoft", NULL);
336 *codec_name = g_strdup ("VideoSoft H.264");
339 case GST_MAKE_FOURCC ('L', '2', '6', '4'):
340 /* http://www.leadcodecs.com/Codecs/LEAD-H264.htm */
341 caps = gst_caps_new_simple ("video/x-h264",
342 "variant", G_TYPE_STRING, "lead", NULL);
344 *codec_name = g_strdup ("Lead H.264");
347 case GST_MAKE_FOURCC ('S', 'E', 'D', 'G'):
348 caps = gst_caps_new_simple ("video/mpeg",
349 "mpegversion", G_TYPE_INT, 4, NULL);
351 *codec_name = g_strdup ("Samsung MPEG-4");
354 case GST_MAKE_FOURCC ('M', '4', 'C', 'C'):
355 caps = gst_caps_new_simple ("video/mpeg",
356 "mpegversion", G_TYPE_INT, 4, NULL);
358 *codec_name = g_strdup ("Divio MPEG-4");
361 case GST_MAKE_FOURCC ('D', 'I', 'V', '3'):
362 case GST_MAKE_FOURCC ('d', 'i', 'v', '3'):
363 case GST_MAKE_FOURCC ('D', 'V', 'X', '3'):
364 case GST_MAKE_FOURCC ('d', 'v', 'x', '3'):
365 case GST_MAKE_FOURCC ('D', 'I', 'V', '4'):
366 case GST_MAKE_FOURCC ('d', 'i', 'v', '4'):
367 case GST_MAKE_FOURCC ('D', 'I', 'V', '5'):
368 case GST_MAKE_FOURCC ('d', 'i', 'v', '5'):
369 case GST_MAKE_FOURCC ('D', 'I', 'V', '6'):
370 case GST_MAKE_FOURCC ('d', 'i', 'v', '6'):
371 case GST_MAKE_FOURCC ('M', 'P', 'G', '3'):
372 case GST_MAKE_FOURCC ('m', 'p', 'g', '3'):
373 case GST_MAKE_FOURCC ('c', 'o', 'l', '0'):
374 case GST_MAKE_FOURCC ('C', 'O', 'L', '0'):
375 case GST_MAKE_FOURCC ('c', 'o', 'l', '1'):
376 case GST_MAKE_FOURCC ('C', 'O', 'L', '1'):
377 case GST_MAKE_FOURCC ('A', 'P', '4', '1'):
378 caps = gst_caps_new_simple ("video/x-divx",
379 "divxversion", G_TYPE_INT, 3, NULL);
381 *codec_name = g_strdup ("DivX MS-MPEG-4 Version 3");
384 case GST_MAKE_FOURCC ('d', 'i', 'v', 'x'):
385 case GST_MAKE_FOURCC ('D', 'I', 'V', 'X'):
386 caps = gst_caps_new_simple ("video/x-divx",
387 "divxversion", G_TYPE_INT, 4, NULL);
389 *codec_name = g_strdup ("DivX MPEG-4 Version 4");
392 case GST_MAKE_FOURCC ('B', 'L', 'Z', '0'):
393 caps = gst_caps_new_simple ("video/x-divx",
394 "divxversion", G_TYPE_INT, 4, NULL);
396 *codec_name = g_strdup ("Blizzard DivX");
399 case GST_MAKE_FOURCC ('D', 'X', '5', '0'):
400 caps = gst_caps_new_simple ("video/x-divx",
401 "divxversion", G_TYPE_INT, 5, NULL);
403 *codec_name = g_strdup ("DivX MPEG-4 Version 5");
406 case GST_MAKE_FOURCC ('X', 'V', 'I', 'D'):
407 case GST_MAKE_FOURCC ('x', 'v', 'i', 'd'):
408 caps = gst_caps_new_simple ("video/x-xvid", NULL);
410 *codec_name = g_strdup ("XVID MPEG-4");
413 case GST_MAKE_FOURCC ('R', 'M', 'P', '4'):
414 caps = gst_caps_new_simple ("video/x-xvid", NULL);
416 *codec_name = g_strdup ("Sigma-Designs MPEG-4");
419 case GST_MAKE_FOURCC ('M', 'P', 'G', '4'):
420 case GST_MAKE_FOURCC ('M', 'P', '4', '1'):
421 case GST_MAKE_FOURCC ('m', 'p', '4', '1'):
422 caps = gst_caps_new_simple ("video/x-msmpeg",
423 "msmpegversion", G_TYPE_INT, 41, NULL);
425 *codec_name = g_strdup ("Microsoft MPEG-4 4.1");
428 case GST_MAKE_FOURCC ('m', 'p', '4', '2'):
429 case GST_MAKE_FOURCC ('M', 'P', '4', '2'):
430 caps = gst_caps_new_simple ("video/x-msmpeg",
431 "msmpegversion", G_TYPE_INT, 42, NULL);
433 *codec_name = g_strdup ("Microsoft MPEG-4 4.2");
436 case GST_MAKE_FOURCC ('m', 'p', '4', '3'):
437 case GST_MAKE_FOURCC ('M', 'P', '4', '3'):
438 caps = gst_caps_new_simple ("video/x-msmpeg",
439 "msmpegversion", G_TYPE_INT, 43, NULL);
441 *codec_name = g_strdup ("Microsoft MPEG-4 4.3");
444 case GST_MAKE_FOURCC ('M', 'P', '4', 'S'):
445 case GST_MAKE_FOURCC ('M', '4', 'S', '2'):
446 caps = gst_caps_new_simple ("video/mpeg",
447 "mpegversion", G_TYPE_INT, 4, NULL);
449 *codec_name = g_strdup ("Microsoft ISO MPEG-4 1.1");
452 case GST_MAKE_FOURCC ('F', 'M', 'P', '4'):
453 case GST_MAKE_FOURCC ('U', 'M', 'P', '4'):
454 case GST_MAKE_FOURCC ('F', 'F', 'D', 'S'):
455 caps = gst_caps_new_simple ("video/mpeg",
456 "mpegversion", G_TYPE_INT, 4, NULL);
458 *codec_name = g_strdup ("FFmpeg MPEG-4");
461 case GST_MAKE_FOURCC ('E', 'M', '4', 'A'):
462 case GST_MAKE_FOURCC ('E', 'P', 'V', 'H'):
463 case GST_MAKE_FOURCC ('F', 'V', 'F', 'W'):
464 case GST_MAKE_FOURCC ('I', 'N', 'M', 'C'):
465 case GST_MAKE_FOURCC ('D', 'I', 'G', 'I'):
466 case GST_MAKE_FOURCC ('D', 'M', '2', 'K'):
467 case GST_MAKE_FOURCC ('D', 'C', 'O', 'D'):
468 case GST_MAKE_FOURCC ('M', 'V', 'X', 'M'):
469 case GST_MAKE_FOURCC ('P', 'M', '4', 'V'):
470 case GST_MAKE_FOURCC ('S', 'M', 'P', '4'):
471 case GST_MAKE_FOURCC ('D', 'X', 'G', 'M'):
472 case GST_MAKE_FOURCC ('V', 'I', 'D', 'M'):
473 case GST_MAKE_FOURCC ('M', '4', 'T', '3'):
474 case GST_MAKE_FOURCC ('G', 'E', 'O', 'X'):
475 case GST_MAKE_FOURCC ('M', 'P', '4', 'V'):
476 case GST_MAKE_FOURCC ('m', 'p', '4', 'v'):
477 caps = gst_caps_new_simple ("video/mpeg",
478 "mpegversion", G_TYPE_INT, 4, NULL);
480 *codec_name = g_strdup ("MPEG-4");
483 case GST_MAKE_FOURCC ('3', 'i', 'v', 'd'):
484 case GST_MAKE_FOURCC ('3', 'I', 'V', 'D'):
485 caps = gst_caps_new_simple ("video/x-msmpeg",
486 "msmpegversion", G_TYPE_INT, 43, NULL);
488 *codec_name = g_strdup ("Microsoft MPEG-4 4.3"); /* FIXME? */
491 case GST_MAKE_FOURCC ('3', 'I', 'V', '1'):
492 case GST_MAKE_FOURCC ('3', 'I', 'V', '2'):
493 caps = gst_caps_new_simple ("video/x-3ivx", NULL);
495 *codec_name = g_strdup ("3ivx");
498 case GST_MAKE_FOURCC ('D', 'V', 'S', 'D'):
499 case GST_MAKE_FOURCC ('d', 'v', 's', 'd'):
500 case GST_MAKE_FOURCC ('d', 'v', 'c', ' '):
501 case GST_MAKE_FOURCC ('d', 'v', '2', '5'):
502 caps = gst_caps_new_simple ("video/x-dv",
503 "systemstream", G_TYPE_BOOLEAN, FALSE,
504 "dvversion", G_TYPE_INT, 25, NULL);
506 *codec_name = g_strdup ("Generic DV");
509 case GST_MAKE_FOURCC ('C', 'D', 'V', 'C'):
510 case GST_MAKE_FOURCC ('c', 'd', 'v', 'c'):
511 caps = gst_caps_new_simple ("video/x-dv",
512 "systemstream", G_TYPE_BOOLEAN, FALSE,
513 "dvversion", G_TYPE_INT, 25, NULL);
515 *codec_name = g_strdup ("Canopus DV");
518 case GST_MAKE_FOURCC ('D', 'V', '5', '0'):
519 case GST_MAKE_FOURCC ('d', 'v', '5', '0'):
520 caps = gst_caps_new_simple ("video/x-dv",
521 "systemstream", G_TYPE_BOOLEAN, FALSE,
522 "dvversion", G_TYPE_INT, 50, NULL);
524 *codec_name = g_strdup ("DVCPro50 Video");
527 case GST_MAKE_FOURCC ('W', 'M', 'V', '1'):
528 caps = gst_caps_new_simple ("video/x-wmv",
529 "wmvversion", G_TYPE_INT, 1, NULL);
531 *codec_name = g_strdup ("Microsoft Windows Media 7");
534 case GST_MAKE_FOURCC ('W', 'M', 'V', '2'):
535 caps = gst_caps_new_simple ("video/x-wmv",
536 "wmvversion", G_TYPE_INT, 2, NULL);
538 *codec_name = g_strdup ("Microsoft Windows Media 8");
541 case GST_MAKE_FOURCC ('W', 'M', 'V', '3'):
542 caps = gst_caps_new_simple ("video/x-wmv",
543 "wmvversion", G_TYPE_INT, 3, NULL);
545 *codec_name = g_strdup ("Microsoft Windows Media 9");
548 case GST_MAKE_FOURCC ('W', 'M', 'V', 'A'):
549 caps = gst_caps_new_simple ("video/x-wmv",
550 "wmvversion", G_TYPE_INT, 3, "format", GST_TYPE_FOURCC,
553 *codec_name = g_strdup ("Microsoft Windows Media Advanced Profile");
556 case GST_MAKE_FOURCC ('W', 'V', 'C', '1'):
557 caps = gst_caps_new_simple ("video/x-wmv",
558 "wmvversion", G_TYPE_INT, 3, "format", GST_TYPE_FOURCC,
561 *codec_name = g_strdup ("Microsoft Windows Media VC-1");
564 case GST_MAKE_FOURCC ('c', 'v', 'i', 'd'):
565 caps = gst_caps_new_simple ("video/x-cinepak", NULL);
567 *codec_name = g_strdup ("Cinepak video");
570 case GST_MAKE_FOURCC ('M', 'S', 'V', 'C'):
571 case GST_MAKE_FOURCC ('m', 's', 'v', 'c'):
572 case GST_MAKE_FOURCC ('C', 'R', 'A', 'M'):
573 case GST_MAKE_FOURCC ('c', 'r', 'a', 'm'):
574 case GST_MAKE_FOURCC ('W', 'H', 'A', 'M'):
575 case GST_MAKE_FOURCC ('w', 'h', 'a', 'm'):
576 caps = gst_caps_new_simple ("video/x-msvideocodec",
577 "msvideoversion", G_TYPE_INT, 1, NULL);
579 *codec_name = g_strdup ("MS video v1");
584 case GST_MAKE_FOURCC ('R', 'L', 'E', ' '):
585 case GST_MAKE_FOURCC ('m', 'r', 'l', 'e'):
586 case GST_MAKE_FOURCC (0x1, 0x0, 0x0, 0x0): /* why, why, why? */
587 case GST_MAKE_FOURCC (0x2, 0x0, 0x0, 0x0): /* why, why, why? */
588 caps = gst_caps_new_simple ("video/x-rle",
589 "layout", G_TYPE_STRING, "microsoft", NULL);
593 gst_caps_set_simple (caps,
594 "depth", G_TYPE_INT, (gint) strf->bit_cnt, NULL);
596 gst_caps_set_simple (caps, "depth", GST_TYPE_INT_RANGE, 1, 64, NULL);
599 *codec_name = g_strdup ("Microsoft RLE");
602 case GST_MAKE_FOURCC ('A', 'A', 'S', 'C'):
603 caps = gst_caps_new_simple ("video/x-aasc", NULL);
605 *codec_name = g_strdup ("Autodesk Animator");
608 case GST_MAKE_FOURCC ('X', 'x', 'a', 'n'):
609 caps = gst_caps_new_simple ("video/x-xan",
610 "wcversion", G_TYPE_INT, 4, NULL);
612 *codec_name = g_strdup ("Xan Wing Commander 4");
615 case GST_MAKE_FOURCC ('R', 'T', '2', '1'):
616 caps = gst_caps_new_simple ("video/x-indeo",
617 "indeoversion", G_TYPE_INT, 2, NULL);
619 *codec_name = g_strdup ("Intel Video 2");
622 case GST_MAKE_FOURCC ('I', 'V', '3', '1'):
623 case GST_MAKE_FOURCC ('I', 'V', '3', '2'):
624 case GST_MAKE_FOURCC ('i', 'v', '3', '1'):
625 case GST_MAKE_FOURCC ('i', 'v', '3', '2'):
626 caps = gst_caps_new_simple ("video/x-indeo",
627 "indeoversion", G_TYPE_INT, 3, NULL);
629 *codec_name = g_strdup ("Intel Video 3");
632 case GST_MAKE_FOURCC ('I', 'V', '4', '1'):
633 case GST_MAKE_FOURCC ('i', 'v', '4', '1'):
634 caps = gst_caps_new_simple ("video/x-indeo",
635 "indeoversion", G_TYPE_INT, 4, NULL);
637 *codec_name = g_strdup ("Intel Video 4");
640 case GST_MAKE_FOURCC ('I', 'V', '5', '0'):
641 caps = gst_caps_new_simple ("video/x-indeo",
642 "indeoversion", G_TYPE_INT, 5, NULL);
644 *codec_name = g_strdup ("Intel Video 5");
647 case GST_MAKE_FOURCC ('M', 'S', 'Z', 'H'):
648 caps = gst_caps_new_simple ("video/x-mszh", NULL);
650 *codec_name = g_strdup ("Lossless MSZH Video");
653 case GST_MAKE_FOURCC ('Z', 'L', 'I', 'B'):
654 caps = gst_caps_new_simple ("video/x-zlib", NULL);
656 *codec_name = g_strdup ("Lossless zlib video");
659 case GST_MAKE_FOURCC ('C', 'L', 'J', 'R'):
660 case GST_MAKE_FOURCC ('c', 'l', 'j', 'r'):
661 caps = gst_caps_new_simple ("video/x-cirrus-logic-accupak", NULL);
663 *codec_name = g_strdup ("Cirrus Logipak AccuPak");
666 case GST_MAKE_FOURCC ('C', 'Y', 'U', 'V'):
667 case GST_MAKE_FOURCC ('c', 'y', 'u', 'v'):
668 caps = gst_caps_new_simple ("video/x-compressed-yuv", NULL);
670 *codec_name = g_strdup ("CYUV Lossless");
673 case GST_MAKE_FOURCC ('D', 'U', 'C', 'K'):
674 case GST_MAKE_FOURCC ('P', 'V', 'E', 'Z'):
675 caps = gst_caps_new_simple ("video/x-truemotion",
676 "trueversion", G_TYPE_INT, 1, NULL);
678 *codec_name = g_strdup ("Duck Truemotion1");
681 case GST_MAKE_FOURCC ('T', 'M', '2', '0'):
682 caps = gst_caps_new_simple ("video/x-truemotion",
683 "trueversion", G_TYPE_INT, 2, NULL);
685 *codec_name = g_strdup ("TrueMotion 2.0");
688 case GST_MAKE_FOURCC ('V', 'P', '3', '0'):
689 case GST_MAKE_FOURCC ('v', 'p', '3', '0'):
690 case GST_MAKE_FOURCC ('V', 'P', '3', '1'):
691 case GST_MAKE_FOURCC ('v', 'p', '3', '1'):
692 case GST_MAKE_FOURCC ('V', 'P', '3', ' '):
693 caps = gst_caps_new_simple ("video/x-vp3", NULL);
695 *codec_name = g_strdup ("VP3");
698 case GST_MAKE_FOURCC ('U', 'L', 'T', 'I'):
699 caps = gst_caps_new_simple ("video/x-ultimotion", NULL);
701 *codec_name = g_strdup ("IBM UltiMotion");
704 case GST_MAKE_FOURCC ('T', 'S', 'C', 'C'):
705 case GST_MAKE_FOURCC ('t', 's', 'c', 'c'):{
707 gint depth = (strf->bit_cnt != 0) ? (gint) strf->bit_cnt : 24;
709 caps = gst_caps_new_simple ("video/x-camtasia", "depth", G_TYPE_INT,
713 caps = gst_caps_new_simple ("video/x-camtasia", NULL);
716 *codec_name = g_strdup ("TechSmith Camtasia");
720 case GST_MAKE_FOURCC ('C', 'S', 'C', 'D'):
723 gint depth = (strf->bit_cnt != 0) ? (gint) strf->bit_cnt : 24;
725 caps = gst_caps_new_simple ("video/x-camstudio", "depth", G_TYPE_INT,
729 caps = gst_caps_new_simple ("video/x-camstudio", NULL);
732 *codec_name = g_strdup ("Camstudio");
736 case GST_MAKE_FOURCC ('V', 'C', 'R', '1'):
737 caps = gst_caps_new_simple ("video/x-ati-vcr",
738 "vcrversion", G_TYPE_INT, 1, NULL);
740 *codec_name = g_strdup ("ATI VCR 1");
743 case GST_MAKE_FOURCC ('V', 'C', 'R', '2'):
744 caps = gst_caps_new_simple ("video/x-ati-vcr",
745 "vcrversion", G_TYPE_INT, 2, NULL);
747 *codec_name = g_strdup ("ATI VCR 2");
750 case GST_MAKE_FOURCC ('A', 'S', 'V', '1'):
751 caps = gst_caps_new_simple ("video/x-asus",
752 "asusversion", G_TYPE_INT, 1, NULL);
754 *codec_name = g_strdup ("Asus Video 1");
757 case GST_MAKE_FOURCC ('A', 'S', 'V', '2'):
758 caps = gst_caps_new_simple ("video/x-asus",
759 "asusversion", G_TYPE_INT, 2, NULL);
761 *codec_name = g_strdup ("Asus Video 2");
764 case GST_MAKE_FOURCC ('M', 'P', 'N', 'G'):
765 case GST_MAKE_FOURCC ('m', 'p', 'n', 'g'):
766 case GST_MAKE_FOURCC ('P', 'N', 'G', ' '):
767 caps = gst_caps_new_simple ("image/png", NULL);
769 *codec_name = g_strdup ("PNG image");
772 case GST_MAKE_FOURCC ('F', 'L', 'V', '1'):
773 caps = gst_caps_new_simple ("video/x-flash-video",
774 "flvversion", G_TYPE_INT, 1, NULL);
776 *codec_name = g_strdup ("Flash Video 1");
779 case GST_MAKE_FOURCC ('V', 'M', 'n', 'c'):
780 caps = gst_caps_new_simple ("video/x-vmnc",
781 "version", G_TYPE_INT, 1, NULL);
783 *codec_name = g_strdup ("VMWare NC Video");
786 case GST_MAKE_FOURCC ('d', 'r', 'a', 'c'):
787 caps = gst_caps_new_simple ("video/x-dirac", NULL);
789 *codec_name = g_strdup ("Dirac");
794 case GST_MAKE_FOURCC ('R', 'P', 'Z', 'A'):
795 caps = gst_caps_new_simple ("video/x-apple-video", NULL);
797 *codec_name = g_strdup ("Apple Video (RPZA)");
801 case GST_MAKE_FOURCC ('F', 'F', 'V', '1'):
802 caps = gst_caps_new_simple ("video/x-ffv",
803 "ffvversion", G_TYPE_INT, 1, NULL);
805 *codec_name = g_strdup ("FFmpeg lossless video codec");
808 case GST_MAKE_FOURCC ('K', 'M', 'V', 'C'):
809 caps = gst_caps_new_simple ("video/x-kmvc", NULL);
811 *codec_name = g_strdup ("Karl Morton's video codec");
814 case GST_MAKE_FOURCC ('v', 'p', '5', '0'):
815 case GST_MAKE_FOURCC ('V', 'P', '5', '0'):
816 caps = gst_caps_new_simple ("video/x-vp5", NULL);
818 *codec_name = g_strdup ("On2 VP5");
821 case GST_MAKE_FOURCC ('v', 'p', '6', '0'):
822 case GST_MAKE_FOURCC ('V', 'P', '6', '0'):
823 case GST_MAKE_FOURCC ('v', 'p', '6', '1'):
824 case GST_MAKE_FOURCC ('V', 'P', '6', '1'):
825 case GST_MAKE_FOURCC ('V', 'p', '6', '2'):
826 case GST_MAKE_FOURCC ('V', 'P', '6', '2'):
827 caps = gst_caps_new_simple ("video/x-vp6", NULL);
829 *codec_name = g_strdup ("On2 VP6");
832 case GST_MAKE_FOURCC ('V', 'P', '6', 'F'):
833 case GST_MAKE_FOURCC ('v', 'p', '6', 'f'):
834 case GST_MAKE_FOURCC ('F', 'L', 'V', '4'):
835 caps = gst_caps_new_simple ("video/x-vp6-flash", NULL);
837 *codec_name = g_strdup ("On2 VP6");
840 case GST_MAKE_FOURCC ('v', 'p', '7', '0'):
841 case GST_MAKE_FOURCC ('V', 'P', '7', '0'):
842 caps = gst_caps_new_simple ("video/x-vp7", NULL);
844 *codec_name = g_strdup ("On2 VP7");
847 case GST_MAKE_FOURCC ('V', 'P', '8', '0'):
848 caps = gst_caps_new_simple ("video/x-vp8", NULL);
850 *codec_name = g_strdup ("On2 VP8");
853 case GST_MAKE_FOURCC ('L', 'M', '2', '0'):
854 caps = gst_caps_new_simple ("video/x-mimic", NULL);
856 *codec_name = g_strdup ("Mimic webcam");
859 case GST_MAKE_FOURCC ('T', 'H', 'E', 'O'):
860 case GST_MAKE_FOURCC ('t', 'h', 'e', 'o'):
861 caps = gst_caps_new_simple ("video/x-theora", NULL);
863 *codec_name = g_strdup ("Theora video codec");
867 case GST_MAKE_FOURCC ('F', 'P', 'S', '1'):
868 caps = gst_caps_new_simple ("video/x-fraps", NULL);
870 *codec_name = g_strdup ("Fraps video");
875 GST_WARNING ("Unknown video fourcc %" GST_FOURCC_FORMAT,
876 GST_FOURCC_ARGS (codec_fcc));
881 gst_caps_set_simple (caps, "framerate", GST_TYPE_FRACTION,
882 strh->rate, strh->scale, NULL);
884 gst_caps_set_simple (caps,
885 "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
889 gst_caps_set_simple (caps,
890 "width", G_TYPE_INT, strf->width,
891 "height", G_TYPE_INT, strf->height, NULL);
893 gst_caps_set_simple (caps,
894 "width", GST_TYPE_INT_RANGE, 1, G_MAXINT,
895 "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
899 if (strf_data || strd_data) {
900 GstBuffer *codec_data;
902 codec_data = strf_data ? strf_data : strd_data;
904 gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, codec_data, NULL);
913 num_colors = strf->num_colors;
917 if (GST_BUFFER_SIZE (palette) >= (num_colors * 4)) {
918 /* palette is always at least 256*4 bytes */
920 gst_buffer_new_and_alloc (MAX (GST_BUFFER_SIZE (palette), 256 * 4));
921 memcpy (GST_BUFFER_DATA (copy), GST_BUFFER_DATA (palette),
922 GST_BUFFER_SIZE (palette));
924 #if (G_BYTE_ORDER == G_BIG_ENDIAN)
926 guint8 *data = GST_BUFFER_DATA (copy);
930 for (n = 0; n < num_colors; n++) {
931 GST_WRITE_UINT32_BE (data, GST_READ_UINT32_LE (data));
932 data += sizeof (guint32);
936 gst_caps_set_simple (caps, "palette_data", GST_TYPE_BUFFER, copy, NULL);
937 gst_buffer_unref (copy);
939 GST_WARNING ("Palette smaller than expected: broken file");
948 const guint32 ms_mask;
949 const GstAudioChannelPosition gst_pos;
950 } layout_mapping[] = {
952 0x00001, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT}, {
953 0x00002, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}, {
954 0x00004, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER}, {
955 0x00008, GST_AUDIO_CHANNEL_POSITION_LFE}, {
956 0x00010, GST_AUDIO_CHANNEL_POSITION_REAR_LEFT}, {
957 0x00020, GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, {
958 0x00040, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER}, {
959 0x00080, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER}, {
960 0x00100, GST_AUDIO_CHANNEL_POSITION_REAR_CENTER}, {
961 0x00200, GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT}, {
962 0x00400, GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT}, {
963 0x00800, GST_AUDIO_CHANNEL_POSITION_INVALID}, /* TOP_CENTER */
965 0x01000, GST_AUDIO_CHANNEL_POSITION_INVALID}, /* TOP_FRONT_LEFT */
967 0x02000, GST_AUDIO_CHANNEL_POSITION_INVALID}, /* TOP_FRONT_CENTER */
969 0x04000, GST_AUDIO_CHANNEL_POSITION_INVALID}, /* TOP_FRONT_RIGHT */
971 0x08000, GST_AUDIO_CHANNEL_POSITION_INVALID}, /* TOP_BACK_LEFT */
973 0x10000, GST_AUDIO_CHANNEL_POSITION_INVALID}, /* TOP_BACK_CENTER */
975 0x20000, GST_AUDIO_CHANNEL_POSITION_INVALID} /* TOP_BACK_RIGHT */
978 #define MAX_CHANNEL_POSITIONS G_N_ELEMENTS (layout_mapping)
981 gst_riff_wavext_add_channel_layout (GstCaps * caps, guint32 layout)
983 GstAudioChannelPosition pos[MAX_CHANNEL_POSITIONS];
985 gint num_channels, i, p;
987 s = gst_caps_get_structure (caps, 0);
988 if (!gst_structure_get_int (s, "channels", &num_channels))
989 g_return_val_if_reached (FALSE);
991 /* In theory this should be done for 1 and 2 channels too but
992 * apparently breaks too many things currently.
994 if (num_channels <= 2 || num_channels > MAX_CHANNEL_POSITIONS) {
995 GST_DEBUG ("invalid number of channels: %d", num_channels);
1000 for (i = 0; i < MAX_CHANNEL_POSITIONS; ++i) {
1001 if ((layout & layout_mapping[i].ms_mask) != 0) {
1002 if (p >= num_channels) {
1003 GST_WARNING ("More bits set in the channel layout map than there "
1004 "are channels! Broken file");
1007 if (layout_mapping[i].gst_pos == GST_AUDIO_CHANNEL_POSITION_INVALID) {
1008 GST_WARNING ("Unsupported channel position (mask 0x%08x) in channel "
1009 "layout map - ignoring those channels", layout_mapping[i].ms_mask);
1010 /* what to do? just ignore it and let downstream deal with a channel
1011 * layout that has INVALID positions in it for now ... */
1013 pos[p] = layout_mapping[i].gst_pos;
1018 if (p != num_channels) {
1019 GST_WARNING ("Only %d bits set in the channel layout map, but there are "
1020 "supposed to be %d channels! Broken file", p, num_channels);
1024 gst_audio_set_channel_positions (s, pos);
1029 gst_riff_wave_add_default_channel_layout (GstCaps * caps)
1031 GstAudioChannelPosition pos[8] = { GST_AUDIO_CHANNEL_POSITION_NONE, };
1035 s = gst_caps_get_structure (caps, 0);
1037 if (!gst_structure_get_int (s, "channels", &nchannels))
1038 g_return_val_if_reached (FALSE);
1040 if (nchannels > 8) {
1041 GST_DEBUG ("invalid number of channels: %d", nchannels);
1045 /* This uses the default channel mapping from ALSA which
1046 * is used in quite a few surround test files and seems to be
1047 * the defacto standard. The channel mapping from
1048 * WAVE_FORMAT_EXTENSIBLE doesn't seem to be used in normal
1049 * wav files like chan-id.wav.
1050 * http://bugzilla.gnome.org/show_bug.cgi?id=489010
1052 switch (nchannels) {
1054 pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_MONO;
1057 pos[7] = GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT;
1058 pos[6] = GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT;
1061 pos[5] = GST_AUDIO_CHANNEL_POSITION_LFE;
1064 pos[4] = GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER;
1067 pos[3] = GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT;
1068 pos[2] = GST_AUDIO_CHANNEL_POSITION_REAR_LEFT;
1071 pos[1] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
1072 pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
1078 gst_audio_set_channel_positions (s, pos);
1083 gst_riff_wavext_get_default_channel_mask (guint nchannels)
1085 guint32 channel_mask = 0;
1087 /* Set the default channel mask for the given number of channels.
1088 * http://www.microsoft.com/whdc/device/audio/multichaud.mspx
1090 switch (nchannels) {
1092 channel_mask |= 0x00400;
1093 channel_mask |= 0x00200;
1095 channel_mask |= 0x00100;
1097 channel_mask |= 0x00080;
1098 channel_mask |= 0x00040;
1100 channel_mask |= 0x00020;
1101 channel_mask |= 0x00010;
1103 channel_mask |= 0x00008;
1105 channel_mask |= 0x00004;
1107 channel_mask |= 0x00002;
1108 channel_mask |= 0x00001;
1112 return channel_mask;
1116 gst_riff_create_audio_caps (guint16 codec_id,
1117 gst_riff_strh * strh, gst_riff_strf_auds * strf,
1118 GstBuffer * strf_data, GstBuffer * strd_data, char **codec_name)
1120 gboolean block_align = FALSE, rate_chan = TRUE;
1121 GstCaps *caps = NULL;
1122 gint rate_min = 1000, rate_max = 96000;
1123 gint channels_max = 2;
1126 case GST_RIFF_WAVE_FORMAT_PCM: /* PCM */
1131 gint ba = strf->blockalign;
1132 gint ch = strf->channels;
1135 /* If we have an empty blockalign, we take the width contained in
1142 if (strf->size > 32) {
1143 GST_WARNING ("invalid depth (%d) of pcm audio, overwriting.",
1145 strf->size = 8 * ((wd + 7) / 8);
1148 /* in riff, the depth is stored in the size field but it just means that
1149 * the _least_ significant bits are cleared. We can therefore just play
1150 * the sample as if it had a depth == width */
1151 /* For reference, the actual depth is in strf->size */
1154 caps = gst_caps_new_simple ("audio/x-raw-int",
1155 "endianness", G_TYPE_INT, G_LITTLE_ENDIAN,
1156 "channels", G_TYPE_INT, ch,
1157 "width", G_TYPE_INT, wd,
1158 "depth", G_TYPE_INT, ws, "signed", G_TYPE_BOOLEAN, wd != 8, NULL);
1160 /* Add default channel layout. In theory this should be done
1161 * for 1 and 2 channels too but apparently breaks too many
1162 * things currently. Also we know no default layout for more than
1166 GST_WARNING ("don't know default layout for %d channels", ch);
1167 else if (gst_riff_wave_add_default_channel_layout (caps))
1168 GST_DEBUG ("using default channel layout for %d channels", ch);
1170 GST_WARNING ("failed to add channel layout");
1173 /* FIXME: this is pretty useless - we need fixed caps */
1174 caps = gst_caps_from_string ("audio/x-raw-int, "
1175 "endianness = (int) LITTLE_ENDIAN, "
1176 "signed = (boolean) { true, false }, "
1177 "width = (int) { 8, 16, 24, 32 }, " "depth = (int) [ 1, 32 ]");
1179 if (codec_name && strf)
1180 *codec_name = g_strdup_printf ("Uncompressed %d-bit PCM audio",
1184 case GST_RIFF_WAVE_FORMAT_ADPCM:
1185 caps = gst_caps_new_simple ("audio/x-adpcm",
1186 "layout", G_TYPE_STRING, "microsoft", NULL);
1188 *codec_name = g_strdup ("ADPCM audio");
1192 case GST_RIFF_WAVE_FORMAT_IEEE_FLOAT:
1197 gint ba = strf->blockalign;
1198 gint ch = strf->channels;
1199 gint wd = ba * 8 / ch;
1201 caps = gst_caps_new_simple ("audio/x-raw-float",
1202 "endianness", G_TYPE_INT, G_LITTLE_ENDIAN,
1203 "channels", G_TYPE_INT, ch, "width", G_TYPE_INT, wd, NULL);
1205 /* Add default channel layout. In theory this should be done
1206 * for 1 and 2 channels too but apparently breaks too many
1207 * things currently. Also we know no default layout for more than
1211 GST_WARNING ("don't know default layout for %d channels", ch);
1212 else if (gst_riff_wave_add_default_channel_layout (caps))
1213 GST_DEBUG ("using default channel layout for %d channels", ch);
1215 GST_WARNING ("failed to add channel layout");
1218 /* FIXME: this is pretty useless - we need fixed caps */
1219 caps = gst_caps_from_string ("audio/x-raw-float, "
1220 "endianness = (int) LITTLE_ENDIAN, " "width = (int) { 32, 64 }");
1222 if (codec_name && strf)
1223 *codec_name = g_strdup_printf ("Uncompressed %d-bit IEEE float audio",
1227 case GST_RIFF_WAVE_FORMAT_IBM_CVSD:
1230 case GST_RIFF_WAVE_FORMAT_ALAW:
1232 if (strf->size != 8) {
1233 GST_WARNING ("invalid depth (%d) of alaw audio, overwriting.",
1236 strf->blockalign = (strf->size * strf->channels) / 8;
1237 strf->av_bps = strf->blockalign * strf->rate;
1239 if (strf->av_bps == 0 || strf->blockalign == 0) {
1240 GST_WARNING ("fixing av_bps (%d) and blockalign (%d) of alaw audio",
1241 strf->av_bps, strf->blockalign);
1242 strf->blockalign = (strf->size * strf->channels) / 8;
1243 strf->av_bps = strf->blockalign * strf->rate;
1247 caps = gst_caps_new_simple ("audio/x-alaw", NULL);
1249 *codec_name = g_strdup ("A-law audio");
1252 case GST_RIFF_WAVE_FORMAT_WMS:
1253 caps = gst_caps_new_simple ("audio/x-wms", NULL);
1255 gst_caps_set_simple (caps,
1256 "bitrate", G_TYPE_INT, strf->av_bps * 8,
1257 "width", G_TYPE_INT, strf->size,
1258 "depth", G_TYPE_INT, strf->size, NULL);
1260 gst_caps_set_simple (caps,
1261 "bitrate", GST_TYPE_INT_RANGE, 0, G_MAXINT, NULL);
1264 *codec_name = g_strdup ("Windows Media Audio Speech");
1268 case GST_RIFF_WAVE_FORMAT_MULAW:
1270 if (strf->size != 8) {
1271 GST_WARNING ("invalid depth (%d) of mulaw audio, overwriting.",
1274 strf->blockalign = (strf->size * strf->channels) / 8;
1275 strf->av_bps = strf->blockalign * strf->rate;
1277 if (strf->av_bps == 0 || strf->blockalign == 0) {
1278 GST_WARNING ("fixing av_bps (%d) and blockalign (%d) of mulaw audio",
1279 strf->av_bps, strf->blockalign);
1280 strf->blockalign = (strf->size * strf->channels) / 8;
1281 strf->av_bps = strf->blockalign * strf->rate;
1285 caps = gst_caps_new_simple ("audio/x-mulaw", NULL);
1287 *codec_name = g_strdup ("Mu-law audio");
1290 case GST_RIFF_WAVE_FORMAT_OKI_ADPCM:
1293 case GST_RIFF_WAVE_FORMAT_DVI_ADPCM:
1295 caps = gst_caps_new_simple ("audio/x-adpcm",
1296 "layout", G_TYPE_STRING, "dvi", NULL);
1298 *codec_name = g_strdup ("DVI ADPCM audio");
1302 case GST_RIFF_WAVE_FORMAT_DSP_TRUESPEECH:
1305 caps = gst_caps_new_simple ("audio/x-truespeech", NULL);
1307 *codec_name = g_strdup ("DSP Group TrueSpeech");
1310 case GST_RIFF_WAVE_FORMAT_GSM610:
1311 case GST_RIFF_WAVE_FORMAT_MSN:
1313 caps = gst_caps_new_simple ("audio/ms-gsm", NULL);
1315 *codec_name = g_strdup ("MS GSM audio");
1318 case GST_RIFF_WAVE_FORMAT_MPEGL12: /* mp1 or mp2 */
1321 caps = gst_caps_new_simple ("audio/mpeg",
1322 "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 2, NULL);
1324 *codec_name = g_strdup ("MPEG-1 layer 2");
1327 case GST_RIFF_WAVE_FORMAT_MPEGL3: /* mp3 */
1330 caps = gst_caps_new_simple ("audio/mpeg",
1331 "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, NULL);
1333 *codec_name = g_strdup ("MPEG-1 layer 3");
1336 case GST_RIFF_WAVE_FORMAT_AMR_NB: /* amr-nb */
1340 caps = gst_caps_new_simple ("audio/AMR", NULL);
1342 *codec_name = g_strdup ("AMR Narrow Band (NB)");
1345 case GST_RIFF_WAVE_FORMAT_AMR_WB: /* amr-wb */
1349 caps = gst_caps_new_simple ("audio/AMR-WB", NULL);
1351 *codec_name = g_strdup ("AMR Wide Band (WB)");
1354 case GST_RIFF_WAVE_FORMAT_VORBIS1: /* ogg/vorbis mode 1 */
1355 case GST_RIFF_WAVE_FORMAT_VORBIS2: /* ogg/vorbis mode 2 */
1356 case GST_RIFF_WAVE_FORMAT_VORBIS3: /* ogg/vorbis mode 3 */
1357 case GST_RIFF_WAVE_FORMAT_VORBIS1PLUS: /* ogg/vorbis mode 1+ */
1358 case GST_RIFF_WAVE_FORMAT_VORBIS2PLUS: /* ogg/vorbis mode 2+ */
1359 case GST_RIFF_WAVE_FORMAT_VORBIS3PLUS: /* ogg/vorbis mode 3+ */
1361 caps = gst_caps_new_simple ("audio/x-vorbis", NULL);
1363 *codec_name = g_strdup ("Vorbis");
1366 case GST_RIFF_WAVE_FORMAT_A52:
1368 caps = gst_caps_new_simple ("audio/x-ac3", NULL);
1370 *codec_name = g_strdup ("AC-3 audio");
1372 case GST_RIFF_WAVE_FORMAT_DTS:
1374 caps = gst_caps_new_simple ("audio/x-dts", NULL);
1376 *codec_name = g_strdup ("DTS audio");
1377 /* wavparse is not always able to specify rate/channels for DTS-in-wav */
1380 case GST_RIFF_WAVE_FORMAT_AAC:
1381 case GST_RIFF_WAVE_FORMAT_AAC_AC:
1382 case GST_RIFF_WAVE_FORMAT_AAC_pm:
1383 case GST_RIFF_WAVE_FORMAT_AAC_PR:
1386 caps = gst_caps_new_simple ("audio/mpeg",
1387 "mpegversion", G_TYPE_INT, 4, NULL);
1389 *codec_name = g_strdup ("MPEG-4 AAC audio");
1392 case GST_RIFF_WAVE_FORMAT_WMAV1:
1393 case GST_RIFF_WAVE_FORMAT_WMAV2:
1394 case GST_RIFF_WAVE_FORMAT_WMAV3:
1395 case GST_RIFF_WAVE_FORMAT_WMAV3_L:
1397 gint version = (codec_id - GST_RIFF_WAVE_FORMAT_WMAV1) + 1;
1402 caps = gst_caps_new_simple ("audio/x-wma",
1403 "wmaversion", G_TYPE_INT, version, NULL);
1406 if (codec_id == GST_RIFF_WAVE_FORMAT_WMAV3_L)
1407 *codec_name = g_strdup ("WMA Lossless");
1409 *codec_name = g_strdup_printf ("WMA Version %d", version + 6);
1413 gst_caps_set_simple (caps,
1414 "bitrate", G_TYPE_INT, strf->av_bps * 8,
1415 "depth", G_TYPE_INT, strf->size, NULL);
1417 gst_caps_set_simple (caps,
1418 "bitrate", GST_TYPE_INT_RANGE, 0, G_MAXINT, NULL);
1422 case GST_RIFF_WAVE_FORMAT_SONY_ATRAC3:
1423 caps = gst_caps_new_simple ("audio/x-vnd.sony.atrac3", NULL);
1425 *codec_name = g_strdup ("Sony ATRAC3");
1428 case GST_RIFF_WAVE_FORMAT_SIREN:
1429 caps = gst_caps_new_simple ("audio/x-siren", NULL);
1431 *codec_name = g_strdup ("Siren7");
1435 case GST_RIFF_WAVE_FORMAT_ADPCM_IMA_DK4:
1440 gst_caps_new_simple ("audio/x-adpcm", "layout", G_TYPE_STRING, "dk4",
1443 *codec_name = g_strdup ("IMA/DK4 ADPCM");
1445 case GST_RIFF_WAVE_FORMAT_ADPCM_IMA_DK3:
1450 gst_caps_new_simple ("audio/x-adpcm", "layout", G_TYPE_STRING, "dk3",
1453 *codec_name = g_strdup ("IMA/DK3 ADPCM");
1456 case GST_RIFF_WAVE_FORMAT_ADPCM_IMA_WAV:
1461 gst_caps_new_simple ("audio/x-adpcm", "layout", G_TYPE_STRING, "dvi",
1464 *codec_name = g_strdup ("IMA/WAV ADPCM");
1466 case GST_RIFF_WAVE_FORMAT_EXTENSIBLE:{
1467 guint16 valid_bits_per_sample;
1468 guint32 channel_mask;
1469 guint32 subformat_guid[4];
1474 /* should be at least 22 bytes */
1475 if (strf_data == NULL || GST_BUFFER_SIZE (strf_data) < 22) {
1476 GST_WARNING ("WAVE_FORMAT_EXTENSIBLE data size is %d (expected: 22)",
1477 (strf_data) ? GST_BUFFER_SIZE (strf_data) : -1);
1481 data = GST_BUFFER_DATA (strf_data);
1483 valid_bits_per_sample = GST_READ_UINT16_LE (data);
1484 channel_mask = GST_READ_UINT32_LE (data + 2);
1485 subformat_guid[0] = GST_READ_UINT32_LE (data + 6);
1486 subformat_guid[1] = GST_READ_UINT32_LE (data + 10);
1487 subformat_guid[2] = GST_READ_UINT32_LE (data + 14);
1488 subformat_guid[3] = GST_READ_UINT32_LE (data + 18);
1490 GST_DEBUG ("valid bps = %u", valid_bits_per_sample);
1491 GST_DEBUG ("channel mask = 0x%08x", channel_mask);
1492 GST_DEBUG ("GUID = %08x-%08x-%08x-%08x", subformat_guid[0],
1493 subformat_guid[1], subformat_guid[2], subformat_guid[3]);
1495 if (subformat_guid[1] == 0x00100000 &&
1496 subformat_guid[2] == 0xaa000080 && subformat_guid[3] == 0x719b3800) {
1497 if (subformat_guid[0] == 0x00000001) {
1500 gint ba = strf->blockalign;
1501 gint wd = ba * 8 / strf->channels;
1504 /* in riff, the depth is stored in the size field but it just
1505 * means that the _least_ significant bits are cleared. We can
1506 * therefore just play the sample as if it had a depth == width */
1509 /* For reference, use this to get the actual depth:
1511 * if (valid_bits_per_sample != 0)
1512 * ws = valid_bits_per_sample; */
1514 caps = gst_caps_new_simple ("audio/x-raw-int",
1515 "endianness", G_TYPE_INT, G_LITTLE_ENDIAN,
1516 "channels", G_TYPE_INT, strf->channels,
1517 "width", G_TYPE_INT, wd,
1518 "depth", G_TYPE_INT, ws,
1519 "rate", G_TYPE_INT, strf->rate,
1520 "signed", G_TYPE_BOOLEAN, wd != 8, NULL);
1522 /* If channel_mask == 0 and channels > 2 let's
1523 * assume default layout as some wav files don't have the
1524 * channel mask set. Don't set the layout for 1 or 2
1525 * channels as it apparently breaks too many things currently. */
1526 if (channel_mask == 0 && strf->channels > 2)
1528 gst_riff_wavext_get_default_channel_mask (strf->channels);
1530 if ((channel_mask != 0 || strf->channels > 2) &&
1531 !gst_riff_wavext_add_channel_layout (caps, channel_mask)) {
1532 GST_WARNING ("failed to add channel layout");
1533 gst_caps_unref (caps);
1539 *codec_name = g_strdup_printf ("Uncompressed %d-bit PCM audio",
1543 } else if (subformat_guid[0] == 0x00000003) {
1544 GST_DEBUG ("FLOAT");
1546 gint ba = strf->blockalign;
1547 gint wd = ba * 8 / strf->channels;
1549 caps = gst_caps_new_simple ("audio/x-raw-float",
1550 "endianness", G_TYPE_INT, G_LITTLE_ENDIAN,
1551 "channels", G_TYPE_INT, strf->channels,
1552 "width", G_TYPE_INT, wd, "rate", G_TYPE_INT, strf->rate, NULL);
1554 /* If channel_mask == 0 and channels > 2 let's
1555 * assume default layout as some wav files don't have the
1556 * channel mask set. Don't set the layout for 1 or 2
1557 * channels as it apparently breaks too many things currently. */
1558 if (channel_mask == 0 && strf->channels > 2)
1560 gst_riff_wavext_get_default_channel_mask (strf->channels);
1562 if ((channel_mask != 0 || strf->channels > 2) &&
1563 !gst_riff_wavext_add_channel_layout (caps, channel_mask)) {
1564 GST_WARNING ("failed to add channel layout");
1565 gst_caps_unref (caps);
1572 g_strdup_printf ("Uncompressed %d-bit IEEE float audio",
1576 } else if (subformat_guid[0] == 00000006) {
1579 if (strf->size != 8) {
1580 GST_WARNING ("invalid depth (%d) of alaw audio, overwriting.",
1584 strf->blockalign = strf->av_bps * strf->channels;
1586 if (strf->av_bps == 0 || strf->blockalign == 0) {
1588 ("fixing av_bps (%d) and blockalign (%d) of alaw audio",
1589 strf->av_bps, strf->blockalign);
1590 strf->av_bps = strf->size;
1591 strf->blockalign = strf->av_bps * strf->channels;
1595 caps = gst_caps_new_simple ("audio/x-alaw", NULL);
1598 *codec_name = g_strdup ("A-law audio");
1599 } else if (subformat_guid[0] == 0x00000007) {
1600 GST_DEBUG ("MULAW");
1602 if (strf->size != 8) {
1603 GST_WARNING ("invalid depth (%d) of mulaw audio, overwriting.",
1607 strf->blockalign = strf->av_bps * strf->channels;
1609 if (strf->av_bps == 0 || strf->blockalign == 0) {
1611 ("fixing av_bps (%d) and blockalign (%d) of mulaw audio",
1612 strf->av_bps, strf->blockalign);
1613 strf->av_bps = strf->size;
1614 strf->blockalign = strf->av_bps * strf->channels;
1618 caps = gst_caps_new_simple ("audio/x-mulaw", NULL);
1620 *codec_name = g_strdup ("Mu-law audio");
1621 } else if (subformat_guid[0] == 0x00000092) {
1622 GST_DEBUG ("FIXME: handle DOLBY AC3 SPDIF format");
1624 } else if (subformat_guid[0] == 0x6ba47966 &&
1625 subformat_guid[1] == 0x41783f83 &&
1626 subformat_guid[2] == 0xf0006596 && subformat_guid[3] == 0xe59262bf) {
1627 caps = gst_caps_new_simple ("application/x-ogg-avi", NULL);
1629 *codec_name = g_strdup ("Ogg-AVI");
1633 GST_WARNING ("Unknown WAVE_FORMAT_EXTENSIBLE audio format");
1638 /* can anything decode these? pitfdll? */
1639 case GST_RIFF_WAVE_FORMAT_VOXWARE_AC8:
1640 case GST_RIFF_WAVE_FORMAT_VOXWARE_AC10:
1641 case GST_RIFF_WAVE_FORMAT_VOXWARE_AC16:
1642 case GST_RIFF_WAVE_FORMAT_VOXWARE_AC20:
1643 case GST_RIFF_WAVE_FORMAT_VOXWARE_METAVOICE:
1644 case GST_RIFF_WAVE_FORMAT_VOXWARE_METASOUND:
1645 case GST_RIFF_WAVE_FORMAT_VOXWARE_RT29HW:
1646 case GST_RIFF_WAVE_FORMAT_VOXWARE_VR12:
1647 case GST_RIFF_WAVE_FORMAT_VOXWARE_VR18:
1648 case GST_RIFF_WAVE_FORMAT_VOXWARE_TQ40:
1649 case GST_RIFF_WAVE_FORMAT_VOXWARE_TQ60:{
1650 caps = gst_caps_new_simple ("audio/x-voxware",
1651 "voxwaretype", G_TYPE_INT, (gint) codec_id, NULL);
1653 *codec_name = g_strdup ("Voxware");
1658 GST_WARNING ("Unknown audio tag 0x%04x", codec_id);
1664 if (strf->channels > channels_max)
1665 goto too_many_channels;
1666 if (strf->rate < rate_min || strf->rate > rate_max)
1669 gst_caps_set_simple (caps,
1670 "rate", G_TYPE_INT, strf->rate,
1671 "channels", G_TYPE_INT, strf->channels, NULL);
1674 gst_caps_set_simple (caps,
1675 "block_align", G_TYPE_INT, strf->blockalign, NULL);
1679 if (rate_min == rate_max)
1680 gst_caps_set_simple (caps, "rate", G_TYPE_INT, rate_min, NULL);
1682 gst_caps_set_simple (caps,
1683 "rate", GST_TYPE_INT_RANGE, rate_min, rate_max, NULL);
1684 if (channels_max == 1)
1685 gst_caps_set_simple (caps, "channels", G_TYPE_INT, 1, NULL);
1687 gst_caps_set_simple (caps,
1688 "channels", GST_TYPE_INT_RANGE, 1, channels_max, NULL);
1691 gst_caps_set_simple (caps,
1692 "block_align", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
1697 if (strf_data || strd_data) {
1698 gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER,
1699 strf_data ? strf_data : strd_data, NULL);
1707 ("Stream claims to contain %u channels, but format only supports %d",
1708 strf->channels, channels_max);
1709 gst_caps_unref (caps);
1713 ("Stream with sample_rate %u, but format only supports %d .. %d",
1714 strf->rate, rate_min, rate_max);
1715 gst_caps_unref (caps);
1720 gst_riff_create_iavs_caps (guint32 codec_fcc,
1721 gst_riff_strh * strh, gst_riff_strf_iavs * strf,
1722 GstBuffer * init_data, GstBuffer * extra_data, char **codec_name)
1724 GstCaps *caps = NULL;
1726 switch (codec_fcc) {
1727 /* is this correct? */
1728 case GST_MAKE_FOURCC ('D', 'V', 'S', 'D'):
1729 case GST_MAKE_FOURCC ('d', 'v', 's', 'd'):
1730 caps = gst_caps_new_simple ("video/x-dv",
1731 "systemstream", G_TYPE_BOOLEAN, TRUE, NULL);
1733 *codec_name = g_strdup ("Generic DV");
1737 GST_WARNING ("Unknown IAVS fourcc %" GST_FOURCC_FORMAT,
1738 GST_FOURCC_ARGS (codec_fcc));
1746 * Functions below are for template caps. All is variable.
1750 gst_riff_create_video_template_caps (void)
1752 static const guint32 tags[] = {
1753 GST_MAKE_FOURCC ('3', 'I', 'V', '1'),
1754 GST_MAKE_FOURCC ('A', 'S', 'V', '1'),
1755 GST_MAKE_FOURCC ('A', 'S', 'V', '2'),
1756 GST_MAKE_FOURCC ('C', 'L', 'J', 'R'),
1757 GST_MAKE_FOURCC ('C', 'S', 'C', 'D'),
1758 GST_MAKE_FOURCC ('C', 'Y', 'U', 'V'),
1759 GST_MAKE_FOURCC ('D', 'I', 'B', ' '),
1760 GST_MAKE_FOURCC ('D', 'I', 'V', '3'),
1761 GST_MAKE_FOURCC ('D', 'I', 'V', 'X'),
1762 GST_MAKE_FOURCC ('D', 'U', 'C', 'K'),
1763 GST_MAKE_FOURCC ('D', 'V', 'S', 'D'),
1764 GST_MAKE_FOURCC ('D', 'V', '5', '0'),
1765 GST_MAKE_FOURCC ('D', 'X', '5', '0'),
1766 GST_MAKE_FOURCC ('M', '4', 'C', 'C'),
1767 GST_MAKE_FOURCC ('F', 'L', 'V', '1'),
1768 GST_MAKE_FOURCC ('F', 'L', 'V', '4'),
1769 GST_MAKE_FOURCC ('H', '2', '6', '3'),
1770 GST_MAKE_FOURCC ('V', 'X', '1', 'K'),
1771 GST_MAKE_FOURCC ('H', '2', '6', '4'),
1772 GST_MAKE_FOURCC ('H', 'F', 'Y', 'U'),
1773 GST_MAKE_FOURCC ('I', '2', '6', '3'),
1774 GST_MAKE_FOURCC ('I', '4', '2', '0'),
1775 GST_MAKE_FOURCC ('I', 'V', '3', '2'),
1776 GST_MAKE_FOURCC ('I', 'V', '4', '1'),
1777 GST_MAKE_FOURCC ('I', 'V', '5', '0'),
1778 GST_MAKE_FOURCC ('L', '2', '6', '3'),
1779 GST_MAKE_FOURCC ('L', '2', '6', '4'),
1780 GST_MAKE_FOURCC ('M', '2', '6', '3'),
1781 GST_MAKE_FOURCC ('M', '4', 'S', '2'),
1782 GST_MAKE_FOURCC ('M', 'J', 'P', 'G'),
1783 GST_MAKE_FOURCC ('M', 'P', '4', '2'),
1784 GST_MAKE_FOURCC ('M', 'P', '4', '3'),
1785 GST_MAKE_FOURCC ('M', 'P', 'E', 'G'),
1786 GST_MAKE_FOURCC ('M', 'P', 'G', '2'),
1787 GST_MAKE_FOURCC ('M', 'P', 'G', '4'),
1788 GST_MAKE_FOURCC ('M', 'S', 'Z', 'H'),
1789 GST_MAKE_FOURCC ('P', 'N', 'G', ' '),
1790 GST_MAKE_FOURCC ('R', 'L', 'E', ' '),
1791 GST_MAKE_FOURCC ('R', 'T', '2', '1'),
1792 GST_MAKE_FOURCC ('S', 'P', '5', '3'),
1793 GST_MAKE_FOURCC ('T', 'M', '2', '0'),
1794 GST_MAKE_FOURCC ('T', 'S', 'C', 'C'),
1795 GST_MAKE_FOURCC ('U', 'L', 'T', 'I'),
1796 GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'),
1797 GST_MAKE_FOURCC ('V', 'C', 'R', '1'),
1798 GST_MAKE_FOURCC ('V', 'C', 'R', '2'),
1799 GST_MAKE_FOURCC ('V', 'D', 'O', 'W'),
1800 GST_MAKE_FOURCC ('V', 'I', 'V', 'O'),
1801 GST_MAKE_FOURCC ('V', 'M', 'n', 'c'),
1802 GST_MAKE_FOURCC ('V', 'P', '3', ' '),
1803 GST_MAKE_FOURCC ('V', 'S', 'S', 'H'),
1804 GST_MAKE_FOURCC ('W', 'M', 'V', '1'),
1805 GST_MAKE_FOURCC ('W', 'M', 'V', '2'),
1806 GST_MAKE_FOURCC ('W', 'M', 'V', '3'),
1807 GST_MAKE_FOURCC ('X', 'V', 'I', 'D'),
1808 GST_MAKE_FOURCC ('X', 'x', 'a', 'n'),
1809 GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'),
1810 GST_MAKE_FOURCC ('Y', 'V', 'U', '9'),
1811 GST_MAKE_FOURCC ('Z', 'L', 'I', 'B'),
1812 GST_MAKE_FOURCC ('c', 'v', 'i', 'd'),
1813 GST_MAKE_FOURCC ('h', '2', '6', '4'),
1814 GST_MAKE_FOURCC ('m', 's', 'v', 'c'),
1815 GST_MAKE_FOURCC ('x', '2', '6', '3'),
1816 GST_MAKE_FOURCC ('d', 'r', 'a', 'c'),
1817 GST_MAKE_FOURCC ('F', 'F', 'V', '1'),
1818 GST_MAKE_FOURCC ('K', 'M', 'V', 'C'),
1819 GST_MAKE_FOURCC ('V', 'P', '5', '0'),
1820 GST_MAKE_FOURCC ('V', 'P', '6', '0'),
1821 GST_MAKE_FOURCC ('V', 'P', '6', 'F'),
1822 GST_MAKE_FOURCC ('V', 'P', '7', '0'),
1823 GST_MAKE_FOURCC ('V', 'P', '8', '0'),
1824 GST_MAKE_FOURCC ('L', 'M', '2', '0'),
1825 GST_MAKE_FOURCC ('R', 'P', 'Z', 'A'),
1826 GST_MAKE_FOURCC ('T', 'H', 'E', 'O'),
1827 GST_MAKE_FOURCC ('F', 'P', 'S', '1'),
1828 GST_MAKE_FOURCC ('A', 'A', 'S', 'C'),
1829 GST_MAKE_FOURCC ('Y', 'V', '1', '2'),
1830 GST_MAKE_FOURCC ('L', 'O', 'C', 'O'),
1831 GST_MAKE_FOURCC ('Z', 'M', 'B', 'V'),
1835 GstCaps *caps, *one;
1837 caps = gst_caps_new_empty ();
1838 for (i = 0; i < G_N_ELEMENTS (tags); i++) {
1839 one = gst_riff_create_video_caps (tags[i], NULL, NULL, NULL, NULL, NULL);
1841 gst_caps_append (caps, one);
1848 gst_riff_create_audio_template_caps (void)
1850 static const guint16 tags[] = {
1851 GST_RIFF_WAVE_FORMAT_GSM610,
1852 GST_RIFF_WAVE_FORMAT_MPEGL3,
1853 GST_RIFF_WAVE_FORMAT_MPEGL12,
1854 GST_RIFF_WAVE_FORMAT_PCM,
1855 GST_RIFF_WAVE_FORMAT_VORBIS1,
1856 GST_RIFF_WAVE_FORMAT_A52,
1857 GST_RIFF_WAVE_FORMAT_DTS,
1858 GST_RIFF_WAVE_FORMAT_AAC,
1859 GST_RIFF_WAVE_FORMAT_ALAW,
1860 GST_RIFF_WAVE_FORMAT_MULAW,
1861 GST_RIFF_WAVE_FORMAT_WMS,
1862 GST_RIFF_WAVE_FORMAT_ADPCM,
1863 GST_RIFF_WAVE_FORMAT_DVI_ADPCM,
1864 GST_RIFF_WAVE_FORMAT_DSP_TRUESPEECH,
1865 GST_RIFF_WAVE_FORMAT_WMAV1,
1866 GST_RIFF_WAVE_FORMAT_WMAV2,
1867 GST_RIFF_WAVE_FORMAT_WMAV3,
1868 GST_RIFF_WAVE_FORMAT_SONY_ATRAC3,
1869 GST_RIFF_WAVE_FORMAT_IEEE_FLOAT,
1870 GST_RIFF_WAVE_FORMAT_VOXWARE_METASOUND,
1871 GST_RIFF_WAVE_FORMAT_ADPCM_IMA_DK4,
1872 GST_RIFF_WAVE_FORMAT_ADPCM_IMA_DK3,
1873 GST_RIFF_WAVE_FORMAT_ADPCM_IMA_WAV,
1874 GST_RIFF_WAVE_FORMAT_AMR_NB,
1875 GST_RIFF_WAVE_FORMAT_AMR_WB,
1876 GST_RIFF_WAVE_FORMAT_SIREN,
1880 GstCaps *caps, *one;
1882 caps = gst_caps_new_empty ();
1883 for (i = 0; i < G_N_ELEMENTS (tags); i++) {
1884 one = gst_riff_create_audio_caps (tags[i], NULL, NULL, NULL, NULL, NULL);
1886 gst_caps_append (caps, one);
1888 one = gst_caps_new_simple ("application/x-ogg-avi", NULL);
1889 gst_caps_append (caps, one);
1895 gst_riff_create_iavs_template_caps (void)
1897 static const guint32 tags[] = {
1898 GST_MAKE_FOURCC ('D', 'V', 'S', 'D')
1902 GstCaps *caps, *one;
1904 caps = gst_caps_new_empty ();
1905 for (i = 0; i < G_N_ELEMENTS (tags); i++) {
1906 one = gst_riff_create_iavs_caps (tags[i], NULL, NULL, NULL, NULL, NULL);
1908 gst_caps_append (caps, one);