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

Commit 8ba13194 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: qdsp: fix aac encoder configuration validation"

parents 89a9cf30 497a3b3f
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,