Add new util function to get video caps
[platform/core/multimedia/libmm-camcorder.git] / src / mm_camcorder_util.c
index b7c8852..af640a1 100644 (file)
@@ -1890,6 +1890,94 @@ gboolean _mmcamcorder_link_elements(GList *element_list)
        return TRUE;
 }
 
+GstCaps *_mmcamcorder_get_video_caps(MMHandleType handle, MMPixelFormatType format, int width, int height, int fps, int rotate)
+{
+       int codec_type = MM_IMAGE_CODEC_JPEG;
+       guint32 fourcc = 0;
+       char fourcc_string[sizeof(guint32) + 1];
+#ifdef _MMCAMCORDER_PRODUCT_TV
+       int maxwidth = 0;
+       int maxheight = 0;
+       int display_surface_type = MM_DISPLAY_SURFACE_NULL;
+#endif /* _MMCAMCORDER_PRODUCT_TV */
+       gchar *caps_string = NULL;
+       GstCaps *caps = NULL;;
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+
+       switch (format) {
+       case MM_PIXEL_FORMAT_ENCODED_H264:
+#ifdef _MMCAMCORDER_PRODUCT_TV
+               mm_camcorder_get_attributes(handle, NULL,
+                       MMCAM_DISPLAY_SURFACE, &display_surface_type,
+                       NULL);
+               if (display_surface_type != MM_DISPLAY_SURFACE_NULL &&
+                       __mmcamcorder_find_max_resolution(handle, &maxwidth, &maxheight) == false) {
+                       MMCAM_LOG_ERROR("can not find max resolution limitation");
+                       return false;
+               } else if (display_surface_type == MM_DISPLAY_SURFACE_NULL) {
+                       maxwidth = width;
+                       maxheight = height;
+               }
+#endif /* _MMCAMCORDER_PRODUCT_TV */
+               caps = gst_caps_new_simple("video/x-h264",
+                       "stream-format", G_TYPE_STRING, "byte-stream",
+#ifdef _MMCAMCORDER_PRODUCT_TV
+                       "maxwidth", G_TYPE_INT, maxwidth,
+                       "maxheight", G_TYPE_INT, maxheight,
+                       "alignment", G_TYPE_STRING, "au",
+#endif /* _MMCAMCORDER_PRODUCT_TV */
+                       NULL);
+               break;
+       case MM_PIXEL_FORMAT_ENCODED_MJPEG:
+#ifdef _MMCAMCORDER_PRODUCT_TV
+               caps = gst_caps_new_empty_simple("video/x-jpeg");
+#else
+               caps = gst_caps_new_empty_simple("image/jpeg");
+#endif
+               break;
+       case MM_PIXEL_FORMAT_ENCODED_VP8:
+               caps = gst_caps_new_empty_simple("video/x-vp8");
+               break;
+       case MM_PIXEL_FORMAT_ENCODED_VP9:
+               caps = gst_caps_new_empty_simple("video/x-vp9");
+               break;
+       default:
+               mm_camcorder_get_attributes(handle, NULL,
+                       MMCAM_IMAGE_ENCODER, &codec_type,
+                       NULL);
+
+               fourcc = (guint32)_mmcamcorder_get_fourcc(format, codec_type, hcamcorder->use_zero_copy_format);
+               snprintf(fourcc_string, sizeof(fourcc_string), "%"GST_FOURCC_FORMAT, GST_FOURCC_ARGS(fourcc));
+               caps = gst_caps_new_simple("video/x-raw",
+                       "format", G_TYPE_STRING, fourcc_string,
+                       NULL);
+               break;
+       }
+
+       gst_caps_set_simple(caps,
+               "width", G_TYPE_INT, width,
+               "height", G_TYPE_INT, height,
+               NULL);
+
+       if (fps > 0) {
+               gst_caps_set_simple(caps,
+                       "framerate", GST_TYPE_FRACTION, fps, 1,
+                       NULL);
+       }
+
+       if (rotate >= 0) {
+               gst_caps_set_simple(caps,
+                       "rotate", G_TYPE_INT, rotate,
+                       NULL);
+       }
+
+       caps_string = gst_caps_to_string(caps);
+       MMCAM_LOG_INFO("caps[%s]", caps_string);
+       g_free(caps_string);
+
+       return caps;
+}
+
 gboolean _mmcamcorder_resize_frame(unsigned char *src_data, unsigned int src_width, unsigned int src_height, unsigned int src_length, int src_format,
        unsigned char **dst_data, unsigned int *dst_width, unsigned int *dst_height, size_t *dst_length)
 {