X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fmm_camcorder_gstcommon.c;h=d2f7e1e1becbd468c06e44b665338491c3e8c88c;hb=3a3fbbd9dcbb5ac740495265b7688a3ba5d2cd45;hp=914020e42f9819c9cb2c2bcb0c48f6f42ef7fc12;hpb=289d2e857371eff457d16e063d2fc2e002c7acfa;p=platform%2Fcore%2Fmultimedia%2Flibmm-camcorder.git diff --git a/src/mm_camcorder_gstcommon.c b/src/mm_camcorder_gstcommon.c index 914020e..d2f7e1e 100644 --- a/src/mm_camcorder_gstcommon.c +++ b/src/mm_camcorder_gstcommon.c @@ -669,10 +669,55 @@ pipeline_creation_error: } +void _mmcamcorder_set_encoder_bitrate(MMCamcorderEncoderType type, int codec, int bitrate, GstElement *element) +{ + int set_value = 0; + + if (!element) { + _mmcam_dbg_warn("NULL element, will be applied later - type %d, bitrate %d", type, bitrate); + return; + } + + if (bitrate <= 0) { + _mmcam_dbg_warn("[type %d, codec %d] too small bitrate[%d], use default", + type, codec, bitrate); + return; + } + + if (type == MM_CAMCORDER_ENCODER_TYPE_AUDIO) { + /* audio encoder bitrate setting */ + switch (codec) { + case MM_AUDIO_CODEC_AMR: + set_value = __mmcamcorder_get_amrnb_bitrate_mode(bitrate); + _mmcam_dbg_log("Set AMR encoder mode [%d]", set_value); + MMCAMCORDER_G_OBJECT_SET(element, "band-mode", set_value); + break; + case MM_AUDIO_CODEC_MP3: + set_value = bitrate / 1000; + _mmcam_dbg_log("Set MP3 encoder bitrate [%d] kbps", set_value); + MMCAMCORDER_G_OBJECT_SET(element, "bitrate", set_value); + break; + case MM_AUDIO_CODEC_AAC: + _mmcam_dbg_log("Set AAC encoder bitrate [%d] bps", bitrate); + MMCAMCORDER_G_OBJECT_SET(element, "bitrate", bitrate); + break; + default: + _mmcam_dbg_warn("Not AMR, MP3 and AAC codec, need to add code for audio bitrate"); + break; + } + } else { + /* video encoder bitrate setting */ + _mmcam_dbg_log("Set video encoder bitrate %d", bitrate); + MMCAMCORDER_G_OBJECT_SET(element, "bitrate", bitrate); + } + + return; +} + + int _mmcamcorder_create_encodesink_bin(MMHandleType handle, MMCamcorderEncodebinProfile profile) { int err = MM_ERROR_NONE; - int result = 0; int channel = 0; int audio_enc = 0; int v_bitrate = 0; @@ -1021,39 +1066,22 @@ int _mmcamcorder_create_encodesink_bin(MMHandleType handle, MMCamcorderEncodebin } if (profile == MM_CAMCORDER_ENCBIN_PROFILE_VIDEO) { - /* video encoder attribute setting */ - if (v_bitrate > 0) { - MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_VENC].gst, "bitrate", v_bitrate); - } else { - _mmcam_dbg_warn("video bitrate is too small[%d], so skip setting. Use DEFAULT value.", v_bitrate); - } - + /* property setting in ini */ _mmcamcorder_conf_set_value_element_property(sc->encode_element[_MMCAMCORDER_ENCSINK_VENC].gst, VideoencElement); + + /* bitrate setting */ + _mmcamcorder_set_encoder_bitrate(MM_CAMCORDER_ENCODER_TYPE_VIDEO, 0, + v_bitrate, sc->encode_element[_MMCAMCORDER_ENCSINK_VENC].gst); } if (sc->audio_disable == FALSE && profile != MM_CAMCORDER_ENCBIN_PROFILE_IMAGE) { - /* audio encoder attribute setting */ - if (a_bitrate > 0) { - switch (audio_enc) { - case MM_AUDIO_CODEC_AMR: - result = __mmcamcorder_get_amrnb_bitrate_mode(a_bitrate); - _mmcam_dbg_log("Set AMR encoder[%s] mode [%d]", gst_element_aenc_name, result); - MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_AENC].gst, "band-mode", result); - break; - case MM_AUDIO_CODEC_AAC: - _mmcam_dbg_log("Set AAC encoder[%s] bitrate [%d]", gst_element_aenc_name, a_bitrate); - MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_AENC].gst, "bitrate", a_bitrate); - break; - default: - _mmcam_dbg_log("Audio codec is not AMR or AAC... you need to implement setting function for audio encoder bit-rate"); - break; - } - } else { - _mmcam_dbg_warn("Setting bitrate is too small, so skip setting. Use DEFAULT value."); - } - + /* property setting in ini */ _mmcamcorder_conf_set_value_element_property(sc->encode_element[_MMCAMCORDER_ENCSINK_AENC].gst, AudioencElement); + + /* bitrate setting */ + _mmcamcorder_set_encoder_bitrate(MM_CAMCORDER_ENCODER_TYPE_AUDIO, audio_enc, + a_bitrate, sc->encode_element[_MMCAMCORDER_ENCSINK_AENC].gst); } _mmcam_dbg_log("Element creation complete"); @@ -1995,6 +2023,43 @@ void _mmcamcorder_remove_element_handle(MMHandleType handle, void *element, int } +int _mmcamcorder_check_codec_fileformat_compatibility(const char *codec_type, int codec, int file_format) +{ + mmf_return_val_if_fail(codec_type, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); + + /* Check compatibility between codec and file format */ + if (!strcmp(codec_type, MMCAM_AUDIO_ENCODER)) { + if (codec > MM_AUDIO_CODEC_INVALID && codec < MM_AUDIO_CODEC_NUM && + file_format > MM_FILE_FORMAT_INVALID && file_format < MM_FILE_FORMAT_NUM) { + if (audiocodec_fileformat_compatibility_table[codec][file_format] == 0) { + _mmcam_dbg_err("Audio codec[%d] and file format[%d] compatibility FAILED.", codec, file_format); + return MM_ERROR_CAMCORDER_ENCODER_WRONG_TYPE; + } + + _mmcam_dbg_log("Audio codec[%d] and file format[%d] compatibility SUCCESS.", codec, file_format); + } else { + _mmcam_dbg_err("Audio codec[%d] or file format[%d] is INVALID.", codec, file_format); + return MM_ERROR_CAMCORDER_ENCODER_WRONG_TYPE; + } + } else if (!strcmp(codec_type, MMCAM_VIDEO_ENCODER)) { + if (codec > MM_VIDEO_CODEC_INVALID && codec < MM_VIDEO_CODEC_NUM && + file_format > MM_FILE_FORMAT_INVALID && file_format < MM_FILE_FORMAT_NUM) { + if (videocodec_fileformat_compatibility_table[ codec][file_format] == 0) { + _mmcam_dbg_err("Video codec[%d] and file format[%d] compatibility FAILED.", codec, file_format); + return MM_ERROR_CAMCORDER_ENCODER_WRONG_TYPE; + } + + _mmcam_dbg_log("Video codec[%d] and file format[%d] compatibility SUCCESS.", codec, file_format); + } else { + _mmcam_dbg_err("Video codec[%d] or file format[%d] is INVALID.", codec, file_format); + return MM_ERROR_CAMCORDER_ENCODER_WRONG_TYPE; + } + } + + return MM_ERROR_NONE; +} + + int _mmcamcorder_check_audiocodec_fileformat_compatibility(MMHandleType handle) { int err = MM_ERROR_NONE; @@ -2004,9 +2069,9 @@ int _mmcamcorder_check_audiocodec_fileformat_compatibility(MMHandleType handle) char *err_name = NULL; err = mm_camcorder_get_attributes(handle, &err_name, - MMCAM_AUDIO_ENCODER, &audio_codec, - MMCAM_FILE_FORMAT, &file_format, - NULL); + MMCAM_AUDIO_ENCODER, &audio_codec, + MMCAM_FILE_FORMAT, &file_format, + NULL); if (err != MM_ERROR_NONE) { _mmcam_dbg_warn("Get attrs fail. (%s:%x)", err_name, err); SAFE_FREE(err_name); @@ -2014,23 +2079,9 @@ int _mmcamcorder_check_audiocodec_fileformat_compatibility(MMHandleType handle) } /* Check compatibility between audio codec and file format */ - if (audio_codec > MM_AUDIO_CODEC_INVALID && audio_codec < MM_AUDIO_CODEC_NUM && - file_format > MM_FILE_FORMAT_INVALID && file_format < MM_FILE_FORMAT_NUM) { - if (audiocodec_fileformat_compatibility_table[audio_codec][file_format] == 0) { - _mmcam_dbg_err("Audio codec[%d] and file format[%d] compatibility FAILED.", - audio_codec, file_format); - return MM_ERROR_CAMCORDER_ENCODER_WRONG_TYPE; - } - - _mmcam_dbg_log("Audio codec[%d] and file format[%d] compatibility SUCCESS.", - audio_codec, file_format); - } else { - _mmcam_dbg_err("Audio codec[%d] or file format[%d] is INVALID.", - audio_codec, file_format); - return MM_ERROR_CAMCORDER_ENCODER_WRONG_TYPE; - } + err = _mmcamcorder_check_codec_fileformat_compatibility(MMCAM_AUDIO_ENCODER, audio_codec, file_format); - return MM_ERROR_NONE; + return err; } @@ -2052,24 +2103,10 @@ int _mmcamcorder_check_videocodec_fileformat_compatibility(MMHandleType handle) return err; } - /* Check compatibility between audio codec and file format */ - if (video_codec > MM_VIDEO_CODEC_INVALID && video_codec < MM_VIDEO_CODEC_NUM && - file_format > MM_FILE_FORMAT_INVALID && file_format < MM_FILE_FORMAT_NUM) { - if (videocodec_fileformat_compatibility_table[video_codec][file_format] == 0) { - _mmcam_dbg_err("Video codec[%d] and file format[%d] compatibility FAILED.", - video_codec, file_format); - return MM_ERROR_CAMCORDER_ENCODER_WRONG_TYPE; - } + /* Check compatibility between video codec and file format */ + err = _mmcamcorder_check_codec_fileformat_compatibility(MMCAM_VIDEO_ENCODER, video_codec, file_format); - _mmcam_dbg_log("Video codec[%d] and file format[%d] compatibility SUCCESS.", - video_codec, file_format); - } else { - _mmcam_dbg_err("Video codec[%d] or file format[%d] is INVALID.", - video_codec, file_format); - return MM_ERROR_CAMCORDER_ENCODER_WRONG_TYPE; - } - - return MM_ERROR_NONE; + return err; }