Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 497a3b3f authored by Dhananjay Kumar's avatar Dhananjay Kumar
Browse files

msm: qdsp: fix aac encoder configuration validation



Unsupported encoder configuration was getting forwarded to
DSP causing encode failure at latter stage.
Corrected encoder validation logic which would throw
error for unsupported configuration values and would use
default conf in such cases, preventing failure at latter
stage where error from dsp cannot be handled gracefully.
Also updated userspace to driver format mapping.

CRs-Fixed: 621150
Change-Id: Id049425ac12fa076ad2891f563da67a103630383
Signed-off-by: default avatarDhananjay Kumar <dhakumar@codeaurora.org>
parent 5830ea78
Loading
Loading
Loading
Loading
+46 −13
Original line number Diff line number Diff line
/*
 * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
 * Copyright (c) 2010-2014, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -160,9 +160,22 @@ static long aac_in_ioctl(struct file *file,
			cfg.channels = 2;
		cfg.sample_rate = enc_cfg->sample_rate;
		cfg.bit_rate = enc_cfg->bit_rate;
		/* ADTS(-1) to ADTS(0x00), RAW(0x00) to RAW(0x03) */
		cfg.stream_format = ((enc_cfg->stream_format == \
			0x00) ? AUDIO_AAC_FORMAT_ADTS : AUDIO_AAC_FORMAT_RAW);

		switch (enc_cfg->stream_format) {
		case 0x00:
			cfg.stream_format = AUDIO_AAC_FORMAT_ADTS;
			break;
		case 0x01:
			cfg.stream_format = AUDIO_AAC_FORMAT_LOAS;
			break;
		case 0x02:
			cfg.stream_format = AUDIO_AAC_FORMAT_ADIF;
			break;
		default:
		case 0x03:
			cfg.stream_format = AUDIO_AAC_FORMAT_RAW;
		}

		pr_debug("%s:session id %d: Get-aac-cfg: format=%d sr=%d"
			"bitrate=%d\n", __func__, audio->ac->session,
			cfg.stream_format, cfg.sample_rate, cfg.bit_rate);
@@ -173,6 +186,7 @@ static long aac_in_ioctl(struct file *file,
	case AUDIO_SET_AAC_ENC_CONFIG: {
		struct msm_audio_aac_enc_config cfg;
		struct msm_audio_aac_enc_config *enc_cfg;
		uint32_t min_bitrate, max_bitrate;
		enc_cfg = audio->enc_cfg;
		if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) {
			rc = -EFAULT;
@@ -181,10 +195,23 @@ static long aac_in_ioctl(struct file *file,
		pr_debug("%s:session id %d: Set-aac-cfg: stream=%d\n", __func__,
					audio->ac->session, cfg.stream_format);

		if ((cfg.stream_format != AUDIO_AAC_FORMAT_RAW)  &&
			(cfg.stream_format != AAC_FORMAT_ADTS)) {
			pr_err("%s:session id %d: unsupported AAC format\n",
				__func__, audio->ac->session);
		switch (cfg.stream_format) {
		case AUDIO_AAC_FORMAT_ADTS:
			enc_cfg->stream_format = 0x00;
			break;
		case AUDIO_AAC_FORMAT_LOAS:
			enc_cfg->stream_format = 0x01;
			break;
		case AUDIO_AAC_FORMAT_ADIF:
			enc_cfg->stream_format = 0x02;
			break;
		case AUDIO_AAC_FORMAT_RAW:
			enc_cfg->stream_format = 0x03;
			break;
		default:
			pr_err("%s:session id %d: unsupported AAC format %d\n",
				__func__, audio->ac->session,
				cfg.stream_format);
			rc = -EINVAL;
			break;
		}
@@ -197,7 +224,7 @@ static long aac_in_ioctl(struct file *file,
			rc = -EINVAL;
			break;
		}
		if ((cfg.sample_rate < 8000) && (cfg.sample_rate > 48000)) {
		if ((cfg.sample_rate < 8000) || (cfg.sample_rate > 48000)) {
			pr_err("%s: ERROR in setting samplerate = %d\n",
				__func__, cfg.sample_rate);
			rc = -EINVAL;
@@ -206,7 +233,16 @@ static long aac_in_ioctl(struct file *file,
		/* For aac-lc, min_bit_rate = min(24Kbps, 0.5*SR*num_chan);
		max_bi_rate = min(192Kbps, 6*SR*num_chan);
		min_sample_rate = 8000Hz, max_rate=48000 */
		if ((cfg.bit_rate < 4000) || (cfg.bit_rate > 192000)) {
		min_bitrate = ((cfg.sample_rate)*(cfg.channels))/2;
		if (min_bitrate < 24000)
			min_bitrate = 24000;
		max_bitrate = 6*(cfg.sample_rate)*(cfg.channels);
		if (max_bitrate > 192000)
			max_bitrate = 192000;
		if ((cfg.bit_rate < min_bitrate) ||
					(cfg.bit_rate > max_bitrate)) {
			pr_err("%s: bitrate permissible: max=%d, min=%d\n",
				__func__, max_bitrate, min_bitrate);
			pr_err("%s: ERROR in setting bitrate = %d\n",
				__func__, cfg.bit_rate);
			rc = -EINVAL;
@@ -215,9 +251,6 @@ static long aac_in_ioctl(struct file *file,
		enc_cfg->sample_rate = cfg.sample_rate;
		enc_cfg->channels = cfg.channels;
		enc_cfg->bit_rate = cfg.bit_rate;
		enc_cfg->stream_format =
			((cfg.stream_format == AUDIO_AAC_FORMAT_RAW) ? \
								0x03 : 0x00);
		pr_debug("%s:session id %d: Set-aac-cfg:SR= 0x%x ch=0x%x"
			"bitrate=0x%x, format(adts/raw) = %d\n",
			__func__, audio->ac->session, enc_cfg->sample_rate,