Name: libmm-streamrecorder
Summary: Media Stream Recorder library
-Version: 0.0.17
+Version: 0.0.18
Release: 0
Group: Multimedia/Other
License: Apache-2.0
tag_fourcc is Four-character-code (FOURCC) */
// READER
-gboolean _mmstreamrecorder_find_fourcc(FILE *f, guint32 tag_fourcc, gboolean do_rewind);
gboolean _mmstreamrecorder_update_size(FILE *f, gint64 prev_pos, gint64 curr_pos);
guint64 _mmstreamrecorder_get_container_size(const guchar *size);
// AUDIO FOURCC
gboolean _mmstreamrecorder_write_udta_m4a(FILE *f);
-gboolean _mmstreamrecorder_audio_add_metadata_info_m4a(MMHandleType handle);
#ifdef __cplusplus
}
| GLOBAL FUNCTION DEFINITIONS: |
---------------------------------------------------------------------------*/
-gboolean _mmstreamrecorder_find_fourcc(FILE *f, guint32 tag_fourcc, gboolean do_rewind)
-{
- guchar buf[8];
-
- if (do_rewind)
- rewind(f);
-
- while (fread(&buf, sizeof(guchar), 8, f) > 0) {
- unsigned long long buf_size = 0;
- unsigned int buf_fourcc = MMSTREAMRECORDER_FOURCC(buf[4], buf[5], buf[6], buf[7]);
-
- if (tag_fourcc == buf_fourcc) {
- _mmstreamrec_dbg_log("find tag : %c%c%c%c", MMSTREAMRECORDER_FOURCC_ARGS(tag_fourcc));
- return TRUE;
- } else if ((buf_fourcc == MMSTREAMRECORDER_FOURCC('m', 'o', 'o', 'v')) && (tag_fourcc != buf_fourcc)) {
- if (_mmstreamrecorder_find_fourcc(f, tag_fourcc, FALSE))
- return TRUE;
- else
- continue;
- } else {
- _mmstreamrec_dbg_log("skip [%c%c%c%c] tag", MMSTREAMRECORDER_FOURCC_ARGS(buf_fourcc));
-
- buf_size = (unsigned long long)_mmstreamrecorder_get_container_size(buf);
- buf_size = buf_size - 8; /* include tag */
-
- do {
- if (buf_size > _MMSTREAMRECORDER_MAX_INT) {
- _mmstreamrec_dbg_log("seek %d", _MMSTREAMRECORDER_MAX_INT);
- if (fseek(f, _MMSTREAMRECORDER_MAX_INT, SEEK_CUR) != 0) {
- _mmstreamrec_dbg_err("fseek() fail");
- return FALSE;
- }
-
- buf_size -= _MMSTREAMRECORDER_MAX_INT;
- } else {
- _mmstreamrec_dbg_log("seek %d", buf_size);
- if (fseek(f, buf_size, SEEK_CUR) != 0) {
- _mmstreamrec_dbg_err("fseek() fail");
- return FALSE;
- }
- break;
- }
- } while (TRUE);
- }
- }
-
- _mmstreamrec_dbg_log("cannot find tag : %c%c%c%c", MMSTREAMRECORDER_FOURCC_ARGS(tag_fourcc));
-
- return FALSE;
-}
-
gboolean _mmstreamrecorder_update_composition_matrix(FILE *f, int orientation)
{
/* for 0 degree */
return TRUE;
}
-
-/* START TAG HERE */
-gboolean _mmstreamrecorder_audio_add_metadata_info_m4a(MMHandleType handle)
-{
- FILE *f = NULL;
- guchar buf[4];
- guint64 udta_size = 0;
- gint64 current_pos = 0;
- gint64 moov_pos = 0;
- gint64 udta_pos = 0;
- char err_msg[128] = { '\0', };
-
- _MMStreamRecorderFileInfo *finfo = NULL;
- mmf_streamrecorder_t *hstreamrecorder = MMF_STREAMRECORDER(handle);
- _MMStreamRecorderSubContext *sc = NULL;
-
- mmf_return_val_if_fail(hstreamrecorder, MM_ERROR_STREAMRECORDER_NOT_INITIALIZED);
- sc = MMF_STREAMRECORDER_SUBCONTEXT(handle);
-
- mmf_return_val_if_fail(sc, MM_ERROR_STREAMRECORDER_NOT_INITIALIZED);
- mmf_return_val_if_fail(sc->info_file, MM_ERROR_STREAMRECORDER_NOT_INITIALIZED);
-
- finfo = sc->info_file;
-
- f = fopen(finfo->filename, "rb+");
- if (f == NULL) {
- strerror_r(errno, err_msg, 128);
- _mmstreamrec_dbg_err("file open failed [%s]", err_msg);
- return FALSE;
- }
-
- /* find udta container.
- if, there are udta container, write loci box after that
- else, make udta container and write loci box. */
- if (_mmstreamrecorder_find_fourcc(f, MMSTREAMRECORDER_FOURCC('u', 'd', 't', 'a'), TRUE)) {
- size_t nread = 0;
-
- _mmstreamrec_dbg_log("find udta container");
-
- /* read size */
- if (fseek(f, -8L, SEEK_CUR) != 0)
- goto fail;
-
- udta_pos = ftell(f);
- if (udta_pos < 0)
- goto ftell_fail;
-
- nread = fread(&buf, sizeof(char), sizeof(buf), f);
-
- _mmstreamrec_dbg_log("recorded file fread %d", nread);
-
- udta_size = _mmstreamrecorder_get_container_size(buf);
-
- /* goto end of udta and write 'smta' box */
- if (fseek(f, (udta_size - 4L), SEEK_CUR) != 0)
- goto fail;
-
- current_pos = ftell(f);
- if (current_pos < 0)
- goto ftell_fail;
-
- if (!_mmstreamrecorder_update_size(f, udta_pos, current_pos))
- goto fail;
- } else {
- _mmstreamrec_dbg_log("No udta container");
- if (fseek(f, 0, SEEK_END) != 0)
- goto fail;
-
- if (!_mmstreamrecorder_write_udta_m4a(f))
- goto fail;
- }
-
- /* find moov container.
- update moov container size. */
- if ((current_pos = ftell(f)) < 0)
- goto ftell_fail;
-
- if (_mmstreamrecorder_find_fourcc(f, MMSTREAMRECORDER_FOURCC('m', 'o', 'o', 'v'), TRUE)) {
-
- _mmstreamrec_dbg_log("found moov container");
- if (fseek(f, -8L, SEEK_CUR) != 0)
- goto fail;
-
- moov_pos = ftell(f);
- if (moov_pos < 0)
- goto ftell_fail;
-
- if (!_mmstreamrecorder_update_size(f, moov_pos, current_pos))
- goto fail;
-
- } else {
- _mmstreamrec_dbg_err("No 'moov' container");
- goto fail;
- }
-
- fclose(f);
- return TRUE;
-
- fail:
- fclose(f);
- return FALSE;
-
- ftell_fail:
- _mmstreamrec_dbg_err("ftell() returns negative value.");
- fclose(f);
- return FALSE;
-}
-
-/* END TAG HERE */
sinkpad = NULL;
}
- if (!strcmp(/*gst_element_rsink_name */"filesink", "filesink")) {
- srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_VENC].gst, "src");
- MMSTREAMRECORDER_ADD_BUFFER_PROBE(srcpad, _MMSTREAMRECORDER_HANDLER_VIDEOREC, __mmstreamrecorder_video_dataprobe_record, hstreamrecorder);
+ srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_VENC].gst, "src");
+ MMSTREAMRECORDER_ADD_BUFFER_PROBE(srcpad, _MMSTREAMRECORDER_HANDLER_VIDEOREC, __mmstreamrecorder_video_dataprobe_record, hstreamrecorder);
+ gst_object_unref(srcpad);
+ srcpad = NULL;
+
+ if (sc->audio_enable == TRUE) {
+ srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_AENC].gst, "src");
+ MMSTREAMRECORDER_ADD_BUFFER_PROBE(srcpad, _MMSTREAMRECORDER_HANDLER_VIDEOREC, __mmstreamrecorder_audio_dataprobe_check, hstreamrecorder);
gst_object_unref(srcpad);
srcpad = NULL;
-
- if (sc->audio_enable == TRUE) {
- srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_AENC].gst, "src");
- MMSTREAMRECORDER_ADD_BUFFER_PROBE(srcpad, _MMSTREAMRECORDER_HANDLER_VIDEOREC, __mmstreamrecorder_audio_dataprobe_check, hstreamrecorder);
- gst_object_unref(srcpad);
- srcpad = NULL;
- }
}
bus = gst_pipeline_get_bus(GST_PIPELINE(sc->encode_element[_MMSTREAMRECORDER_ENCODE_MAIN_PIPE].gst));
const char *str_aar = NULL;
const char *str_acs = NULL;
char *err_name = NULL;
-
+ int ret = MM_ERROR_NONE;
GstCaps *caps = NULL;
GstPad *pad = NULL;
GList *element_list = NULL;
finfo = sc->info_file;
/* check element availability */
- mm_streamrecorder_get_attributes(handle, &err_name, MMSTR_AUDIO_ENCODER, &audio_enc, MMSTR_AUDIO_CHANNEL, &channel, MMSTR_VIDEO_BITRATE, &v_bitrate, MMSTR_VIDEO_ENCODER, &video_enc, MMSTR_AUDIO_BITRATE, &a_bitrate, MMSTR_VIDEO_RESOLUTION_WIDTH, &video_width, MMSTR_VIDEO_RESOLUTION_HEIGHT, &video_height, MMSTR_VIDEO_FRAMERATE, &video_fps, MMSTR_FILE_FORMAT, &file_format, MMSTR_AUDIO_SAMPLERATE, &audio_samplerate, MMSTR_AUDIO_SOURCE_FORMAT, &audio_src_format, MMSTR_VIDEO_SOURCE_FORMAT, &video_src_format, MMSTR_RECORDER_MODE, &rec_mode, NULL);
+ ret = mm_streamrecorder_get_attributes(handle, &err_name, MMSTR_AUDIO_ENCODER, &audio_enc, MMSTR_AUDIO_CHANNEL, &channel, MMSTR_VIDEO_BITRATE, &v_bitrate, MMSTR_VIDEO_ENCODER, &video_enc, MMSTR_AUDIO_BITRATE, &a_bitrate, MMSTR_VIDEO_RESOLUTION_WIDTH, &video_width, MMSTR_VIDEO_RESOLUTION_HEIGHT, &video_height, MMSTR_VIDEO_FRAMERATE, &video_fps, MMSTR_FILE_FORMAT, &file_format, MMSTR_AUDIO_SAMPLERATE, &audio_samplerate, MMSTR_AUDIO_SOURCE_FORMAT, &audio_src_format, MMSTR_VIDEO_SOURCE_FORMAT, &video_src_format, MMSTR_RECORDER_MODE, &rec_mode, NULL);
+ if (ret != MM_ERROR_NONE) {
+ _mmstreamrec_dbg_err("Get attrs fail. (%s:%x)", err_name, ret);
+ SAFE_FREE(err_name);
+ return err;
+ }
_mmstreamrec_dbg_err("audio encoder - %d , video encoder : %d", audio_enc, video_enc);
_mmstreamrec_dbg_err("audio channel - %d , video v_bitrate : %d", channel, v_bitrate);
/* check element availability */
ret = mm_streamrecorder_get_attributes(handle, &err_name, MMSTR_VIDEO_FRAMERATE, &video_fps, MMSTR_VIDEO_SOURCE_FORMAT, &video_src, MMSTR_VIDEO_RESOLUTION_WIDTH, &video_width, MMSTR_VIDEO_RESOLUTION_HEIGHT, &video_height, MMSTR_VIDEO_SOURCE_FORMAT, &video_source_format, NULL);
+ if (ret != MM_ERROR_NONE) {
+ _mmstreamrec_dbg_err("Error in mm_streamrecorder_get_attributes (%s:%d)", err_name, ret);
+ SAFE_FREE(err_name);
+ return ret;
+ }
+
if (sc->encode_element[_MMSTREAMRECORDER_ENCSINK_SRC].gst) {
/*_mmstreamrec_dbg_log("Buffer Push start , time stamp %ld",timestamp);*/
{
MMHandleType str_handle = 0;
- char *err_attr_name = NULL;
int video_codec = MM_VIDEO_CODEC_INVALID;
int file_format = MM_FILE_FORMAT_INVALID;
int v_bitrate = 0;
/* audio_src_format = 2; */
rec_mode = 0;
video_src_format = MM_STREAMRECORDER_INPUT_FORMAT_NV12;
- mm_streamrecorder_set_attributes((MMHandleType)str_handle, &err_attr_name,
+ mm_streamrecorder_set_attributes((MMHandleType)str_handle, NULL,
MMSTR_VIDEO_ENABLE, TRUE,
MMSTR_AUDIO_ENABLE, FALSE,
NULL);
- mm_streamrecorder_set_attributes((MMHandleType)str_handle, &err_attr_name,
+ mm_streamrecorder_set_attributes((MMHandleType)str_handle, NULL,
MMSTR_VIDEO_ENCODER, video_codec,
/*MMSTR_AUDIO_ENCODER, audio_codec,*/
MMSTR_FILE_FORMAT, file_format,
MMSTR_VIDEO_SOURCE_FORMAT, video_src_format,
MMSTR_RECORDER_MODE, rec_mode,
NULL);
- mm_streamrecorder_set_attributes((MMHandleType)str_handle, &err_attr_name,
+ mm_streamrecorder_set_attributes((MMHandleType)str_handle, NULL,
MMSTR_FILENAME, filename, strlen(filename), NULL);