Name: libmm-camcorder
Summary: Camera and recorder library
-Version: 0.10.273
+Version: 0.10.274
Release: 0
Group: Multimedia/Libraries
License: Apache-2.0
#define MMCAM_SUPPORT_EXTRA_PREVIEW "support-extra-preview"
/**
+ * Request codec config for encoded format
+ */
+#define MMCAM_REQUEST_CODEC_CONFIG "request-codec-config"
+
+/**
* Buffer fd from user
*/
#define MMCAM_USER_BUFFER_FD "user-buffer-fd"
unsigned char *data;
unsigned int length_data;
int is_delta_frame;
+ int is_header_included;
} encoded, depth, rgb;
} data; /**< pointer of captured stream */
MMCamStreamData data_type; /**< data type */
MM_CAM_EXTRA_PREVIEW_ENABLE,
MM_CAM_CAMERA_FOCUS_LEVEL, /* 140 */
MM_CAM_SUPPORT_EXTRA_PREVIEW,
+ MM_CAM_REQUEST_CODEC_CONFIG,
MM_CAM_ATTRIBUTE_NUM
} MMCamcorderAttrsID;
bool _mmcamcorder_commit_tag(MMHandleType handle, int attr_idx, const MMAttrsValue *value);
bool _mmcamcorder_commit_audio_replay_gain(MMHandleType handle, int attr_idx, const MMAttrsValue *value);
bool _mmcamcorder_commit_extra_preview(MMHandleType handle, int attr_idx, const MMAttrsValue *value);
+bool _mmcamcorder_commit_request_codec_config(MMHandleType handle, int attr_idx, const MMAttrsValue *value);
/**
gboolean _mmcamcorder_invoke_video_stream_cb(MMHandleType handle, GstSample *sample, gboolean is_preview, int stream_id);
GstPadProbeReturn __mmcamcorder_muxed_dataprobe(GstPad *pad, GstPadProbeInfo *info, gpointer u_data);
GstPadProbeReturn __mmcamcorder_eventprobe_monitor(GstPad *pad, GstPadProbeInfo *info, gpointer u_data);
+int _mmcamcorder_request_codec_config(GstElement *videosrc_element);
#ifdef _MMCAMCORDER_PRODUCT_TV
bool __mmcamcorder_find_max_resolution(MMHandleType handle, gint *max_width, gint *max_height);
#endif /* _MMCAMCORDER_PRODUCT_TV */
{.int_min = FALSE},
{.int_max = TRUE},
NULL,
+ },
+ {
+ MM_CAM_REQUEST_CODEC_CONFIG,
+ "request-codec-config",
+ MM_ATTRS_TYPE_INT,
+ MM_ATTRS_FLAG_RW,
+ {(void*)FALSE},
+ MM_ATTRS_VALID_TYPE_INT_RANGE,
+ {.int_min = FALSE},
+ {.int_max = TRUE},
+ _mmcamcorder_commit_request_codec_config,
}
};
}
+bool _mmcamcorder_commit_request_codec_config(MMHandleType handle, int attr_idx, const MMAttrsValue *value)
+{
+ int ret = MM_ERROR_NONE;
+ int current_state = MM_CAMCORDER_STATE_NONE;
+ mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+ _MMCamcorderSubContext *sc = NULL;
+
+ mmf_return_val_if_fail(hcamcorder && value, FALSE);
+
+ if (hcamcorder->type != MM_CAMCORDER_MODE_VIDEO_CAPTURE) {
+ MMCAM_LOG_ERROR("invalid mode %d", hcamcorder->type);
+ return FALSE;
+ }
+
+ MMCAM_LOG_INFO("Request codec config");
+
+ current_state = _mmcamcorder_get_state(handle);
+ if (current_state < MM_CAMCORDER_STATE_READY) {
+ MMCAM_LOG_INFO("invalid state[%d]", current_state);
+ return FALSE;
+ }
+
+ sc = MMF_CAMCORDER_SUBCONTEXT(handle);
+ mmf_return_val_if_fail(sc, FALSE);
+
+ ret = _mmcamcorder_request_codec_config(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
+ if (ret != MM_ERROR_NONE) {
+ hcamcorder->error_code = ret;
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
bool _mmcamcorder_set_attribute_to_camsensor(MMHandleType handle)
{
mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
static gboolean __mmcamcorder_set_stream_data(MMCamcorderVideoStreamDataType *stream, GstBuffer *buffer, GstMapInfo *map_info);
static gboolean __mmcamcorder_set_stream_data_zero_copy(MMCamcorderVideoStreamDataType *stream, GstBuffer *buffer, GstMemory *memory);
static const char *__mmcamcorder_get_parser_name(MMPixelFormatType format);
-static void __mmcamcorder_request_codec_config(GstElement *videosrc_element);
/*=======================================================================================
| FUNCTION DEFINITIONS |
stream->data.encoded.data = map_info->data;
stream->data.encoded.length_data = stream->length_total;
stream->data.encoded.is_delta_frame = GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DELTA_UNIT);
+ stream->data.encoded.is_header_included = GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_HEADER);
stream->num_planes = 1;
break;
stream->length_total = gst_memory_get_sizes(memory, NULL, NULL);
stream->data.encoded.length_data = stream->length_total;
stream->data.encoded.is_delta_frame = GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DELTA_UNIT);
+ stream->data.encoded.is_header_included = GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_HEADER);
- MMCAM_LOG_VERBOSE("[ENCODED] length[%u], is_delta[%d]",
- stream->data.encoded.length_data, stream->data.encoded.is_delta_frame);
+ MMCAM_LOG_VERBOSE("[ENCODED] length[%u], is_delta[%d], is_header_included[%d]",
+ stream->data.encoded.length_data,
+ stream->data.encoded.is_delta_frame,
+ stream->data.encoded.is_header_included);
return TRUE;
}
}
-static void __mmcamcorder_request_codec_config(GstElement *videosrc_element)
+int _mmcamcorder_request_codec_config(GstElement *videosrc_element)
{
if (!videosrc_element || !G_TYPE_CHECK_INSTANCE(videosrc_element)) {
MMCAM_LOG_WARNING("invalid videosrc element[%p]", videosrc_element);
- return;
+ return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
}
if (!g_signal_parse_name(_MMCAMCORDER_SIGNAL_REQUEST_CODEC_CONFIG,
G_TYPE_FROM_INSTANCE(videosrc_element), NULL, NULL, FALSE)) {
MMCAM_LOG_WARNING("no signal[%s]", _MMCAMCORDER_SIGNAL_REQUEST_CODEC_CONFIG);
- return;
+ return MM_ERROR_CAMCORDER_NOT_SUPPORTED;
}
MMCAM_LOG_INFO("emit signal[%s]", _MMCAMCORDER_SIGNAL_REQUEST_CODEC_CONFIG);
g_signal_emit_by_name(videosrc_element, _MMCAMCORDER_SIGNAL_REQUEST_CODEC_CONFIG);
+
+ return MM_ERROR_NONE;
}
void _mmcamcorder_ready_to_encode_callback(GstElement *element, guint size, gpointer handle)
{
+ int ret = MM_ERROR_NONE;
mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
_MMCamcorderSubContext *sc = NULL;
/* set flag */
if (sc->info_video->push_encoding_buffer == PUSH_ENCODING_BUFFER_INIT) {
sc->info_video->push_encoding_buffer = PUSH_ENCODING_BUFFER_RUN;
- __mmcamcorder_request_codec_config(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
- MMCAM_LOG_WARNING("start to push buffer to encoding pipeline");
+ ret = _mmcamcorder_request_codec_config(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
+ MMCAM_LOG_WARNING("Push buffer to encoding pipeline[request codec config:0x%x]", ret);
}
}