gst_plugins_base/gst-libs/gst/riff/riff-media.c
branchRCL_3
changeset 30 7e817e7e631c
parent 29 567bb019e3e3
equal deleted inserted replaced
29:567bb019e3e3 30:7e817e7e631c
    33 
    33 
    34 GST_DEBUG_CATEGORY_EXTERN (riff_debug);
    34 GST_DEBUG_CATEGORY_EXTERN (riff_debug);
    35 #define GST_CAT_DEFAULT riff_debug
    35 #define GST_CAT_DEFAULT riff_debug
    36 
    36 
    37 /**
    37 /**
    38  * gst_riff_create_video_caps:
    38  * gst_riff_create_video_caps_with_data:
    39  * @codec_fcc: fourCC codec for this codec.
    39  * @codec_fcc: fourCC codec for this codec.
    40  * @strh: pointer to the strh stream header structure.
    40  * @strh: pointer to the strh stream header structure.
    41  * @strf: pointer to the strf stream header structure, including any
    41  * @strf: pointer to the strf stream header structure, including any
    42  *        data that is within the range of strf.size, but excluding any
    42  *        data that is within the range of strf.size, but excluding any
    43  *        additional data withint this chunk but outside strf.size.
    43  *        additional data withint this chunk but outside strf.size.
    61   GstBuffer *palette = NULL;
    61   GstBuffer *palette = NULL;
    62 
    62 
    63   GST_DEBUG ("video fourcc %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (codec_fcc));
    63   GST_DEBUG ("video fourcc %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (codec_fcc));
    64 
    64 
    65   switch (codec_fcc) {
    65   switch (codec_fcc) {
    66     case GST_MAKE_FOURCC ('D', 'I', 'B', ' '): /* uncompressed RGB */
    66     case GST_MAKE_FOURCC ('D', 'I', 'B', ' '):{
    67     case GST_MAKE_FOURCC (0x00, 0x00, 0x00, 0x00):
       
    68     case GST_MAKE_FOURCC ('R', 'G', 'B', ' '):
       
    69     case GST_MAKE_FOURCC ('R', 'A', 'W', ' '):
       
    70     {
       
    71       gint bpp = (strf && strf->bit_cnt != 0) ? strf->bit_cnt : 8;
    67       gint bpp = (strf && strf->bit_cnt != 0) ? strf->bit_cnt : 8;
    72 
    68 
    73       if (strf) {
    69       if (strf) {
    74         if (bpp == 8) {
    70         if (bpp == 8) {
    75           caps = gst_caps_new_simple ("video/x-raw-rgb",
    71           caps = gst_caps_new_simple ("video/x-raw-rgb",
    81               "endianness", G_TYPE_INT, G_BIG_ENDIAN,
    77               "endianness", G_TYPE_INT, G_BIG_ENDIAN,
    82               "red_mask", G_TYPE_INT, 0xff, "green_mask", G_TYPE_INT, 0xff00,
    78               "red_mask", G_TYPE_INT, 0xff, "green_mask", G_TYPE_INT, 0xff00,
    83               "blue_mask", G_TYPE_INT, 0xff0000, NULL);
    79               "blue_mask", G_TYPE_INT, 0xff0000, NULL);
    84         } else {
    80         } else {
    85           GST_WARNING ("Unhandled DIB RGB depth: %d", bpp);
    81           GST_WARNING ("Unhandled DIB RGB depth: %d", bpp);
    86           return NULL;
       
    87         }
    82         }
    88       } else {
    83       } else {
    89         /* for template */
    84         /* for template */
    90         caps = gst_caps_from_string ("video/x-raw-rgb, bpp = (int) { 8, 24 }, "
    85         caps = gst_caps_from_string ("video/x-raw-rgb, bpp = (int) { 8, 24 }, "
    91             "depth = (int) { 8, 24}");
    86             "depth = (int) { 8, 24}");
   116           "format", GST_TYPE_FOURCC, codec_fcc, NULL);
   111           "format", GST_TYPE_FOURCC, codec_fcc, NULL);
   117       if (codec_name)
   112       if (codec_name)
   118         *codec_name = g_strdup ("Uncompressed packed YVU 4:1:0");
   113         *codec_name = g_strdup ("Uncompressed packed YVU 4:1:0");
   119       break;
   114       break;
   120 
   115 
   121     case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'):
       
   122       caps = gst_caps_new_simple ("video/x-raw-yuv",
       
   123           "format", GST_TYPE_FOURCC, codec_fcc, NULL);
       
   124       if (codec_name)
       
   125         *codec_name = g_strdup ("Uncompressed packed YUV 4:2:2");
       
   126       break;
       
   127 
       
   128     case GST_MAKE_FOURCC ('M', 'J', 'P', 'G'): /* YUY2 MJPEG */
   116     case GST_MAKE_FOURCC ('M', 'J', 'P', 'G'): /* YUY2 MJPEG */
   129     case GST_MAKE_FOURCC ('A', 'V', 'R', 'n'):
   117     case GST_MAKE_FOURCC ('A', 'V', 'R', 'n'):
   130     case GST_MAKE_FOURCC ('I', 'J', 'P', 'G'):
   118     case GST_MAKE_FOURCC ('I', 'J', 'P', 'G'):
   131     case GST_MAKE_FOURCC ('i', 'j', 'p', 'g'):
   119     case GST_MAKE_FOURCC ('i', 'j', 'p', 'g'):
   132     case GST_MAKE_FOURCC ('d', 'm', 'b', '1'):
   120     case GST_MAKE_FOURCC ('J', 'P', 'G', 'L'):
   133     case GST_MAKE_FOURCC ('A', 'C', 'D', 'V'):
       
   134     case GST_MAKE_FOURCC ('Q', 'I', 'V', 'G'):
       
   135       caps = gst_caps_new_simple ("image/jpeg", NULL);
   121       caps = gst_caps_new_simple ("image/jpeg", NULL);
   136       if (codec_name)
   122       if (codec_name)
   137         *codec_name = g_strdup ("Motion JPEG");
   123         *codec_name = g_strdup ("Motion JPEG");
   138       break;
   124       break;
   139 
   125 
   146 
   132 
   147     case GST_MAKE_FOURCC ('P', 'I', 'X', 'L'): /* Miro/Pinnacle fourccs */
   133     case GST_MAKE_FOURCC ('P', 'I', 'X', 'L'): /* Miro/Pinnacle fourccs */
   148     case GST_MAKE_FOURCC ('V', 'I', 'X', 'L'): /* Miro/Pinnacle fourccs */
   134     case GST_MAKE_FOURCC ('V', 'I', 'X', 'L'): /* Miro/Pinnacle fourccs */
   149       caps = gst_caps_new_simple ("image/jpeg", NULL);
   135       caps = gst_caps_new_simple ("image/jpeg", NULL);
   150       if (codec_name)
   136       if (codec_name)
   151         *codec_name = g_strdup ("Miro/Pinnacle Motion JPEG");
   137         *codec_name = g_strdup ("Miro/Pinnacle Motion JPEG Video");
   152       break;
       
   153 
       
   154     case GST_MAKE_FOURCC ('C', 'J', 'P', 'G'):
       
   155       caps = gst_caps_new_simple ("image/jpeg", NULL);
       
   156       if (codec_name)
       
   157         *codec_name = g_strdup ("Creative Webcam JPEG");
       
   158       break;
       
   159 
       
   160     case GST_MAKE_FOURCC ('S', 'L', 'M', 'J'):
       
   161       caps = gst_caps_new_simple ("image/jpeg", NULL);
       
   162       if (codec_name)
       
   163         *codec_name = g_strdup ("SL Motion JPEG");
       
   164       break;
       
   165 
       
   166     case GST_MAKE_FOURCC ('J', 'P', 'G', 'L'):
       
   167       caps = gst_caps_new_simple ("image/jpeg", NULL);
       
   168       if (codec_name)
       
   169         *codec_name = g_strdup ("Pegasus Lossless JPEG");
       
   170       break;
   138       break;
   171 
   139 
   172     case GST_MAKE_FOURCC ('S', 'P', '5', '3'):
   140     case GST_MAKE_FOURCC ('S', 'P', '5', '3'):
   173     case GST_MAKE_FOURCC ('S', 'P', '5', '4'):
   141     case GST_MAKE_FOURCC ('S', 'P', '5', '4'):
   174     case GST_MAKE_FOURCC ('S', 'P', '5', '5'):
   142     case GST_MAKE_FOURCC ('S', 'P', '5', '5'):
   193     case GST_MAKE_FOURCC ('M', 'P', 'E', 'G'):
   161     case GST_MAKE_FOURCC ('M', 'P', 'E', 'G'):
   194     case GST_MAKE_FOURCC ('M', 'P', 'G', 'I'):
   162     case GST_MAKE_FOURCC ('M', 'P', 'G', 'I'):
   195     case GST_MAKE_FOURCC ('m', 'p', 'g', '1'):
   163     case GST_MAKE_FOURCC ('m', 'p', 'g', '1'):
   196     case GST_MAKE_FOURCC ('M', 'P', 'G', '1'):
   164     case GST_MAKE_FOURCC ('M', 'P', 'G', '1'):
   197     case GST_MAKE_FOURCC ('P', 'I', 'M', '1'):
   165     case GST_MAKE_FOURCC ('P', 'I', 'M', '1'):
   198     case GST_MAKE_FOURCC (0x01, 0x00, 0x00, 0x10):
       
   199       caps = gst_caps_new_simple ("video/mpeg",
   166       caps = gst_caps_new_simple ("video/mpeg",
   200           "systemstream", G_TYPE_BOOLEAN, FALSE,
   167           "systemstream", G_TYPE_BOOLEAN, FALSE,
   201           "mpegversion", G_TYPE_INT, 1, NULL);
   168           "mpegversion", G_TYPE_INT, 1, NULL);
   202       if (codec_name)
   169       if (codec_name)
   203         *codec_name = g_strdup ("MPEG-1 video");
   170         *codec_name = g_strdup ("MPEG-1 video");
   204       break;
   171       break;
   205 
       
   206     case GST_MAKE_FOURCC ('M', 'P', 'G', '2'):
   172     case GST_MAKE_FOURCC ('M', 'P', 'G', '2'):
   207     case GST_MAKE_FOURCC ('m', 'p', 'g', '2'):
   173     case GST_MAKE_FOURCC ('m', 'p', 'g', '2'):
   208     case GST_MAKE_FOURCC ('P', 'I', 'M', '2'):
       
   209     case GST_MAKE_FOURCC ('D', 'V', 'R', ' '):
       
   210     case GST_MAKE_FOURCC (0x02, 0x00, 0x00, 0x10):
       
   211       caps = gst_caps_new_simple ("video/mpeg",
   174       caps = gst_caps_new_simple ("video/mpeg",
   212           "systemstream", G_TYPE_BOOLEAN, FALSE,
   175           "systemstream", G_TYPE_BOOLEAN, FALSE,
   213           "mpegversion", G_TYPE_INT, 2, NULL);
   176           "mpegversion", G_TYPE_INT, 2, NULL);
   214       if (codec_name)
   177       if (codec_name)
   215         *codec_name = g_strdup ("MPEG-2 video");
   178         *codec_name = g_strdup ("MPEG-2 video");
   216       break;
       
   217 
       
   218     case GST_MAKE_FOURCC ('L', 'M', 'P', '2'):
       
   219       caps = gst_caps_new_simple ("video/mpeg",
       
   220           "systemstream", G_TYPE_BOOLEAN, FALSE,
       
   221           "mpegversion", G_TYPE_INT, 2, NULL);
       
   222       if (codec_name)
       
   223         *codec_name = g_strdup ("Lead MPEG-2 video");
       
   224       break;
   179       break;
   225 
   180 
   226     case GST_MAKE_FOURCC ('H', '2', '6', '3'):
   181     case GST_MAKE_FOURCC ('H', '2', '6', '3'):
   227     case GST_MAKE_FOURCC ('h', '2', '6', '3'):
   182     case GST_MAKE_FOURCC ('h', '2', '6', '3'):
   228     case GST_MAKE_FOURCC ('i', '2', '6', '3'):
   183     case GST_MAKE_FOURCC ('i', '2', '6', '3'):
   229     case GST_MAKE_FOURCC ('U', '2', '6', '3'):
   184     case GST_MAKE_FOURCC ('U', '2', '6', '3'):
   230     case GST_MAKE_FOURCC ('v', 'i', 'v', '1'):
       
   231     case GST_MAKE_FOURCC ('T', '2', '6', '3'):
       
   232       caps = gst_caps_new_simple ("video/x-h263",
   185       caps = gst_caps_new_simple ("video/x-h263",
   233           "variant", G_TYPE_STRING, "itu", NULL);
   186           "variant", G_TYPE_STRING, "itu", NULL);
   234       if (codec_name)
   187       if (codec_name)
   235         *codec_name = g_strdup ("ITU H.26n");
   188         *codec_name = g_strdup ("ITU H.26n");
   236       break;
   189       break;
   278           "variant", G_TYPE_STRING, "intel", NULL);
   231           "variant", G_TYPE_STRING, "intel", NULL);
   279       if (codec_name)
   232       if (codec_name)
   280         *codec_name = g_strdup ("Intel H.263");
   233         *codec_name = g_strdup ("Intel H.263");
   281       break;
   234       break;
   282 
   235 
   283     case GST_MAKE_FOURCC ('V', 'X', '1', 'K'):
       
   284       caps = gst_caps_new_simple ("video/x-h263",
       
   285           "variant", G_TYPE_STRING, "lucent", NULL);
       
   286       if (codec_name)
       
   287         *codec_name = g_strdup ("Lucent VX1000S H.263");
       
   288       break;
       
   289 
       
   290     case GST_MAKE_FOURCC ('X', '2', '6', '4'):
       
   291     case GST_MAKE_FOURCC ('x', '2', '6', '4'):
       
   292     case GST_MAKE_FOURCC ('H', '2', '6', '4'):
   236     case GST_MAKE_FOURCC ('H', '2', '6', '4'):
   293     case GST_MAKE_FOURCC ('h', '2', '6', '4'):
   237     case GST_MAKE_FOURCC ('h', '2', '6', '4'):
   294     case GST_MAKE_FOURCC ('a', 'v', 'c', '1'):
   238     case GST_MAKE_FOURCC ('a', 'v', 'c', '1'):
   295     case GST_MAKE_FOURCC ('A', 'V', 'C', '1'):
   239     case GST_MAKE_FOURCC ('A', 'V', 'C', '1'):
   296       caps = gst_caps_new_simple ("video/x-h264",
   240       caps = gst_caps_new_simple ("video/x-h264",
   304           "variant", G_TYPE_STRING, "videosoft", NULL);
   248           "variant", G_TYPE_STRING, "videosoft", NULL);
   305       if (codec_name)
   249       if (codec_name)
   306         *codec_name = g_strdup ("VideoSoft H.264");
   250         *codec_name = g_strdup ("VideoSoft H.264");
   307       break;
   251       break;
   308 
   252 
   309     case GST_MAKE_FOURCC ('L', '2', '6', '4'):
       
   310       /* http://www.leadcodecs.com/Codecs/LEAD-H264.htm */
       
   311       caps = gst_caps_new_simple ("video/x-h264",
       
   312           "variant", G_TYPE_STRING, "lead", NULL);
       
   313       if (codec_name)
       
   314         *codec_name = g_strdup ("Lead H.264");
       
   315       break;
       
   316 
       
   317     case GST_MAKE_FOURCC ('S', 'E', 'D', 'G'):
   253     case GST_MAKE_FOURCC ('S', 'E', 'D', 'G'):
   318       caps = gst_caps_new_simple ("video/mpeg",
   254       caps = gst_caps_new_simple ("video/mpeg",
   319           "mpegversion", G_TYPE_INT, 4, NULL);
   255           "mpegversion", G_TYPE_INT, 4, NULL);
   320       if (codec_name)
   256       if (codec_name)
   321         *codec_name = g_strdup ("Samsung MPEG-4");
   257         *codec_name = g_strdup ("Samsung MPEG-4");
   322       break;
   258       break;
   323 
   259 
   324     case GST_MAKE_FOURCC ('M', '4', 'C', 'C'):
       
   325       caps = gst_caps_new_simple ("video/mpeg",
       
   326           "mpegversion", G_TYPE_INT, 4, NULL);
       
   327       if (codec_name)
       
   328         *codec_name = g_strdup ("Divio MPEG-4");
       
   329       break;
       
   330 
       
   331     case GST_MAKE_FOURCC ('D', 'I', 'V', '3'):
   260     case GST_MAKE_FOURCC ('D', 'I', 'V', '3'):
   332     case GST_MAKE_FOURCC ('d', 'i', 'v', '3'):
   261     case GST_MAKE_FOURCC ('d', 'i', 'v', '3'):
   333     case GST_MAKE_FOURCC ('D', 'V', 'X', '3'):
       
   334     case GST_MAKE_FOURCC ('d', 'v', 'x', '3'):
       
   335     case GST_MAKE_FOURCC ('D', 'I', 'V', '4'):
   262     case GST_MAKE_FOURCC ('D', 'I', 'V', '4'):
   336     case GST_MAKE_FOURCC ('d', 'i', 'v', '4'):
   263     case GST_MAKE_FOURCC ('d', 'i', 'v', '4'):
   337     case GST_MAKE_FOURCC ('D', 'I', 'V', '5'):
   264     case GST_MAKE_FOURCC ('D', 'I', 'V', '5'):
   338     case GST_MAKE_FOURCC ('d', 'i', 'v', '5'):
   265     case GST_MAKE_FOURCC ('d', 'i', 'v', '5'):
   339     case GST_MAKE_FOURCC ('D', 'I', 'V', '6'):
   266     case GST_MAKE_FOURCC ('D', 'I', 'V', '6'):
   379       if (codec_name)
   306       if (codec_name)
   380         *codec_name = g_strdup ("XVID MPEG-4");
   307         *codec_name = g_strdup ("XVID MPEG-4");
   381       break;
   308       break;
   382 
   309 
   383     case GST_MAKE_FOURCC ('M', 'P', 'G', '4'):
   310     case GST_MAKE_FOURCC ('M', 'P', 'G', '4'):
   384     case GST_MAKE_FOURCC ('M', 'P', '4', '1'):
   311     case GST_MAKE_FOURCC ('M', 'P', '4', 'S'):
   385     case GST_MAKE_FOURCC ('m', 'p', '4', '1'):
       
   386       caps = gst_caps_new_simple ("video/x-msmpeg",
   312       caps = gst_caps_new_simple ("video/x-msmpeg",
   387           "msmpegversion", G_TYPE_INT, 41, NULL);
   313           "msmpegversion", G_TYPE_INT, 41, NULL);
   388       if (codec_name)
   314       if (codec_name)
   389         *codec_name = g_strdup ("Microsoft MPEG-4 4.1");
   315         *codec_name = g_strdup ("Microsoft MPEG-4 4.1");
   390       break;
   316       break;
   403           "msmpegversion", G_TYPE_INT, 43, NULL);
   329           "msmpegversion", G_TYPE_INT, 43, NULL);
   404       if (codec_name)
   330       if (codec_name)
   405         *codec_name = g_strdup ("Microsoft MPEG-4 4.3");
   331         *codec_name = g_strdup ("Microsoft MPEG-4 4.3");
   406       break;
   332       break;
   407 
   333 
   408     case GST_MAKE_FOURCC ('M', 'P', '4', 'S'):
       
   409     case GST_MAKE_FOURCC ('M', '4', 'S', '2'):
   334     case GST_MAKE_FOURCC ('M', '4', 'S', '2'):
   410       caps = gst_caps_new_simple ("video/mpeg",
   335       caps = gst_caps_new_simple ("video/mpeg",
   411           "mpegversion", G_TYPE_INT, 4, NULL);
   336           "mpegversion", G_TYPE_INT, 4, NULL);
   412       if (codec_name)
   337       if (codec_name)
   413         *codec_name = g_strdup ("Microsoft ISO MPEG-4 1.1");
   338         *codec_name = g_strdup ("Microsoft ISO MPEG-4 1.1");
   414       break;
   339       break;
   415 
   340 
   416     case GST_MAKE_FOURCC ('F', 'M', 'P', '4'):
   341     case GST_MAKE_FOURCC ('F', 'M', 'P', '4'):
   417     case GST_MAKE_FOURCC ('U', 'M', 'P', '4'):
   342     case GST_MAKE_FOURCC ('U', 'M', 'P', '4'):
   418     case GST_MAKE_FOURCC ('F', 'F', 'D', 'S'):
       
   419       caps = gst_caps_new_simple ("video/mpeg",
   343       caps = gst_caps_new_simple ("video/mpeg",
   420           "mpegversion", G_TYPE_INT, 4, NULL);
   344           "mpegversion", G_TYPE_INT, 4, NULL);
   421       if (codec_name)
   345       if (codec_name)
   422         *codec_name = g_strdup ("FFmpeg MPEG-4");
   346         *codec_name = g_strdup ("FFmpeg MPEG-4");
   423       break;
   347       break;
   424 
   348 
   425     case GST_MAKE_FOURCC ('E', 'M', '4', 'A'):
       
   426     case GST_MAKE_FOURCC ('E', 'P', 'V', 'H'):
       
   427     case GST_MAKE_FOURCC ('F', 'V', 'F', 'W'):
       
   428     case GST_MAKE_FOURCC ('I', 'N', 'M', 'C'):
       
   429     case GST_MAKE_FOURCC ('D', 'I', 'G', 'I'):
       
   430     case GST_MAKE_FOURCC ('D', 'M', '2', 'K'):
       
   431     case GST_MAKE_FOURCC ('D', 'C', 'O', 'D'):
       
   432     case GST_MAKE_FOURCC ('M', 'V', 'X', 'M'):
       
   433     case GST_MAKE_FOURCC ('P', 'M', '4', 'V'):
       
   434     case GST_MAKE_FOURCC ('S', 'M', 'P', '4'):
       
   435     case GST_MAKE_FOURCC ('D', 'X', 'G', 'M'):
       
   436     case GST_MAKE_FOURCC ('V', 'I', 'D', 'M'):
       
   437     case GST_MAKE_FOURCC ('M', '4', 'T', '3'):
       
   438     case GST_MAKE_FOURCC ('G', 'E', 'O', 'X'):
       
   439       caps = gst_caps_new_simple ("video/mpeg",
       
   440           "mpegversion", G_TYPE_INT, 4, NULL);
       
   441       if (codec_name)
       
   442         *codec_name = g_strdup ("MPEG-4");
       
   443       break;
       
   444 
       
   445     case GST_MAKE_FOURCC ('3', 'i', 'v', 'd'):
   349     case GST_MAKE_FOURCC ('3', 'i', 'v', 'd'):
   446     case GST_MAKE_FOURCC ('3', 'I', 'V', 'D'):
   350     case GST_MAKE_FOURCC ('3', 'I', 'V', 'D'):
   447       caps = gst_caps_new_simple ("video/x-msmpeg",
       
   448           "msmpegversion", G_TYPE_INT, 43, NULL);
       
   449       if (codec_name)
   351       if (codec_name)
   450         *codec_name = g_strdup ("Microsoft MPEG-4 4.3");        /* FIXME? */
   352         *codec_name = g_strdup ("Microsoft MPEG-4 4.3");        /* FIXME? */
   451       break;
   353       return gst_caps_from_string ("video/x-msmpeg, msmpegversion = (int) 43");
   452 
   354 
   453     case GST_MAKE_FOURCC ('3', 'I', 'V', '1'):
   355     case GST_MAKE_FOURCC ('3', 'I', 'V', '1'):
   454     case GST_MAKE_FOURCC ('3', 'I', 'V', '2'):
   356     case GST_MAKE_FOURCC ('3', 'I', 'V', '2'):
   455       caps = gst_caps_new_simple ("video/x-3ivx", NULL);
   357       caps = gst_caps_new_simple ("video/x-3ivx", NULL);
   456       if (codec_name)
   358       if (codec_name)
   457         *codec_name = g_strdup ("3ivx");
   359         *codec_name = g_strdup ("3ivx");
   458       break;
   360       break;
   459 
   361 
   460     case GST_MAKE_FOURCC ('D', 'V', 'S', 'D'):
   362     case GST_MAKE_FOURCC ('D', 'V', 'S', 'D'):
   461     case GST_MAKE_FOURCC ('d', 'v', 's', 'd'):
   363     case GST_MAKE_FOURCC ('d', 'v', 's', 'd'):
   462     case GST_MAKE_FOURCC ('d', 'v', 'c', ' '):
   364     case GST_MAKE_FOURCC ('C', 'D', 'V', 'C'):
   463     case GST_MAKE_FOURCC ('d', 'v', '2', '5'):
       
   464       caps = gst_caps_new_simple ("video/x-dv",
   365       caps = gst_caps_new_simple ("video/x-dv",
   465           "systemstream", G_TYPE_BOOLEAN, FALSE,
   366           "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
   466           "dvversion", G_TYPE_INT, 25, NULL);
       
   467       if (codec_name)
   367       if (codec_name)
   468         *codec_name = g_strdup ("Generic DV");
   368         *codec_name = g_strdup ("Generic DV");
   469       break;
       
   470 
       
   471     case GST_MAKE_FOURCC ('C', 'D', 'V', 'C'):
       
   472     case GST_MAKE_FOURCC ('c', 'd', 'v', 'c'):
       
   473       caps = gst_caps_new_simple ("video/x-dv",
       
   474           "systemstream", G_TYPE_BOOLEAN, FALSE,
       
   475           "dvversion", G_TYPE_INT, 25, NULL);
       
   476       if (codec_name)
       
   477         *codec_name = g_strdup ("Canopus DV");
       
   478       break;
       
   479 
       
   480     case GST_MAKE_FOURCC ('D', 'V', '5', '0'):
       
   481     case GST_MAKE_FOURCC ('d', 'v', '5', '0'):
       
   482       caps = gst_caps_new_simple ("video/x-dv",
       
   483           "systemstream", G_TYPE_BOOLEAN, FALSE,
       
   484           "dvversion", G_TYPE_INT, 50, NULL);
       
   485       if (codec_name)
       
   486         *codec_name = g_strdup ("DVCPro50 Video");
       
   487       break;
   369       break;
   488 
   370 
   489     case GST_MAKE_FOURCC ('W', 'M', 'V', '1'):
   371     case GST_MAKE_FOURCC ('W', 'M', 'V', '1'):
   490       caps = gst_caps_new_simple ("video/x-wmv",
   372       caps = gst_caps_new_simple ("video/x-wmv",
   491           "wmvversion", G_TYPE_INT, 1, NULL);
   373           "wmvversion", G_TYPE_INT, 1, NULL);
   507         *codec_name = g_strdup ("Microsoft Windows Media 9");
   389         *codec_name = g_strdup ("Microsoft Windows Media 9");
   508       break;
   390       break;
   509 
   391 
   510     case GST_MAKE_FOURCC ('W', 'M', 'V', 'A'):
   392     case GST_MAKE_FOURCC ('W', 'M', 'V', 'A'):
   511       caps = gst_caps_new_simple ("video/x-wmv",
   393       caps = gst_caps_new_simple ("video/x-wmv",
   512           "wmvversion", G_TYPE_INT, 3, "format", GST_TYPE_FOURCC,
   394           "wmvversion", G_TYPE_INT, 3, "fourcc", GST_TYPE_FOURCC,
   513           codec_fcc, NULL);
   395           codec_fcc, NULL);
   514       if (codec_name)
   396       if (codec_name)
   515         *codec_name = g_strdup ("Microsoft Windows Media Advanced Profile");
   397         *codec_name = g_strdup ("Microsoft Windows Media Advanced Profile");
   516       break;
   398       break;
   517 
   399 
   518     case GST_MAKE_FOURCC ('W', 'V', 'C', '1'):
   400     case GST_MAKE_FOURCC ('W', 'V', 'C', '1'):
   519       caps = gst_caps_new_simple ("video/x-wmv",
   401       caps = gst_caps_new_simple ("video/x-wmv",
   520           "wmvversion", G_TYPE_INT, 3, "format", GST_TYPE_FOURCC,
   402           "wmvversion", G_TYPE_INT, 3, "fourcc", GST_TYPE_FOURCC,
   521           codec_fcc, NULL);
   403           codec_fcc, NULL);
   522       if (codec_name)
   404       if (codec_name)
   523         *codec_name = g_strdup ("Microsoft Windows Media VC-1");
   405         *codec_name = g_strdup ("Microsoft Windows Media VC-1");
   524       break;
   406       break;
   525 
   407 
   544       break;
   426       break;
   545 
   427 
   546     case GST_MAKE_FOURCC ('R', 'L', 'E', ' '):
   428     case GST_MAKE_FOURCC ('R', 'L', 'E', ' '):
   547     case GST_MAKE_FOURCC ('m', 'r', 'l', 'e'):
   429     case GST_MAKE_FOURCC ('m', 'r', 'l', 'e'):
   548     case GST_MAKE_FOURCC (0x1, 0x0, 0x0, 0x0): /* why, why, why? */
   430     case GST_MAKE_FOURCC (0x1, 0x0, 0x0, 0x0): /* why, why, why? */
   549     case GST_MAKE_FOURCC (0x2, 0x0, 0x0, 0x0): /* why, why, why? */
       
   550       caps = gst_caps_new_simple ("video/x-rle",
   431       caps = gst_caps_new_simple ("video/x-rle",
   551           "layout", G_TYPE_STRING, "microsoft", NULL);
   432           "layout", G_TYPE_STRING, "microsoft", NULL);
   552       palette = strf_data;
   433       palette = strf_data;
   553       strf_data = NULL;
   434       strf_data = NULL;
   554       if (strf) {
   435       if (strf) {
   611       if (codec_name)
   492       if (codec_name)
   612         *codec_name = g_strdup ("Lossless zlib video");
   493         *codec_name = g_strdup ("Lossless zlib video");
   613       break;
   494       break;
   614 
   495 
   615     case GST_MAKE_FOURCC ('C', 'L', 'J', 'R'):
   496     case GST_MAKE_FOURCC ('C', 'L', 'J', 'R'):
   616     case GST_MAKE_FOURCC ('c', 'l', 'j', 'r'):
       
   617       caps = gst_caps_new_simple ("video/x-cirrus-logic-accupak", NULL);
   497       caps = gst_caps_new_simple ("video/x-cirrus-logic-accupak", NULL);
   618       if (codec_name)
   498       if (codec_name)
   619         *codec_name = g_strdup ("Cirrus Logipak AccuPak");
   499         *codec_name = g_strdup ("Cirrus Logipak AccuPak");
   620       break;
   500       break;
   621 
   501 
   625       if (codec_name)
   505       if (codec_name)
   626         *codec_name = g_strdup ("CYUV Lossless");
   506         *codec_name = g_strdup ("CYUV Lossless");
   627       break;
   507       break;
   628 
   508 
   629     case GST_MAKE_FOURCC ('D', 'U', 'C', 'K'):
   509     case GST_MAKE_FOURCC ('D', 'U', 'C', 'K'):
   630     case GST_MAKE_FOURCC ('P', 'V', 'E', 'Z'):
       
   631       caps = gst_caps_new_simple ("video/x-truemotion",
   510       caps = gst_caps_new_simple ("video/x-truemotion",
   632           "trueversion", G_TYPE_INT, 1, NULL);
   511           "trueversion", G_TYPE_INT, 1, NULL);
   633       if (codec_name)
   512       if (codec_name)
   634         *codec_name = g_strdup ("Duck Truemotion1");
   513         *codec_name = g_strdup ("Duck Truemotion1");
   635       break;
   514       break;
   725 
   604 
   726     case GST_MAKE_FOURCC ('d', 'r', 'a', 'c'):
   605     case GST_MAKE_FOURCC ('d', 'r', 'a', 'c'):
   727       caps = gst_caps_new_simple ("video/x-dirac", NULL);
   606       caps = gst_caps_new_simple ("video/x-dirac", NULL);
   728       if (codec_name)
   607       if (codec_name)
   729         *codec_name = g_strdup ("Dirac");
   608         *codec_name = g_strdup ("Dirac");
   730       break;
       
   731 
       
   732     case GST_RIFF_rpza:
       
   733     case GST_RIFF_azpr:
       
   734     case GST_MAKE_FOURCC ('R', 'P', 'Z', 'A'):
       
   735       caps = gst_caps_new_simple ("video/x-apple-video", NULL);
       
   736       if (codec_name)
       
   737         *codec_name = g_strdup ("Apple Video (RPZA)");
       
   738       break;
       
   739 
       
   740 
       
   741     case GST_MAKE_FOURCC ('F', 'F', 'V', '1'):
       
   742       caps = gst_caps_new_simple ("video/x-ffv",
       
   743           "ffvversion", G_TYPE_INT, 1, NULL);
       
   744       if (codec_name)
       
   745         *codec_name = g_strdup ("FFmpeg lossless video codec");
       
   746       break;
       
   747 
       
   748     case GST_MAKE_FOURCC ('K', 'M', 'V', 'C'):
       
   749       caps = gst_caps_new_simple ("video/x-kmvc", NULL);
       
   750       if (codec_name)
       
   751         *codec_name = g_strdup ("Karl Morton's video codec");
       
   752       break;
       
   753 
       
   754     case GST_MAKE_FOURCC ('v', 'p', '6', '0'):
       
   755     case GST_MAKE_FOURCC ('V', 'P', '6', '0'):
       
   756       caps = gst_caps_new_simple ("video/x-vp6", NULL);
       
   757       if (codec_name)
       
   758         *codec_name = g_strdup ("On2 VP6");
       
   759       break;
       
   760 
       
   761     case GST_MAKE_FOURCC ('L', 'M', '2', '0'):
       
   762       caps = gst_caps_new_simple ("video/x-mimic", NULL);
       
   763       if (codec_name)
       
   764         *codec_name = g_strdup ("Mimic webcam");
       
   765       break;
       
   766 
       
   767     case GST_MAKE_FOURCC ('T', 'H', 'E', 'O'):
       
   768     case GST_MAKE_FOURCC ('t', 'h', 'e', 'o'):
       
   769       caps = gst_caps_new_simple ("video/x-theora", NULL);
       
   770       if (codec_name)
       
   771         *codec_name = g_strdup ("Theora video codec");
       
   772 
       
   773       break;
       
   774 
       
   775     case GST_MAKE_FOURCC ('F', 'P', 'S', '1'):
       
   776       caps = gst_caps_new_simple ("video/x-fraps", NULL);
       
   777       if (codec_name)
       
   778         *codec_name = g_strdup ("Fraps video");
       
   779 
       
   780       break;
   609       break;
   781 
   610 
   782     default:
   611     default:
   783       GST_WARNING ("Unknown video fourcc %" GST_FOURCC_FORMAT,
   612       GST_WARNING ("Unknown video fourcc %" GST_FOURCC_FORMAT,
   784           GST_FOURCC_ARGS (codec_fcc));
   613           GST_FOURCC_ARGS (codec_fcc));
   803         "height", GST_TYPE_INT_RANGE, 16, 4096, NULL);
   632         "height", GST_TYPE_INT_RANGE, 16, 4096, NULL);
   804   }
   633   }
   805 
   634 
   806   /* extradata */
   635   /* extradata */
   807   if (strf_data || strd_data) {
   636   if (strf_data || strd_data) {
   808     GstBuffer *codec_data;
   637     gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER,
   809 
   638         strf_data ? strf_data : strd_data, NULL);
   810     codec_data = strf_data ? strf_data : strd_data;
       
   811 
       
   812     gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, codec_data, NULL);
       
   813   }
   639   }
   814 
   640 
   815   /* palette */
   641   /* palette */
   816   if (palette) {
   642   if (palette) {
   817     GstBuffer *copy;
   643     GstBuffer *copy;
  1034   gint rate_min = 1000, rate_max = 96000;
   860   gint rate_min = 1000, rate_max = 96000;
  1035   gint channels_max = 2;
   861   gint channels_max = 2;
  1036 
   862 
  1037   switch (codec_id) {
   863   switch (codec_id) {
  1038     case GST_RIFF_WAVE_FORMAT_PCM:     /* PCM */
   864     case GST_RIFF_WAVE_FORMAT_PCM:     /* PCM */
  1039       rate_max = 192000;
       
  1040       channels_max = 8;
   865       channels_max = 8;
  1041 
   866 
  1042       if (strf != NULL) {
   867       if (strf != NULL) {
  1043         gint ba = strf->blockalign;
   868         gint ba = strf->blockalign;
  1044         gint ch = strf->channels;
   869         gint ch = strf->channels;
  1100         *codec_name = g_strdup ("ADPCM audio");
   925         *codec_name = g_strdup ("ADPCM audio");
  1101       block_align = TRUE;
   926       block_align = TRUE;
  1102       break;
   927       break;
  1103 
   928 
  1104     case GST_RIFF_WAVE_FORMAT_IEEE_FLOAT:
   929     case GST_RIFF_WAVE_FORMAT_IEEE_FLOAT:
  1105       rate_max = 192000;
       
  1106       channels_max = 8;
   930       channels_max = 8;
  1107 
   931 
  1108       if (strf != NULL) {
   932       if (strf != NULL) {
  1109         gint ba = strf->blockalign;
   933         gint ba = strf->blockalign;
  1110         gint ch = strf->channels;
   934         gint ch = strf->channels;
  1143       if (strf != NULL) {
   967       if (strf != NULL) {
  1144         if (strf->size != 8) {
   968         if (strf->size != 8) {
  1145           GST_WARNING ("invalid depth (%d) of alaw audio, overwriting.",
   969           GST_WARNING ("invalid depth (%d) of alaw audio, overwriting.",
  1146               strf->size);
   970               strf->size);
  1147           strf->size = 8;
   971           strf->size = 8;
  1148           strf->blockalign = (strf->size * strf->channels) / 8;
   972           strf->av_bps = 8;
  1149           strf->av_bps = strf->blockalign * strf->rate;
   973           strf->blockalign = strf->av_bps * strf->channels;
  1150         }
   974         }
  1151         if (strf->av_bps == 0 || strf->blockalign == 0) {
   975         if (strf->av_bps == 0 || strf->blockalign == 0) {
  1152           GST_WARNING ("fixing av_bps (%d) and blockalign (%d) of alaw audio",
   976           GST_WARNING ("fixing av_bps (%d) and blockalign (%d) of alaw audio",
  1153               strf->av_bps, strf->blockalign);
   977               strf->av_bps, strf->blockalign);
  1154           strf->blockalign = (strf->size * strf->channels) / 8;
   978           strf->av_bps = strf->size;
  1155           strf->av_bps = strf->blockalign * strf->rate;
   979           strf->blockalign = strf->av_bps * strf->channels;
  1156         }
   980         }
  1157       }
   981       }
  1158       rate_max = 48000;
   982       rate_max = 48000;
  1159       caps = gst_caps_new_simple ("audio/x-alaw", NULL);
   983       caps = gst_caps_new_simple ("audio/x-alaw", NULL);
  1160       if (codec_name)
   984       if (codec_name)
  1181       if (strf != NULL) {
  1005       if (strf != NULL) {
  1182         if (strf->size != 8) {
  1006         if (strf->size != 8) {
  1183           GST_WARNING ("invalid depth (%d) of mulaw audio, overwriting.",
  1007           GST_WARNING ("invalid depth (%d) of mulaw audio, overwriting.",
  1184               strf->size);
  1008               strf->size);
  1185           strf->size = 8;
  1009           strf->size = 8;
  1186           strf->blockalign = (strf->size * strf->channels) / 8;
  1010           strf->av_bps = 8;
  1187           strf->av_bps = strf->blockalign * strf->rate;
  1011           strf->blockalign = strf->av_bps * strf->channels;
  1188         }
  1012         }
  1189         if (strf->av_bps == 0 || strf->blockalign == 0) {
  1013         if (strf->av_bps == 0 || strf->blockalign == 0) {
  1190           GST_WARNING ("fixing av_bps (%d) and blockalign (%d) of mulaw audio",
  1014           GST_WARNING ("fixing av_bps (%d) and blockalign (%d) of mulaw audio",
  1191               strf->av_bps, strf->blockalign);
  1015               strf->av_bps, strf->blockalign);
  1192           strf->blockalign = (strf->size * strf->channels) / 8;
  1016           strf->av_bps = strf->size;
  1193           strf->av_bps = strf->blockalign * strf->rate;
  1017           strf->blockalign = strf->av_bps * strf->channels;
  1194         }
  1018         }
  1195       }
  1019       }
  1196       rate_max = 48000;
  1020       rate_max = 48000;
  1197       caps = gst_caps_new_simple ("audio/x-mulaw", NULL);
  1021       caps = gst_caps_new_simple ("audio/x-mulaw", NULL);
  1198       if (codec_name)
  1022       if (codec_name)
  1209       if (codec_name)
  1033       if (codec_name)
  1210         *codec_name = g_strdup ("DVI ADPCM audio");
  1034         *codec_name = g_strdup ("DVI ADPCM audio");
  1211       block_align = TRUE;
  1035       block_align = TRUE;
  1212       break;
  1036       break;
  1213 
  1037 
  1214     case GST_RIFF_WAVE_FORMAT_DSP_TRUESPEECH:
       
  1215       rate_min = 8000;
       
  1216       rate_max = 8000;
       
  1217       caps = gst_caps_new_simple ("audio/x-truespeech", NULL);
       
  1218       if (codec_name)
       
  1219         *codec_name = g_strdup ("DSP Group TrueSpeech");
       
  1220       break;
       
  1221 
       
  1222     case GST_RIFF_WAVE_FORMAT_GSM610:
  1038     case GST_RIFF_WAVE_FORMAT_GSM610:
  1223     case GST_RIFF_WAVE_FORMAT_MSN:
  1039     case GST_RIFF_WAVE_FORMAT_MSN:
  1224       rate_min = 1;
       
  1225       caps = gst_caps_new_simple ("audio/ms-gsm", NULL);
  1040       caps = gst_caps_new_simple ("audio/ms-gsm", NULL);
  1226       if (codec_name)
  1041       if (codec_name)
  1227         *codec_name = g_strdup ("MS GSM audio");
  1042         *codec_name = g_strdup ("MS GSM audio");
  1228       break;
  1043       break;
  1229 
  1044 
  1241       rate_max = 48000;
  1056       rate_max = 48000;
  1242       caps = gst_caps_new_simple ("audio/mpeg",
  1057       caps = gst_caps_new_simple ("audio/mpeg",
  1243           "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, NULL);
  1058           "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, NULL);
  1244       if (codec_name)
  1059       if (codec_name)
  1245         *codec_name = g_strdup ("MPEG-1 layer 3");
  1060         *codec_name = g_strdup ("MPEG-1 layer 3");
  1246       break;
       
  1247 
       
  1248     case GST_RIFF_WAVE_FORMAT_AMR_NB:  /* amr-nb */
       
  1249       rate_min = 8000;
       
  1250       rate_max = 8000;
       
  1251       channels_max = 1;
       
  1252       caps = gst_caps_new_simple ("audio/AMR", NULL);
       
  1253       if (codec_name)
       
  1254         *codec_name = g_strdup ("AMR Narrow Band (NB)");
       
  1255       break;
       
  1256 
       
  1257     case GST_RIFF_WAVE_FORMAT_AMR_WB:  /* amr-wb */
       
  1258       rate_min = 16000;
       
  1259       rate_max = 16000;
       
  1260       channels_max = 1;
       
  1261       caps = gst_caps_new_simple ("audio/AMR-WB", NULL);
       
  1262       if (codec_name)
       
  1263         *codec_name = g_strdup ("AMR Wide Band (WB)");
       
  1264       break;
  1061       break;
  1265 
  1062 
  1266     case GST_RIFF_WAVE_FORMAT_VORBIS1: /* ogg/vorbis mode 1 */
  1063     case GST_RIFF_WAVE_FORMAT_VORBIS1: /* ogg/vorbis mode 1 */
  1267     case GST_RIFF_WAVE_FORMAT_VORBIS2: /* ogg/vorbis mode 2 */
  1064     case GST_RIFF_WAVE_FORMAT_VORBIS2: /* ogg/vorbis mode 2 */
  1268     case GST_RIFF_WAVE_FORMAT_VORBIS3: /* ogg/vorbis mode 3 */
  1065     case GST_RIFF_WAVE_FORMAT_VORBIS3: /* ogg/vorbis mode 3 */
  1269     case GST_RIFF_WAVE_FORMAT_VORBIS1PLUS:     /* ogg/vorbis mode 1+ */
  1066     case GST_RIFF_WAVE_FORMAT_VORBIS1PLUS:     /* ogg/vorbis mode 1+ */
  1270     case GST_RIFF_WAVE_FORMAT_VORBIS2PLUS:     /* ogg/vorbis mode 2+ */
  1067     case GST_RIFF_WAVE_FORMAT_VORBIS2PLUS:     /* ogg/vorbis mode 2+ */
  1271     case GST_RIFF_WAVE_FORMAT_VORBIS3PLUS:     /* ogg/vorbis mode 3+ */
  1068     case GST_RIFF_WAVE_FORMAT_VORBIS3PLUS:     /* ogg/vorbis mode 3+ */
  1272       rate_max = 192000;
       
  1273       caps = gst_caps_new_simple ("audio/x-vorbis", NULL);
  1069       caps = gst_caps_new_simple ("audio/x-vorbis", NULL);
  1274       if (codec_name)
  1070       if (codec_name)
  1275         *codec_name = g_strdup ("Vorbis");
  1071         *codec_name = g_strdup ("Vorbis");
  1276       break;
  1072       break;
  1277 
  1073 
  1288         *codec_name = g_strdup ("DTS audio");
  1084         *codec_name = g_strdup ("DTS audio");
  1289       /* wavparse is not always able to specify rate/channels for DTS-in-wav */
  1085       /* wavparse is not always able to specify rate/channels for DTS-in-wav */
  1290       rate_chan = FALSE;
  1086       rate_chan = FALSE;
  1291       break;
  1087       break;
  1292     case GST_RIFF_WAVE_FORMAT_AAC:
  1088     case GST_RIFF_WAVE_FORMAT_AAC:
  1293     case GST_RIFF_WAVE_FORMAT_AAC_AC:
       
  1294     case GST_RIFF_WAVE_FORMAT_AAC_pm:
       
  1295     {
  1089     {
  1296       channels_max = 8;
  1090       channels_max = 8;
  1297       caps = gst_caps_new_simple ("audio/mpeg",
  1091       caps = gst_caps_new_simple ("audio/mpeg",
  1298           "mpegversion", G_TYPE_INT, 4, NULL);
  1092           "mpegversion", G_TYPE_INT, 4, NULL);
  1299       if (codec_name)
  1093       if (codec_name)
  1301       break;
  1095       break;
  1302     }
  1096     }
  1303     case GST_RIFF_WAVE_FORMAT_WMAV1:
  1097     case GST_RIFF_WAVE_FORMAT_WMAV1:
  1304     case GST_RIFF_WAVE_FORMAT_WMAV2:
  1098     case GST_RIFF_WAVE_FORMAT_WMAV2:
  1305     case GST_RIFF_WAVE_FORMAT_WMAV3:
  1099     case GST_RIFF_WAVE_FORMAT_WMAV3:
  1306     case GST_RIFF_WAVE_FORMAT_WMAV3_L:
       
  1307     {
  1100     {
  1308       gint version = (codec_id - GST_RIFF_WAVE_FORMAT_WMAV1) + 1;
  1101       gint version = (codec_id - GST_RIFF_WAVE_FORMAT_WMAV1) + 1;
  1309 
  1102 
  1310       channels_max = 6;
  1103       channels_max = 6;
  1311       block_align = TRUE;
  1104       block_align = TRUE;
  1312 
  1105 
  1313       caps = gst_caps_new_simple ("audio/x-wma",
  1106       caps = gst_caps_new_simple ("audio/x-wma",
  1314           "wmaversion", G_TYPE_INT, version, NULL);
  1107           "wmaversion", G_TYPE_INT, version, NULL);
  1315 
  1108 
  1316       if (codec_name) {
  1109       if (codec_name)
  1317         if (codec_id == GST_RIFF_WAVE_FORMAT_WMAV3_L)
  1110         *codec_name = g_strdup_printf ("WMA Version %d", version + 6);
  1318           *codec_name = g_strdup ("WMA Lossless");
       
  1319         else
       
  1320           *codec_name = g_strdup_printf ("WMA Version %d", version + 6);
       
  1321       }
       
  1322 
  1111 
  1323       if (strf != NULL) {
  1112       if (strf != NULL) {
  1324         gst_caps_set_simple (caps,
  1113         gst_caps_set_simple (caps,
  1325             "bitrate", G_TYPE_INT, strf->av_bps * 8,
  1114             "bitrate", G_TYPE_INT, strf->av_bps * 8,
  1326             "depth", G_TYPE_INT, strf->size, NULL);
  1115             "depth", G_TYPE_INT, strf->size, NULL);
  1328         gst_caps_set_simple (caps,
  1117         gst_caps_set_simple (caps,
  1329             "bitrate", GST_TYPE_INT_RANGE, 0, G_MAXINT, NULL);
  1118             "bitrate", GST_TYPE_INT_RANGE, 0, G_MAXINT, NULL);
  1330       }
  1119       }
  1331       break;
  1120       break;
  1332     }
  1121     }
       
  1122     case GST_RIFF_WAVE_FORMAT_WMAV3_L:
       
  1123     {
       
  1124       /* WMA Version 9 Lossless */
       
  1125       goto unknown;
       
  1126     }
  1333     case GST_RIFF_WAVE_FORMAT_SONY_ATRAC3:
  1127     case GST_RIFF_WAVE_FORMAT_SONY_ATRAC3:
  1334       caps = gst_caps_new_simple ("audio/x-vnd.sony.atrac3", NULL);
  1128       caps = gst_caps_new_simple ("audio/x-vnd.sony.atrac3", NULL);
  1335       if (codec_name)
  1129       if (codec_name)
  1336         *codec_name = g_strdup ("Sony ATRAC3");
  1130         *codec_name = g_strdup ("Sony ATRAC3");
  1337       break;
  1131       break;
  1338 
  1132 
  1339     case GST_RIFF_WAVE_FORMAT_SIREN:
       
  1340       caps = gst_caps_new_simple ("audio/x-siren", NULL);
       
  1341       if (codec_name)
       
  1342         *codec_name = g_strdup ("Siren7");
       
  1343       rate_chan = FALSE;
       
  1344       break;
       
  1345 
       
  1346     case GST_RIFF_WAVE_FORMAT_ADPCM_IMA_DK4:
       
  1347       rate_min = 8000;
       
  1348       rate_max = 96000;
       
  1349       channels_max = 2;
       
  1350       caps =
       
  1351           gst_caps_new_simple ("audio/x-adpcm", "layout", G_TYPE_STRING, "dk4",
       
  1352           NULL);
       
  1353       if (codec_name)
       
  1354         *codec_name = g_strdup ("IMA/DK4 ADPCM");
       
  1355       break;
       
  1356     case GST_RIFF_WAVE_FORMAT_ADPCM_IMA_DK3:
       
  1357       rate_min = 8000;
       
  1358       rate_max = 96000;
       
  1359       channels_max = 2;
       
  1360       caps =
       
  1361           gst_caps_new_simple ("audio/x-adpcm", "layout", G_TYPE_STRING, "dk3",
       
  1362           NULL);
       
  1363       if (codec_name)
       
  1364         *codec_name = g_strdup ("IMA/DK3 ADPCM");
       
  1365       break;
       
  1366 
       
  1367     case GST_RIFF_WAVE_FORMAT_ADPCM_IMA_WAV:
       
  1368       rate_min = 8000;
       
  1369       rate_max = 96000;
       
  1370       channels_max = 2;
       
  1371       caps =
       
  1372           gst_caps_new_simple ("audio/x-adpcm", "layout", G_TYPE_STRING, "dvi",
       
  1373           NULL);
       
  1374       if (codec_name)
       
  1375         *codec_name = g_strdup ("IMA/WAV ADPCM");
       
  1376       break;
       
  1377     case GST_RIFF_WAVE_FORMAT_EXTENSIBLE:{
  1133     case GST_RIFF_WAVE_FORMAT_EXTENSIBLE:{
  1378       guint16 valid_bits_per_sample;
  1134       guint16 valid_bits_per_sample;
  1379       guint32 channel_mask;
  1135       guint32 channel_mask;
  1380       guint32 subformat_guid[4];
  1136       guint32 subformat_guid[4];
  1381       const guint8 *data;
  1137       const guint8 *data;
  1549         return NULL;
  1305         return NULL;
  1550       }
  1306       }
  1551       break;
  1307       break;
  1552     }
  1308     }
  1553       /* can anything decode these? pitfdll? */
  1309       /* can anything decode these? pitfdll? */
       
  1310     case GST_RIFF_WAVE_FORMAT_VOXWARE:
       
  1311     case GST_RIFF_WAVE_FORMAT_VOXWARE_BYTE_ALIGNED:
  1554     case GST_RIFF_WAVE_FORMAT_VOXWARE_AC8:
  1312     case GST_RIFF_WAVE_FORMAT_VOXWARE_AC8:
  1555     case GST_RIFF_WAVE_FORMAT_VOXWARE_AC10:
  1313     case GST_RIFF_WAVE_FORMAT_VOXWARE_AC10:
  1556     case GST_RIFF_WAVE_FORMAT_VOXWARE_AC16:
  1314     case GST_RIFF_WAVE_FORMAT_VOXWARE_AC16:
  1557     case GST_RIFF_WAVE_FORMAT_VOXWARE_AC20:
  1315     case GST_RIFF_WAVE_FORMAT_VOXWARE_AC20:
  1558     case GST_RIFF_WAVE_FORMAT_VOXWARE_METAVOICE:
  1316     case GST_RIFF_WAVE_FORMAT_VOXWARE_METAVOICE:
  1589       gst_caps_set_simple (caps,
  1347       gst_caps_set_simple (caps,
  1590           "block_align", G_TYPE_INT, strf->blockalign, NULL);
  1348           "block_align", G_TYPE_INT, strf->blockalign, NULL);
  1591     }
  1349     }
  1592   } else {
  1350   } else {
  1593     if (rate_chan) {
  1351     if (rate_chan) {
  1594       if (rate_min == rate_max)
  1352       gst_caps_set_simple (caps,
  1595         gst_caps_set_simple (caps, "rate", G_TYPE_INT, rate_min, NULL);
  1353           "rate", GST_TYPE_INT_RANGE, rate_min, rate_max,
  1596       else
  1354           "channels", GST_TYPE_INT_RANGE, 1, channels_max, NULL);
  1597         gst_caps_set_simple (caps,
       
  1598             "rate", GST_TYPE_INT_RANGE, rate_min, rate_max, NULL);
       
  1599       if (channels_max == 1)
       
  1600         gst_caps_set_simple (caps, "channels", G_TYPE_INT, 1, NULL);
       
  1601       else
       
  1602         gst_caps_set_simple (caps,
       
  1603             "channels", GST_TYPE_INT_RANGE, 1, channels_max, NULL);
       
  1604     }
  1355     }
  1605     if (block_align) {
  1356     if (block_align) {
  1606       gst_caps_set_simple (caps,
  1357       gst_caps_set_simple (caps,
  1607           "block_align", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
  1358           "block_align", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
  1608     }
  1359     }
  1681     GST_MAKE_FOURCC ('D', 'I', 'B', ' '),
  1432     GST_MAKE_FOURCC ('D', 'I', 'B', ' '),
  1682     GST_MAKE_FOURCC ('D', 'I', 'V', '3'),
  1433     GST_MAKE_FOURCC ('D', 'I', 'V', '3'),
  1683     GST_MAKE_FOURCC ('D', 'I', 'V', 'X'),
  1434     GST_MAKE_FOURCC ('D', 'I', 'V', 'X'),
  1684     GST_MAKE_FOURCC ('D', 'U', 'C', 'K'),
  1435     GST_MAKE_FOURCC ('D', 'U', 'C', 'K'),
  1685     GST_MAKE_FOURCC ('D', 'V', 'S', 'D'),
  1436     GST_MAKE_FOURCC ('D', 'V', 'S', 'D'),
  1686     GST_MAKE_FOURCC ('D', 'V', '5', '0'),
       
  1687     GST_MAKE_FOURCC ('D', 'X', '5', '0'),
  1437     GST_MAKE_FOURCC ('D', 'X', '5', '0'),
  1688     GST_MAKE_FOURCC ('M', '4', 'C', 'C'),
       
  1689     GST_MAKE_FOURCC ('F', 'L', 'V', '1'),
  1438     GST_MAKE_FOURCC ('F', 'L', 'V', '1'),
  1690     GST_MAKE_FOURCC ('H', '2', '6', '3'),
  1439     GST_MAKE_FOURCC ('H', '2', '6', '3'),
  1691     GST_MAKE_FOURCC ('V', 'X', '1', 'K'),
       
  1692     GST_MAKE_FOURCC ('H', '2', '6', '4'),
  1440     GST_MAKE_FOURCC ('H', '2', '6', '4'),
  1693     GST_MAKE_FOURCC ('H', 'F', 'Y', 'U'),
  1441     GST_MAKE_FOURCC ('H', 'F', 'Y', 'U'),
  1694     GST_MAKE_FOURCC ('I', '2', '6', '3'),
  1442     GST_MAKE_FOURCC ('I', '2', '6', '3'),
  1695     GST_MAKE_FOURCC ('I', '4', '2', '0'),
  1443     GST_MAKE_FOURCC ('I', '4', '2', '0'),
  1696     GST_MAKE_FOURCC ('I', 'V', '3', '2'),
  1444     GST_MAKE_FOURCC ('I', 'V', '3', '2'),
  1697     GST_MAKE_FOURCC ('I', 'V', '4', '1'),
  1445     GST_MAKE_FOURCC ('I', 'V', '4', '1'),
  1698     GST_MAKE_FOURCC ('I', 'V', '5', '0'),
  1446     GST_MAKE_FOURCC ('I', 'V', '5', '0'),
  1699     GST_MAKE_FOURCC ('L', '2', '6', '3'),
  1447     GST_MAKE_FOURCC ('L', '2', '6', '3'),
  1700     GST_MAKE_FOURCC ('L', '2', '6', '4'),
       
  1701     GST_MAKE_FOURCC ('M', '2', '6', '3'),
  1448     GST_MAKE_FOURCC ('M', '2', '6', '3'),
  1702     GST_MAKE_FOURCC ('M', '4', 'S', '2'),
  1449     GST_MAKE_FOURCC ('M', '4', 'S', '2'),
  1703     GST_MAKE_FOURCC ('M', 'J', 'P', 'G'),
  1450     GST_MAKE_FOURCC ('M', 'J', 'P', 'G'),
  1704     GST_MAKE_FOURCC ('M', 'P', '4', '2'),
  1451     GST_MAKE_FOURCC ('M', 'P', '4', '2'),
  1705     GST_MAKE_FOURCC ('M', 'P', '4', '3'),
  1452     GST_MAKE_FOURCC ('M', 'P', '4', '3'),
  1712     GST_MAKE_FOURCC ('R', 'T', '2', '1'),
  1459     GST_MAKE_FOURCC ('R', 'T', '2', '1'),
  1713     GST_MAKE_FOURCC ('S', 'P', '5', '3'),
  1460     GST_MAKE_FOURCC ('S', 'P', '5', '3'),
  1714     GST_MAKE_FOURCC ('T', 'M', '2', '0'),
  1461     GST_MAKE_FOURCC ('T', 'M', '2', '0'),
  1715     GST_MAKE_FOURCC ('T', 'S', 'C', 'C'),
  1462     GST_MAKE_FOURCC ('T', 'S', 'C', 'C'),
  1716     GST_MAKE_FOURCC ('U', 'L', 'T', 'I'),
  1463     GST_MAKE_FOURCC ('U', 'L', 'T', 'I'),
  1717     GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'),
       
  1718     GST_MAKE_FOURCC ('V', 'C', 'R', '1'),
  1464     GST_MAKE_FOURCC ('V', 'C', 'R', '1'),
  1719     GST_MAKE_FOURCC ('V', 'C', 'R', '2'),
  1465     GST_MAKE_FOURCC ('V', 'C', 'R', '2'),
  1720     GST_MAKE_FOURCC ('V', 'D', 'O', 'W'),
  1466     GST_MAKE_FOURCC ('V', 'D', 'O', 'W'),
  1721     GST_MAKE_FOURCC ('V', 'I', 'V', 'O'),
  1467     GST_MAKE_FOURCC ('V', 'I', 'V', 'O'),
  1722     GST_MAKE_FOURCC ('V', 'M', 'n', 'c'),
  1468     GST_MAKE_FOURCC ('V', 'M', 'n', 'c'),
  1732     GST_MAKE_FOURCC ('Z', 'L', 'I', 'B'),
  1478     GST_MAKE_FOURCC ('Z', 'L', 'I', 'B'),
  1733     GST_MAKE_FOURCC ('c', 'v', 'i', 'd'),
  1479     GST_MAKE_FOURCC ('c', 'v', 'i', 'd'),
  1734     GST_MAKE_FOURCC ('h', '2', '6', '4'),
  1480     GST_MAKE_FOURCC ('h', '2', '6', '4'),
  1735     GST_MAKE_FOURCC ('m', 's', 'v', 'c'),
  1481     GST_MAKE_FOURCC ('m', 's', 'v', 'c'),
  1736     GST_MAKE_FOURCC ('x', '2', '6', '3'),
  1482     GST_MAKE_FOURCC ('x', '2', '6', '3'),
  1737     GST_MAKE_FOURCC ('d', 'r', 'a', 'c'),
  1483     GST_MAKE_FOURCC ('d', 'r', 'a', 'c')
  1738     GST_MAKE_FOURCC ('F', 'F', 'V', '1'),
  1484         /* FILL ME */
  1739     GST_MAKE_FOURCC ('K', 'M', 'V', 'C'),
       
  1740     GST_MAKE_FOURCC ('V', 'P', '6', '0'),
       
  1741     GST_MAKE_FOURCC ('L', 'M', '2', '0'),
       
  1742     GST_MAKE_FOURCC ('R', 'P', 'Z', 'A'),
       
  1743     GST_MAKE_FOURCC ('T', 'H', 'E', 'O'),
       
  1744     GST_MAKE_FOURCC ('F', 'P', 'S', '1'),
       
  1745     /* FILL ME */
       
  1746   };
  1485   };
  1747   guint i;
  1486   guint i;
  1748   GstCaps *caps, *one;
  1487   GstCaps *caps, *one;
  1749 
  1488 
  1750   caps = gst_caps_new_empty ();
  1489   caps = gst_caps_new_empty ();
  1776     GST_RIFF_WAVE_FORMAT_ALAW,
  1515     GST_RIFF_WAVE_FORMAT_ALAW,
  1777     GST_RIFF_WAVE_FORMAT_MULAW,
  1516     GST_RIFF_WAVE_FORMAT_MULAW,
  1778     GST_RIFF_WAVE_FORMAT_WMS,
  1517     GST_RIFF_WAVE_FORMAT_WMS,
  1779     GST_RIFF_WAVE_FORMAT_ADPCM,
  1518     GST_RIFF_WAVE_FORMAT_ADPCM,
  1780     GST_RIFF_WAVE_FORMAT_DVI_ADPCM,
  1519     GST_RIFF_WAVE_FORMAT_DVI_ADPCM,
  1781     GST_RIFF_WAVE_FORMAT_DSP_TRUESPEECH,
       
  1782     GST_RIFF_WAVE_FORMAT_WMAV1,
  1520     GST_RIFF_WAVE_FORMAT_WMAV1,
  1783     GST_RIFF_WAVE_FORMAT_WMAV2,
  1521     GST_RIFF_WAVE_FORMAT_WMAV2,
  1784     GST_RIFF_WAVE_FORMAT_WMAV3,
  1522     GST_RIFF_WAVE_FORMAT_WMAV3,
  1785     GST_RIFF_WAVE_FORMAT_SONY_ATRAC3,
  1523     GST_RIFF_WAVE_FORMAT_SONY_ATRAC3,
  1786     GST_RIFF_WAVE_FORMAT_IEEE_FLOAT,
  1524     GST_RIFF_WAVE_FORMAT_IEEE_FLOAT,
  1787     GST_RIFF_WAVE_FORMAT_VOXWARE_METASOUND,
  1525     GST_RIFF_WAVE_FORMAT_VOXWARE
  1788     GST_RIFF_WAVE_FORMAT_ADPCM_IMA_DK4,
  1526         /* FILL ME */
  1789     GST_RIFF_WAVE_FORMAT_ADPCM_IMA_DK3,
       
  1790     GST_RIFF_WAVE_FORMAT_ADPCM_IMA_WAV,
       
  1791     GST_RIFF_WAVE_FORMAT_AMR_NB,
       
  1792     GST_RIFF_WAVE_FORMAT_AMR_WB,
       
  1793     GST_RIFF_WAVE_FORMAT_SIREN,
       
  1794     /* FILL ME */
       
  1795   };
  1527   };
  1796   guint i;
  1528   guint i;
  1797   GstCaps *caps, *one;
  1529   GstCaps *caps, *one;
  1798 
  1530 
  1799   caps = gst_caps_new_empty ();
  1531   caps = gst_caps_new_empty ();