MMFMWK-8088 Enalbe grecorder in imx8mm
1. update video source and sink to autovideo source/sink
2. Added VP8 encoding format
3. change audio recoder to mp1 layer2 to use opensource encoder
4. Remove videodetect with compiling macro
5. update grecorder command option
Signed-off-by: Jian Li <jian.li@nxp.com>
diff --git a/tools/grecorder/grecorder.c b/tools/grecorder/grecorder.c
index bb334ae..a79c9a8 100644
--- a/tools/grecorder/grecorder.c
+++ b/tools/grecorder/grecorder.c
@@ -303,7 +303,9 @@
/* Video time stamp and video effect */
recorder->add_time_stamp ((RecorderEngineHandle)recorder, pOpt->add_time_stamp);
recorder->add_video_effect ((RecorderEngineHandle)recorder, pOpt->video_effect);
+#ifdef SUPPORT_VIDEO_DETECT
recorder->add_video_detect ((RecorderEngineHandle)recorder, pOpt->video_detect);
+#endif
/* Audio encoder interface */
{
@@ -601,7 +603,7 @@
{"audio input: 0->default(mic), 1->mic, 2->audiotestsrc"},
{"audio sample rate"},
{"audio channel"},
- {"video input: 0->default(camera), 1->camera, 2->screen, 3->videotestsrc"},
+ {"video input: 0->default(camera), 1->camera, 2->videotestsrc"},
{"camera id: 0->/dev/video0, 1->/dev/video1"},
{"camera output video format: 0->default(I420), 1->I420, 2->NV12, 3->YUYV, 4->UYVY"},
{"camera output video width"},
@@ -609,7 +611,9 @@
{"camera output video FPS"},
{"add date/time onto video"},
{"video effect: 0->default(no effect),1:cube,2:mirror,3:squeeze,4:fisheye,5:gray,6:tunnel,7:twirl"},
+#ifdef SUPPORT_VIDEO_DETECT
{"video detect: 0->default(no detect),1:face detect,2:faceblur"},
+#endif
{"preview video left"},
{"preview video top"},
{"preview video width"},
@@ -618,9 +622,9 @@
{"need preview buffer"},
{"audio encoder type: 0->default(MP3), 1->MP3"},
{"audio encoder bitrate(kbps)"},
- {"video encoder type: 0->default(H264), 1->H264, 2->MPEG4, 3->H263, 4->MPEG"},
+ {"video encoder type: 0->default(H264), 1->H264, 2->MPEG4, 3->H263, 4->MPEG, 5->VP8"},
{"video encoder bitrate(kbps)"},
- {"media container format: 0->default(MOV), 1->MOV, 2->MKV, 3->AVI, 4->FLV, 5->TS"},
+ {"media container format: 0->default(MP4), 1->MP4, 2->MKV, 3->AVI, 4->FLV, 5->TS"},
{"output path"},
{"RTP streaming host IP address"},
{"RTP streaming port"},
@@ -645,7 +649,9 @@
{"fps", required_argument, 0, 'f'},
{"date_time", no_argument, &add_time_stamp, 1},
{"video_effect", required_argument, 0, 'q'},
+#ifdef SUPPORT_VIDEO_DETECT
{"video_detect", required_argument, 0, 'x'},
+#endif
{"preview_left", required_argument, 0, 'l'},
{"preview_top", required_argument, 0, 't'},
{"preview_width", required_argument, 0, 'b'},
@@ -667,7 +673,7 @@
{0, 0, 0, 0}
};
- c = getopt_long (argc, argv, "abcdefg",
+ c = getopt_long (argc, argv, "a:s:w:e:u:f:k:t:q:i:v:n:z:o:r:x",
long_options, &option_index);
/* Detect the end of the options. */
@@ -806,6 +812,11 @@
act.sa_flags = 0;
sigaction(SIGINT, &act, NULL);
+ if (argc < 2) {
+ g_print ("Use -h to get usage help.\n");
+ return 0;
+ }
+
memset(&options, 0, sizeof(REOptions));
if (recorder_parse_options(argc,argv,&options)){
LOG_ERROR ("recorder_parse_options fail.\n");
diff --git a/tools/grecorder/recorder_engine.c b/tools/grecorder/recorder_engine.c
index 549b7f0..3dbd17f 100644
--- a/tools/grecorder/recorder_engine.c
+++ b/tools/grecorder/recorder_engine.c
@@ -35,6 +35,7 @@
#include <gst/pbutils/encoding-profile.h>
#include <gst/pbutils/encoding-target.h>
#include "recorder_engine.h"
+#include "gstimxcommon.h"
/*
* debug logging
*/
@@ -328,6 +329,16 @@
gst_encoding_container_profile_add_profile (container, sprof);
gst_caps_unref (caps);
break;
+ case RE_VIDEO_ENCODER_VP8:
+ caps = gst_caps_new_simple ("video/x-vp8", NULL);
+ sprof = (GstEncodingProfile *)
+ gst_encoding_video_profile_new (caps, NULL, NULL, 1);
+ //FIXME: videorate has issue.
+ gst_encoding_video_profile_set_variableframerate ((GstEncodingVideoProfile
+ *) sprof, TRUE);
+ gst_encoding_container_profile_add_profile (container, sprof);
+ gst_caps_unref (caps);
+ break;
default:
break;
}
@@ -336,7 +347,7 @@
case RE_AUDIO_ENCODER_DEFAULT:
case RE_AUDIO_ENCODER_MP3:
caps = gst_caps_new_simple ("audio/mpeg",
- "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, NULL);
+ "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 2, NULL);
gst_encoding_container_profile_add_profile (container, (GstEncodingProfile *)
gst_encoding_audio_profile_new (caps, NULL, NULL, 1));
gst_caps_unref (caps);
@@ -822,7 +833,8 @@
else
wrapper = gst_element_factory_make ("wrappercamerabinsrc", NULL);
- if (g_strcmp0(recorder->videosrc_name, "imxv4l2src") == 0
+ if (g_strcmp0(recorder->videosrc_name, "v4l2src") == 0
+ || g_strcmp0(recorder->videosrc_name, "imxv4l2src") == 0
|| g_strcmp0(recorder->videosrc_name, "videotestsrc") == 0) {
camerasrc = gst_element_factory_make (recorder->videosrc_name, NULL);
} else {
@@ -893,7 +905,7 @@
if (recorder->video_detect_name)
recorder->vfsink_name = "imxv4l2sink";
else
- recorder->vfsink_name = "overlaysink";
+ recorder->vfsink_name = "autovideosink";
/* configure used elements */
res &=
@@ -1008,6 +1020,7 @@
recorder->mode == MODE_VIDEO ? MODE_IMAGE : MODE_VIDEO, NULL);
}
+#if 0
//FIXME: shouldn't need those code. will check later.
if (GST_IS_VIDEO_OVERLAY (recorder->viewfinder_sink)) {
gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(recorder->viewfinder_sink),
@@ -1015,6 +1028,7 @@
} else {
g_warning ("view finder sink isn't video overlay.\n");
}
+#endif
if (GST_STATE_CHANGE_FAILURE ==
gst_element_set_state (recorder->camerabin, GST_STATE_READY)) {
@@ -1436,12 +1450,13 @@
RecorderEngine *h = (RecorderEngine *)(handle);
gRecorderEngine *recorder = (gRecorderEngine *)(h->pData);
CHECK_PARAM (vs, RE_VIDEO_SOURCE_LIST_END);
+ gchar *videosrc = NULL;
static KeyMap kKeyMap[] = {
- { RE_VIDEO_SOURCE_DEFAULT, (REchar *)"imxv4l2src" },
- { RE_VIDEO_SOURCE_CAMERA, (REchar *)"imxv4l2src" },
- { RE_VIDEO_SOURCE_SCREEN, (REchar *)"ximagesrc ! queue ! imxcompositor_ipu" },
+ { RE_VIDEO_SOURCE_DEFAULT, (REchar *)"autovideosrc" },
+ { RE_VIDEO_SOURCE_CAMERA, (REchar *)"autovideosrc" },
{ RE_VIDEO_SOURCE_TEST, (REchar *)"videotestsrc" },
+ { RE_VIDEO_SOURCE_SCREEN, (REchar *)"ximagesrc ! queue ! imxcompositor_ipu" },
};
recorder->videosrc_name = key_value_pair (vs, kKeyMap, sizeof(kKeyMap));
@@ -1658,7 +1673,12 @@
gRecorderEngine *recorder = (gRecorderEngine *)(h->pData);
if (bAddTimeStamp) {
- recorder->date_time = "clockoverlay halignment=left valignment=top time-format=\"%Y/%m/%d %H:%M:%S \" ! queue ! imxvideoconvert_ipu composition-meta-enable=true in-place=true ! queue";
+ if (IS_IMX8MM()) {
+ recorder->date_time = "clockoverlay halignment=left valignment=top time-format=\"%Y/%m/%d %H:%M:%S \" ! queue ! imxvideoconvert_g2d composition-meta-enable=true in-place=true ! queue";
+ }
+ else {
+ recorder->date_time = "clockoverlay halignment=left valignment=top time-format=\"%Y/%m/%d %H:%M:%S \" ! queue ! imxvideoconvert_ipu composition-meta-enable=true in-place=true ! queue";
+ }
} else {
recorder->date_time = NULL;
}
@@ -1672,6 +1692,11 @@
gRecorderEngine *recorder = (gRecorderEngine *)(h->pData);
CHECK_PARAM (videoEffect, RE_VIDEO_EFFECT_LIST_END);
+ if (IS_IMX8MM()) {
+ g_print("***Video effect is not supported!\n");
+ return RE_RESULT_FEATURE_UNSUPPORTED;
+ }
+
/* check gstreamer version, pipeline is different in 1.4.5 and 1.6.0 */
/* gray shader effect has been removed in GST-1.8.0 */
#if GST_CHECK_VERSION(1, 8, 0)
@@ -1719,6 +1744,11 @@
gRecorderEngine *recorder = (gRecorderEngine *)(h->pData);
CHECK_PARAM (videoDetect, RE_VIDEO_DETECT_LIST_END);
+ if (IS_IMX8MM()) {
+ g_print("***Video detect is not supported!\n");
+ return RE_RESULT_FEATURE_UNSUPPORTED;
+ }
+
static KeyMap kKeyMap[] = {
{ RE_VIDEO_DETECT_DEFAULT, NULL },
{ RE_VIDEO_DETECT_FACEDETECT, (REchar *)"imxvideoconvert_ipu ! queue ! video/x-raw,width=176,height=144 ! queue ! facedetect profile=/usr/share/gst1.0-fsl-plugins/1.0/opencv_haarcascades/haarcascade_frontalface_old_format.xml display=true scale-factor=2 min-size-width=32 min-size-height=32 updates=2 min-neighbors=3 ! queue" },
diff --git a/tools/grecorder/recorder_engine.h b/tools/grecorder/recorder_engine.h
index 4766008..c03fce2 100644
--- a/tools/grecorder/recorder_engine.h
+++ b/tools/grecorder/recorder_engine.h
@@ -68,8 +68,8 @@
#define RE_VIDEO_SOURCE_DEFAULT ((REuint32) 0x00000000)
#define RE_VIDEO_SOURCE_CAMERA ((REuint32) 0x00000001)
-#define RE_VIDEO_SOURCE_SCREEN ((REuint32) 0x00000002)
-#define RE_VIDEO_SOURCE_TEST ((REuint32) 0x00000003)
+#define RE_VIDEO_SOURCE_TEST ((REuint32) 0x00000002)
+#define RE_VIDEO_SOURCE_SCREEN ((REuint32) 0x00000003)
#define RE_VIDEO_SOURCE_LIST_END ((REuint32) 0x00000004)
#define RE_COLORFORMAT_DEFAULT ((REuint32) 0x00000000)
@@ -116,7 +116,8 @@
#define RE_VIDEO_ENCODER_MPEG4 ((REuint32) 0x00000002)
#define RE_VIDEO_ENCODER_H263 ((REuint32) 0x00000003)
#define RE_VIDEO_ENCODER_MJPEG ((REuint32) 0x00000004)
-#define RE_VIDEO_ENCODER_LIST_END ((REuint32) 0x00000005)
+#define RE_VIDEO_ENCODER_VP8 ((REuint32) 0x00000005)
+#define RE_VIDEO_ENCODER_LIST_END ((REuint32) 0x00000006)
#define RE_EVENT_NONE ((REuint32) 0x00000000)
#define RE_EVENT_ERROR_UNKNOWN ((REuint32) 0x00000001)