/*H262*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
/*H263V2*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
/*H263V3*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-/*MJPEG*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+/*MJPEG*/ { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
/*MPEG2*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
/*MPEG4_SIMPLE*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
/*MPEG4_ADV*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
static GstPadProbeReturn __mmcamcorder_video_dataprobe_push_buffer_to_record(GstPad *pad, GstPadProbeInfo *info, gpointer u_data);
static int __mmcamcorder_get_amrnb_bitrate_mode(int bitrate);
static guint32 _mmcamcorder_convert_fourcc_string_to_value(const gchar* format_name);
-
+static inline bool __mmcamcorder_is_encoded_preview_pixel_format(int pixel_format);
#ifdef _MMCAMCORDER_PRODUCT_TV
static bool __mmcamcorder_find_max_resolution(MMHandleType handle, gint *max_width, gint *max_height);
#endif /* _MMCAMCORDER_PRODUCT_TV */
}
}
- /* make demux and decoder for H264 stream from videosrc */
- if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_H264 && display_surface_type != MM_DISPLAY_SURFACE_NULL) {
- int preview_bitrate = 0;
- int gop_interval = 0;
- const char *videodecoder_name = NULL;
-
+ if (__mmcamcorder_is_encoded_preview_pixel_format(sc->info_image->preview_format)) {
/* get recreate_decoder flag */
_mmcamcorder_conf_get_value_int(handle, hcamcorder->conf_main,
CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
"RecreateDecoder",
&hcamcorder->recreate_decoder);
+ }
- /* get video decoder element and name for H.264 format */
- _mmcamcorder_conf_get_element(handle, hcamcorder->conf_main,
- CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
- "VideodecoderElementH264",
- &sc->VideodecoderElementH264);
-
- _mmcamcorder_conf_get_value_element_name(sc->VideodecoderElementH264, &videodecoder_name);
-
- if (videodecoder_name) {
- _mmcam_dbg_log("video decoder element [%s], recreate decoder %d",
- videodecoder_name, hcamcorder->recreate_decoder);
-#ifdef _MMCAMCORDER_RM_SUPPORT
- if (hcamcorder->request_resources.category_id[0] == RM_CATEGORY_VIDEO_DECODER_SUB)
- decoder_index = 1;
-
- snprintf(decoder_name, sizeof(decoder_name)-1, "%s%d", videodecoder_name, decoder_index);
- _mmcam_dbg_log("encoded preview decoder_name %s", decoder_name);
- /* create decoder element */
- _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_DECODE, decoder_name, "videosrc_decode", element_list, err);
-#else /* _MMCAMCORDER_RM_SUPPORT */
- /* create decoder element */
- _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_DECODE, videodecoder_name, "videosrc_decode", element_list, err);
-#endif /* _MMCAMCORDER_RM_SUPPORT */
- _mmcamcorder_conf_set_value_element_property(sc->element[_MMCAMCORDER_VIDEOSRC_DECODE].gst, sc->VideodecoderElementH264);
- } else {
- _mmcam_dbg_err("failed to get video decoder element name from %p", sc->VideodecoderElementH264);
- goto pipeline_creation_error;
- }
-
- /* set encoded preview bitrate and iframe interval */
+ if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_H264) {
+ int preview_bitrate = 0;
+ int gop_interval = 0;
mm_camcorder_get_attributes(handle, NULL,
MMCAM_ENCODED_PREVIEW_BITRATE, &preview_bitrate,
MMCAM_ENCODED_PREVIEW_GOP_INTERVAL, &gop_interval,
NULL);
+ /* set encoded preview bitrate */
if (!_mmcamcorder_set_encoded_preview_bitrate(handle, preview_bitrate))
_mmcam_dbg_warn("_mmcamcorder_set_encoded_preview_bitrate failed");
+ /* set encoded preview iframe interval */
if (!_mmcamcorder_set_encoded_preview_gop_interval(handle, gop_interval))
_mmcam_dbg_warn("_mmcamcorder_set_encoded_preview_gop_interval failed");
}
+ if (display_surface_type != MM_DISPLAY_SURFACE_NULL) {
+ const char *videodecoder_name = NULL;
+ /* case of decoder element */
+ if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_H264) {
+ /* get video decoder element and name for H.264 format */
+ _mmcamcorder_conf_get_element(handle, hcamcorder->conf_main,
+ CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
+ "VideodecoderElementH264",
+ &sc->VideodecoderElementH264);
+ _mmcamcorder_conf_get_value_element_name(sc->VideodecoderElementH264,
+ &videodecoder_name);
+ if (videodecoder_name) {
+#ifdef _MMCAMCORDER_RM_SUPPORT
+ if (hcamcorder->request_resources.category_id[0] == RM_CATEGORY_VIDEO_DECODER_SUB)
+ decoder_index = 1;
+
+ snprintf(decoder_name, sizeof(decoder_name)-1, "%s%d", videodecoder_name, decoder_index);
+ _mmcam_dbg_log("encoded preview decoder_name [%s], video decoder element [%s]",
+ decoder_name, videodecoder_name);
+ /* create decoder element */
+ _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_DECODE, decoder_name, "videosrc_decode", element_list, err);
+#else /* _MMCAMCORDER_RM_SUPPORT */
+ _mmcam_dbg_log("video decoder element [%s]", videodecoder_name);
+ /* create decoder element */
+ _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_DECODE, videodecoder_name, "videosrc_decode", element_list, err);
+#endif /* _MMCAMCORDER_RM_SUPPORT */
+ _mmcamcorder_conf_set_value_element_property(sc->element[_MMCAMCORDER_VIDEOSRC_DECODE].gst, sc->VideodecoderElementH264);
+ } else {
+ _mmcam_dbg_err("failed to get video decoder element name from %p", sc->VideodecoderElementH264);
+ goto pipeline_creation_error;
+ }
+ } else if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_MJPEG) {
+#ifdef _MMCAMCORDER_RM_SUPPORT
+ /* get video decoder element and name for MJPEG format */
+ _mmcamcorder_conf_get_element(handle, hcamcorder->conf_main,
+ CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
+ "VideodecoderElementH264",
+ &sc->VideodecoderElementH264);
+ _mmcamcorder_conf_get_value_element_name(sc->VideodecoderElementH264,
+ &videodecoder_name);
+ if (videodecoder_name) {
+ if (hcamcorder->request_resources.category_id[0] == RM_CATEGORY_VIDEO_DECODER)
+ snprintf(decoder_name, sizeof(decoder_name)-1, "%s", "omx_uhd_mjpegdec");
+ else
+ snprintf(decoder_name, sizeof(decoder_name)-1, "%s", "omx_mjpegdec");
+ _mmcam_dbg_log("encoded preview decoder_name [%s], video decoder element [%s]",
+ decoder_name, videodecoder_name);
+ /* create decoder element */
+ _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_DECODE, decoder_name, "videosrc_decode", element_list, err);
+ _mmcamcorder_conf_set_value_element_property(sc->element[_MMCAMCORDER_VIDEOSRC_DECODE].gst, sc->VideodecoderElementH264);
+ } else {
+ _mmcam_dbg_err("failed to get video decoder element name from %p", sc->VideodecoderElementH264);
+ goto pipeline_creation_error;
+ }
+#else /* _MMCAMCORDER_RM_SUPPORT */
+ _mmcam_dbg_log("video decoder element [jpegdec]");
+ /* create decoder element */
+ _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_DECODE, "jpegdec", "videosrc_decode", element_list, err);
+#endif /* _MMCAMCORDER_RM_SUPPORT */
+ }
+ }
+
_mmcam_dbg_log("Current mode[%d]", hcamcorder->type);
/* Get videosink name */
/* set capsfilter */
if (profile == MM_CAMCORDER_ENCBIN_PROFILE_VIDEO) {
- if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_H264) {
+ if (__mmcamcorder_is_encoded_preview_pixel_format(sc->info_image->preview_format)) {
_mmcam_dbg_log("get pad from videosrc_filter");
pad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_VIDEOSRC_FILT].gst, "src");
} else {
goto pipeline_creation_error;
}
- if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_H264) {
+ if (__mmcamcorder_is_encoded_preview_pixel_format(sc->info_image->preview_format)) {
/* set dummy element */
gst_element_venc_name = "identity";
} else {
}
/* set dataprobe for video recording */
- if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_H264)
+ if (__mmcamcorder_is_encoded_preview_pixel_format(sc->info_image->preview_format))
srcpad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_VIDEOSRC_QUE].gst, "src");
else
srcpad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "src");
GstMemory *memory = NULL;
GstMapInfo mapinfo;
- if (sc->info_image->preview_format != MM_PIXEL_FORMAT_ENCODED_H264) {
+ if (!__mmcamcorder_is_encoded_preview_pixel_format(sc->info_image->preview_format)) {
state = _mmcamcorder_get_state((MMHandleType)hcamcorder);
if (state < MM_CAMCORDER_STATE_PREPARE) {
_mmcam_dbg_warn("Not ready for stream callback");
if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_H264) {
stream.format = MM_PIXEL_FORMAT_ENCODED_H264;
+ } else if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_MJPEG) {
+ stream.format = MM_PIXEL_FORMAT_ENCODED_MJPEG;
} else {
string_format = gst_structure_get_string(structure, "format");
if (string_format == NULL) {
}
/* set size and timestamp */
- if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_H264)
+ if (__mmcamcorder_is_encoded_preview_pixel_format(sc->info_image->preview_format))
memory = gst_buffer_get_all_memory(buffer);
else
memory = gst_buffer_peek_memory(buffer, 0);
stream.data.encoded.data,
stream.data.encoded.length_data,
stream.data.encoded.is_delta_frame);
+
+ */
+ break;
+ case MM_PIXEL_FORMAT_ENCODED_MJPEG:
+ stream.data_type = MM_CAM_STREAM_DATA_ENCODED;
+ stream.data.encoded.data = mapinfo.data;
+ stream.data.encoded.length_data = stream.length_total;
+ /*
+ _mmcam_dbg_log("MJPEG[num_planes:%d] [0]p:%p,size:%d",
+ stream.num_planes, stream.data.encoded.data, stream.data.encoded.length_data);
*/
break;
case MM_PIXEL_FORMAT_INVZ:
/* unmap memory */
if (mapinfo.data)
gst_memory_unmap(memory, &mapinfo);
- if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_H264)
+ if (__mmcamcorder_is_encoded_preview_pixel_format(sc->info_image->preview_format))
gst_memory_unref(memory);
}
gst_structure_get_int(structure, "rotate", &caps_rotate);
#ifdef _MMCAMCORDER_PRODUCT_TV
- if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_H264) {
- if (set_width == caps_width && set_height == caps_height && set_rotate == caps_rotate && fps == caps_fps) {
+ if (__mmcamcorder_is_encoded_preview_pixel_format(sc->info_image->preview_format)) {
+ if (set_width == caps_width && set_height == caps_height &&
+ set_rotate == caps_rotate && fps == caps_fps) {
_mmcam_dbg_log("No need to replace caps.");
} else {
_mmcam_dbg_log("current [%c%c%c%c %dx%d, fps %d, rot %d], new [%c%c%c%c %dx%d, fps %d, rot %d]",
MMCAM_DISPLAY_SURFACE, &display_surface_type,
NULL);
- if (display_surface_type != MM_DISPLAY_SURFACE_NULL && __mmcamcorder_find_max_resolution(handle, &maxwidth, &maxheight) == false) {
+ if (display_surface_type != MM_DISPLAY_SURFACE_NULL &&
+ __mmcamcorder_find_max_resolution(handle, &maxwidth, &maxheight) == false) {
_mmcam_dbg_err("can not find max resolution limitation");
return false;
} else if (display_surface_type == MM_DISPLAY_SURFACE_NULL) {
"alignment", G_TYPE_STRING, "au",
#endif /* _MMCAMCORDER_PRODUCT_TV */
NULL);
+ } else if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_MJPEG){
+#ifdef _MMCAMCORDER_PRODUCT_TV
+ caps = gst_caps_new_simple("video/x-jpeg",
+#else
+ caps = gst_caps_new_simple("image/jpeg",
+#endif
+ "width", G_TYPE_INT, set_width,
+ "height", G_TYPE_INT, set_height,
+ "framerate", GST_TYPE_FRACTION, fps, 1,
+ NULL);
} else {
char fourcc_string[sizeof(fourcc)+1];
strncpy(fourcc_string, (char*)&fourcc, sizeof(fourcc));
return FALSE;
}
- if (sc->info_image->preview_format != MM_PIXEL_FORMAT_ENCODED_H264 ||
+ if (__mmcamcorder_is_encoded_preview_pixel_format(sc->info_image->preview_format) == false ||
hcamcorder->recreate_decoder == FALSE) {
_mmcam_dbg_log("skip this fuction - format %d, recreate decoder %d",
sc->info_image->preview_format, hcamcorder->recreate_decoder);
}
#ifdef _MMCAMCORDER_RM_SUPPORT
- if (hcamcorder->request_resources.category_id[0] == RM_CATEGORY_VIDEO_DECODER_SUB)
- decoder_index = 1;
+ if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_H264) {
+ if (hcamcorder->request_resources.category_id[0] == RM_CATEGORY_VIDEO_DECODER_SUB)
+ decoder_index = 1;
+
+ snprintf(decoder_name, sizeof(decoder_name)-1, "%s%d", videodecoder_name, decoder_index);
+ _mmcam_dbg_log("encoded preview decoder_name %s", decoder_name);
+ } else {
+ /* MJPEG */
+ if (hcamcorder->request_resources.category_id[0] == RM_CATEGORY_VIDEO_DECODER)
+ snprintf(decoder_name, sizeof(decoder_name)-1, "%s", "omx_uhd_mjpegdec");
+ else
+ snprintf(decoder_name, sizeof(decoder_name)-1, "%s", "omx_mjpegdec");
+ _mmcam_dbg_log("encoded preview decoder_name %s", decoder_name);
+ }
- snprintf(decoder_name, sizeof(decoder_name)-1, "%s%d", videodecoder_name, decoder_index);
- _mmcam_dbg_log("encoded preview decoder_name %s", decoder_name);
/* create decoder */
sc->element[_MMCAMCORDER_VIDEOSRC_DECODE].gst = gst_element_factory_make(decoder_name, "videosrc_decode");
if (sc->element[_MMCAMCORDER_VIDEOSRC_DECODE].gst == NULL) {
return TRUE;
}
+static inline bool __mmcamcorder_is_encoded_preview_pixel_format(int pixel_format) {
+ if (pixel_format == MM_PIXEL_FORMAT_ENCODED_H264 || pixel_format == MM_PIXEL_FORMAT_ENCODED_MJPEG)
+ return true;
+
+ return false;
+}
+
#ifdef _MMCAMCORDER_PRODUCT_TV
static bool __mmcamcorder_find_max_resolution(MMHandleType handle, gint *max_width, gint *max_height)
{
if (gst_structure_has_field(decsink_struct, "maxheight"))
*max_height = gst_value_get_int_range_max(gst_structure_get_value(decsink_struct, "maxheight"));
break;
+ } else if (!strcmp(mime, "video/x-jpeg")) {
+ _mmcam_dbg_log("mjpeg caps structure found");
+ if (gst_structure_has_field(decsink_struct, "maxwidth"))
+ *max_width = gst_value_get_int_range_max(gst_structure_get_value(decsink_struct, "maxwidth"));
+ if (gst_structure_has_field(decsink_struct, "maxheight"))
+ *max_height = gst_value_get_int_range_max(gst_structure_get_value(decsink_struct, "maxheight"));
+ break;
}
}
_mmcam_dbg_log("maxwidth = %d , maxheight = %d", (int)*max_width, (int)*max_height);