codec_adapter: Introduce get_samples interface

This codec_adapter interface will return the number
of samples expected after decoding one compressed input frame.

This is optional. For codecs which do not care, this will return 0.
Do not care means that the number of input samples is equal with the
number of output samples after processing is done.

This will be used in the next patch to determine if the local output
buffer has enough space to copy the decoded samples.

Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
This commit is contained in:
Daniel Baluta 2021-04-13 20:22:13 +03:00 committed by Liam Girdwood
parent da9a5ebe24
commit dfb29d5227
4 changed files with 44 additions and 0 deletions

View File

@ -308,6 +308,28 @@ err:
return ret; return ret;
} }
int cadence_codec_get_samples(struct comp_dev *dev)
{
struct codec_data *codec = comp_get_codec(dev);
uint32_t api_id = CODEC_GET_API_ID(codec->id);
comp_dbg(dev, "cadence_codec_get_samples() start");
switch (api_id) {
case CADENCE_CODEC_WRAPPER_ID:
return 0;
case CADENCE_CODEC_MP3_DEC_ID:
/* MPEG-1 Layer 3 */
return 1152;
case CADENCE_CODEC_AAC_DEC_ID:
return 1024;
default:
break;
}
return 0;
}
int cadence_codec_init_process(struct comp_dev *dev) int cadence_codec_init_process(struct comp_dev *dev)
{ {
int ret; int ret;
@ -498,6 +520,7 @@ int cadence_codec_free(struct comp_dev *dev)
static struct codec_interface cadence_interface = { static struct codec_interface cadence_interface = {
.init = cadence_codec_init, .init = cadence_codec_init,
.prepare = cadence_codec_prepare, .prepare = cadence_codec_prepare,
.get_samples = cadence_codec_get_samples,
.init_process = cadence_codec_init_process, .init_process = cadence_codec_init_process,
.process = cadence_codec_process, .process = cadence_codec_process,
.apply_config = cadence_codec_apply_config, .apply_config = cadence_codec_apply_config,

View File

@ -279,6 +279,19 @@ out:
return ret; return ret;
} }
int codec_get_samples(struct comp_dev *dev)
{
struct comp_data *cd = comp_get_drvdata(dev);
struct codec_data *codec = &cd->codec;
comp_dbg(dev, "codec_get_samples()");
if (codec->ops->get_samples)
return codec->ops->get_samples(dev);
return 0;
}
int codec_apply_runtime_config(struct comp_dev *dev) int codec_apply_runtime_config(struct comp_dev *dev)
{ {
int ret; int ret;

View File

@ -48,6 +48,7 @@ struct cadence_codec_data {
/*****************************************************************************/ /*****************************************************************************/
int cadence_codec_init(struct comp_dev *dev); int cadence_codec_init(struct comp_dev *dev);
int cadence_codec_prepare(struct comp_dev *dev); int cadence_codec_prepare(struct comp_dev *dev);
int cadence_codec_get_samples(struct comp_dev *dev);
int cadence_codec_init_process(struct comp_dev *dev); int cadence_codec_init_process(struct comp_dev *dev);
int cadence_codec_process(struct comp_dev *dev); int cadence_codec_process(struct comp_dev *dev);
int cadence_codec_apply_config(struct comp_dev *dev); int cadence_codec_apply_config(struct comp_dev *dev);

View File

@ -85,6 +85,12 @@ struct codec_interface {
* component preparation in .prepare() * component preparation in .prepare()
*/ */
int (*prepare)(struct comp_dev *dev); int (*prepare)(struct comp_dev *dev);
/**
* Codec specific. Returns the number of PCM output
* samples after decoding one input compressed frame.
* Codecs will return 0 for don't care.
*/
int (*get_samples)(struct comp_dev *dev);
/** /**
* Codec specific init processing procedure, called as a part of * Codec specific init processing procedure, called as a part of
* codec_adapter component copy in .copy(). Typically in this * codec_adapter component copy in .copy(). Typically in this
@ -248,6 +254,7 @@ void *codec_allocate_memory(struct comp_dev *dev, uint32_t size,
int codec_free_memory(struct comp_dev *dev, void *ptr); int codec_free_memory(struct comp_dev *dev, void *ptr);
void codec_free_all_memory(struct comp_dev *dev); void codec_free_all_memory(struct comp_dev *dev);
int codec_prepare(struct comp_dev *dev); int codec_prepare(struct comp_dev *dev);
int codec_get_samples(struct comp_dev *dev);
int codec_init_process(struct comp_dev *dev); int codec_init_process(struct comp_dev *dev);
int codec_process(struct comp_dev *dev); int codec_process(struct comp_dev *dev);
int codec_apply_runtime_config(struct comp_dev *dev); int codec_apply_runtime_config(struct comp_dev *dev);