support various audio/video caps. 09/26709/1
authorKitae Kim <kt920.kim@samsung.com>
Thu, 21 Aug 2014 09:44:36 +0000 (18:44 +0900)
committerKitae Kim <kt920.kim@samsung.com>
Thu, 28 Aug 2014 06:05:40 +0000 (15:05 +0900)
Change-Id: If383c7607d713155697164a6091d1f26fe6bb1ac
Signed-off-by: Kitae Kim <kt920.kim@samsung.com>
src/gstmaru.c
src/gstmarumem.c
src/gstmaruutils.c

index ff5c52d..f507482 100644 (file)
@@ -176,7 +176,7 @@ GST_PLUGIN_DEFINE (
   "tizen-emul",
   "Codecs for Tizen Emulator",
   plugin_init,
-  "0.2.11",
+  "0.3.0",
   "LGPL",
   "gst-plugins-emulator",
   "http://www.tizen.org"
index 70449fc..9b91e85 100644 (file)
@@ -99,7 +99,6 @@ codec_init_data_from (CodecContext *ctx, int media_type, gpointer buffer)
     }
   }
 
-#if 1
   memcpy(&ctx->codecdata_size, buffer + size, sizeof(ctx->codecdata_size));
   size += sizeof(ctx->codecdata_size);
 
@@ -108,7 +107,6 @@ codec_init_data_from (CodecContext *ctx, int media_type, gpointer buffer)
     ctx->codecdata = g_malloc(ctx->codecdata_size);
     memcpy(ctx->codecdata, buffer + size, ctx->codecdata_size);
   }
-#endif
 
   return ret;
 }
index 8e6b435..1680d1a 100644 (file)
@@ -482,27 +482,6 @@ gst_maru_caps_with_codecname (const char *name, int media_type,
     } else if (!strcmp (mime, "video/mpeg")) {
       ctx->codec_tag = GST_MAKE_FOURCC ('m', 'p', '4', 'v');
     }
-#if 0
-  } else if (strcmp (name, "h263p") == 0) {
-    gboolean val;
-
-    if (!gst_structure_get_boolean (structure, "annex-f", &val) || val) {
-      ctx->flags |= CODEC_FLAG_4MV;
-    } else {
-      ctx->flags &= ~CODEC_FLAG_4MV;
-    }
-    if ((!gst_structure_get_boolean (structure, "annex-i", &val) || val) &&
-      (!gst_structure_get_boolean (structure, "annex-t", &val) || val)) {
-      ctx->flags |= CODEC_FLAG_AC_PRED;
-    } else {
-      ctx->flags &= ~CODEC_FLAG_AC_PRED;
-    }
-    if ((!gst_structure_get_boolean (structure, "annex-j", &val) || val)) {
-      ctx->flags |= CODEC_FLAG_LOOP_FILTER;
-    } else {
-      ctx->flags &= ~CODEC_FLAG_LOOP_FILTER;
-    }
-#endif
   } else {
     // TODO
   }
