int stream_index = 0;
int buffer_interval = 0;
int blocksize = 0;
+ int replay_gain_enable = FALSE;
+ double replay_gain_ref_level = 0.0;
GstCaps *caps = NULL;
GstPad *pad = NULL;
MMCAM_AUDIO_FORMAT, &format,
MMCAM_AUDIO_CHANNEL, &channel,
MMCAM_AUDIO_VOLUME, &volume,
+ MMCAM_AUDIO_REPLAY_GAIN_ENABLE, &replay_gain_enable,
+ MMCAM_AUDIO_REPLAY_GAIN_REFERENCE_LEVEL, &replay_gain_ref_level,
MMCAM_SOUND_STREAM_TYPE, &stream_type, &stream_type_len,
MMCAM_SOUND_STREAM_INDEX, &stream_index,
NULL);
MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_AUDIOSRC_QUE].gst, "max-size-bytes", 0);
MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_AUDIOSRC_QUE].gst, "max-size-time", 0);
- if (a_enc != MM_AUDIO_CODEC_VORBIS)
- _MMCAMCORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMCAMCORDER_AUDIOSRC_VOL, "volume", "audiosrc_volume", element_list, err);
-
/* Set basic infomation */
if (a_enc != MM_AUDIO_CODEC_VORBIS) {
int depth = 0;
const gchar* format_name = NULL;
+ _MMCAMCORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMCAMCORDER_AUDIOSRC_VOL, "volume", "audiosrc_volume", element_list, err);
+
if (volume == 0.0) {
/* Because data probe of audio src do the same job, it doesn't need to set "mute" here. Already null raw data. */
MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_AUDIOSRC_VOL].gst, "volume", 1.0);
rate, channel, BYTE_ORDER);
}
+ /* Replay Gain */
+ _mmcam_dbg_log("Replay gain - enable : %d, reference level : %lf",
+ replay_gain_enable, replay_gain_ref_level);
+
+ if (replay_gain_enable) {
+ _MMCAMCORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMCAMCORDER_AUDIOSRC_RGA, "rganalysis", "audiosrc_rga", element_list, err);
+ MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_AUDIOSRC_RGA].gst, "reference-level", replay_gain_ref_level);
+ /* If num-tracks is not set, album gain and peak event is not come. */
+ MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_AUDIOSRC_RGA].gst, "num-tracks", 1);
+ }
+
if (caps) {
MMCAMCORDER_G_OBJECT_SET_POINTER((sc->encode_element[_MMCAMCORDER_AUDIOSRC_FILT].gst), "caps", caps);
gst_caps_unref(caps);
case GST_EVENT_NAVIGATION:
case GST_EVENT_LATENCY:
/* downstream serialized events */
- case GST_EVENT_TAG:
case GST_EVENT_BUFFERSIZE:
_mmcam_dbg_log("[%s:%s] gots %s", GST_DEBUG_PAD_NAME(pad), GST_EVENT_TYPE_NAME(event));
break;
+ case GST_EVENT_TAG:
+ {
+ GstTagList *tag_list = NULL;
+ _MMCamcorderReplayGain *replay_gain = NULL;
+
+ _mmcam_dbg_log("[%s:%s] gots %s", GST_DEBUG_PAD_NAME(pad), GST_EVENT_TYPE_NAME(event));
+
+ hcamcorder = MMF_CAMCORDER(u_data);
+ if (!hcamcorder || !hcamcorder->sub_context) {
+ _mmcam_dbg_warn("NULL handle");
+ break;
+ }
+
+ replay_gain = &hcamcorder->sub_context->replay_gain;
+
+ gst_event_parse_tag(event, &tag_list);
+ if (!tag_list) {
+ _mmcam_dbg_warn("failed to get tag list");
+ break;
+ }
+
+ if (!gst_tag_list_get_double(tag_list, GST_TAG_TRACK_PEAK, &replay_gain->track_peak)) {
+ _mmcam_dbg_warn("failed to get GST_TAG_TRACK_PEAK");
+ break;
+ }
+
+ if (!gst_tag_list_get_double(tag_list, GST_TAG_TRACK_GAIN, &replay_gain->track_gain)) {
+ _mmcam_dbg_warn("failed to get GST_TAG_TRACK_GAIN");
+ break;
+ }
+
+ if (!gst_tag_list_get_double(tag_list, GST_TAG_ALBUM_PEAK, &replay_gain->album_peak)) {
+ _mmcam_dbg_warn("failed to get GST_TAG_ALBUM_PEAK");
+ break;
+ }
+
+ if (!gst_tag_list_get_double(tag_list, GST_TAG_ALBUM_GAIN, &replay_gain->album_gain)) {
+ _mmcam_dbg_warn("failed to get GST_TAG_ALBUM_PEAK");
+ break;
+ }
+
+ _mmcam_dbg_log("Track [peak %lf, gain %lf], Album [peak %lf, gain %lf]",
+ replay_gain->track_peak, replay_gain->track_gain,
+ replay_gain->album_peak, replay_gain->album_gain);
+ }
+ break;
case GST_EVENT_SEGMENT:
_mmcam_dbg_log("[%s:%s] gots %s", GST_DEBUG_PAD_NAME(pad), GST_EVENT_TYPE_NAME(event));