@@ -514,7 +493,7 @@ gst_maru_caps_with_codecname (const char *name, int media_type,
   switch (media_type) {
   case AVMEDIA_TYPE_VIDEO:
     gst_maru_caps_to_pixfmt (caps, ctx, FALSE);
-  // get_palette
+    // get_palette
     break;
   case AVMEDIA_TYPE_AUDIO:
     gst_maru_caps_to_smpfmt (caps, ctx, FALSE);
@@ -524,6 +503,8 @@ gst_maru_caps_with_codecname (const char *name, int media_type,
   }
 }
 
+#define CODEC_NAME_BUFFER_SIZE 32
+
 void
 gst_maru_caps_to_codecname (const GstCaps *caps,
                             gchar *codec_name,
@@ -531,42 +512,144 @@ gst_maru_caps_to_codecname (const GstCaps *caps,
 {
   const gchar *mimetype;
   const GstStructure *str;
+  int media_type;
 
   str = gst_caps_get_structure (caps, 0);
 
   mimetype = gst_structure_get_name (str);
 
-  if (!strcmp (mimetype, "video/x-wmv")) {
+  if (!strcmp (mimetype, "video/x-h263")) {
+    const gchar *h263version = gst_structure_get_string (str, "h263version");
+    if (h263version && !strcmp (h263version, "h263p")) {
+      g_strlcpy (codec_name, "h263p", CODEC_NAME_BUFFER_SIZE);
+    } else {
+      g_strlcpy (codec_name, "h263", CODEC_NAME_BUFFER_SIZE);
+    }
+    media_type = AVMEDIA_TYPE_VIDEO;
+  } else if (!strcmp (mimetype, "video/mpeg")) {
+    gboolean sys_strm;
+    gint mpegversion;
+
+    if (gst_structure_get_boolean (str, "systemstream", &sys_strm) &&
+        gst_structure_get_int (str, "mpegversion", &mpegversion) &&
+        !sys_strm) {
+      switch (mpegversion) {
+        case 1:
+          g_strlcpy (codec_name, "mpeg1video", CODEC_NAME_BUFFER_SIZE);
+          break;
+        case 2:
+          g_strlcpy (codec_name, "mpeg2video", CODEC_NAME_BUFFER_SIZE);
+          break;
+        case 4:
+          g_strlcpy (codec_name, "mpeg4", CODEC_NAME_BUFFER_SIZE);
+          break;
+      }
+    }
+
+    media_type = AVMEDIA_TYPE_VIDEO;
+  } else if (!strcmp (mimetype, "video/x-wmv")) {
     gint wmvversion = 0;
 
     if (gst_structure_get_int (str, "wmvversion", &wmvversion)) {
       switch (wmvversion) {
         case 1:
-          g_strlcpy(codec_name, "wmv1", 32);
+          g_strlcpy (codec_name, "wmv1", CODEC_NAME_BUFFER_SIZE);
           break;
         case 2:
-          g_strlcpy(codec_name, "wmv2", 32);
+          g_strlcpy (codec_name, "wmv2", CODEC_NAME_BUFFER_SIZE);
           break;
         case 3:
         {
           guint32 fourcc;
 
-          g_strlcpy(codec_name, "wmv3", 32);
-
+          g_strlcpy (codec_name, "wmv3", CODEC_NAME_BUFFER_SIZE);
           if (gst_structure_get_fourcc (str, "format", &fourcc)) {
             if ((fourcc == GST_MAKE_FOURCC ('W', 'V', 'C', '1')) ||
                 (fourcc == GST_MAKE_FOURCC ('W', 'M', 'V', 'A'))) {
-              g_strlcpy(codec_name, "vc1", 32);
+              g_strlcpy (codec_name, "vc1", CODEC_NAME_BUFFER_SIZE);
             }
           }
         }
           break;
       }
     }
+
+    media_type = AVMEDIA_TYPE_VIDEO;
+  } else if (!strcmp (mimetype, "audio/mpeg")) {
+    gint layer = 0;
+    gint mpegversion = 0;
+
+    if (gst_structure_get_int (str, "mpegversion", &mpegversion)) {
+      switch (mpegversion) {
+      case 2:
+      case 4:
+        g_strlcpy (codec_name, "aac", CODEC_NAME_BUFFER_SIZE);
+        break;
+      case 1:
+        if (gst_structure_get_int (str, "layer", &layer)) {
+          switch(layer) {
+            case 1:
+              g_strlcpy (codec_name, "mp1", CODEC_NAME_BUFFER_SIZE);
+              break;
+            case 2:
+              g_strlcpy (codec_name, "mp2", CODEC_NAME_BUFFER_SIZE);
+              break;
+            case 3:
+              g_strlcpy (codec_name, "mp3", CODEC_NAME_BUFFER_SIZE);
+              break;
+          }
+        }
+        break;
+      }
+    }
+
+    media_type = AVMEDIA_TYPE_AUDIO;
+  } else if (!strcmp (mimetype, "audio/x-wma")) {
+    gint wmaversion = 0;
+
+    if (gst_structure_get_int (str, "wmaversion", &wmaversion)) {
+      switch (wmaversion) {
+      case 1:
+        g_strlcpy (codec_name, "wmav1", CODEC_NAME_BUFFER_SIZE);
+        break;
+      case 2:
+        g_strlcpy (codec_name, "wmav2", CODEC_NAME_BUFFER_SIZE);
+        break;
+      case 3:
+        g_strlcpy (codec_name, "wmapro", CODEC_NAME_BUFFER_SIZE);
+        break;
+      }
+    }
+
+    media_type = AVMEDIA_TYPE_AUDIO;
+  } else if (!strcmp (mimetype, "audio/x-ac3")) {
+    g_strlcpy (codec_name, "ac3", CODEC_NAME_BUFFER_SIZE);
+    media_type = AVMEDIA_TYPE_AUDIO;
+  } else if (!strcmp (mimetype, "audio/x-msmpeg")) {
+    gint msmpegversion = 0;
+
+    if (gst_structure_get_int (str, "msmpegversion", &msmpegversion)) {
+      switch (msmpegversion) {
+      case 41:
+        g_strlcpy (codec_name, "msmpeg4v1", CODEC_NAME_BUFFER_SIZE);
+        break;
+      case 42:
+        g_strlcpy (codec_name, "msmpeg4v2", CODEC_NAME_BUFFER_SIZE);
+        break;
+      case 43:
+        g_strlcpy (codec_name, "msmpeg4", CODEC_NAME_BUFFER_SIZE);
+        break;
+      }
+    }
+
+    media_type = AVMEDIA_TYPE_VIDEO;
+  } else if (!strcmp (mimetype, "video/x-h264")) {
+    g_strlcpy (codec_name, "h264", CODEC_NAME_BUFFER_SIZE);
+    media_type = AVMEDIA_TYPE_VIDEO;
   }
 
-#if 0
   if (context != NULL) {
+#if 0
     if (video == TRUE) {
       context->codec_type = CODEC_TYPE_VIDEO;
     } else if (audio == TRUE) {
@@ -574,10 +657,9 @@ gst_maru_caps_to_codecname (const GstCaps *caps,
     } else {
       context->codec_type = CODEC_TYPE_UNKNOWN;
     }
-    context->codec_id = id;
-    gst_maru_caps_with_codecname (name, context->codec_type, caps, context);
-  }
 #endif
+    gst_maru_caps_with_codecname (codec_name, media_type, caps, context);
+  }
 
   if (codec_name != NULL) {
     GST_DEBUG ("The %s belongs to the caps %" GST_PTR_FORMAT, codec_name, caps);
@@ -988,21 +1070,31 @@ gst_maru_codecname_to_caps (const char *name, CodecContext *ctx, gboolean encode
         NULL);
     }
 #endif
+  } else if (strcmp (name, "mpeg2video") == 0) {
+    if (encode) {
+      caps = gst_maru_video_caps_new (ctx, name, "video/mpeg",
+            "mpegversion", G_TYPE_INT, 2,
+            "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
+    } else {
+      caps = gst_caps_new_simple ("video/mpeg",
+            "mpegversion", GST_TYPE_INT_RANGE, 1, 2,
+            "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
+    }
   } else if (strcmp (name, "mpeg4") == 0) {
     if (encode && ctx != NULL) {
       // TODO
-    switch (ctx->codec_tag) {
-    case GST_MAKE_FOURCC ('D', 'I', 'V', 'X'):
-      caps = gst_maru_video_caps_new (ctx, name, "video/x-divx",
-        "divxversion", G_TYPE_INT, 5, NULL);
-      break;
-    case GST_MAKE_FOURCC ('m', 'p', '4', 'v'):
-    default:
-      caps = gst_maru_video_caps_new (ctx, name, "video/mpeg",
-        "systemstream", G_TYPE_BOOLEAN, FALSE,
-        "mpegversion", G_TYPE_INT, 4, NULL);
-      break;
-    }
+      switch (ctx->codec_tag) {
+        case GST_MAKE_FOURCC ('D', 'I', 'V', 'X'):
+          caps = gst_maru_video_caps_new (ctx, name, "video/x-divx",
+              "divxversion", G_TYPE_INT, 5, NULL);
+          break;
+        case GST_MAKE_FOURCC ('m', 'p', '4', 'v'):
+        default:
+          caps = gst_maru_video_caps_new (ctx, name, "video/mpeg",
+              "systemstream", G_TYPE_BOOLEAN, FALSE,
+              "mpegversion", G_TYPE_INT, 4, NULL);
+          break;
+      }
     } else {
       caps = gst_maru_video_caps_new (ctx, name, "video/mpeg",
             "mpegversion", G_TYPE_INT, 4,