From dfb29d52279568fc9dca154bb89a36c0e7060383 Mon Sep 17 00:00:00 2001 From: Daniel Baluta Date: Tue, 13 Apr 2021 20:22:13 +0300 Subject: [PATCH] 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 --- src/audio/codec_adapter/codec/cadence.c | 23 +++++++++++++++++++ src/audio/codec_adapter/codec/generic.c | 13 +++++++++++ .../sof/audio/codec_adapter/codec/cadence.h | 1 + .../sof/audio/codec_adapter/codec/generic.h | 7 ++++++ 4 files changed, 44 insertions(+) diff --git a/src/audio/codec_adapter/codec/cadence.c b/src/audio/codec_adapter/codec/cadence.c index 977f7554a..25cb117d2 100644 --- a/src/audio/codec_adapter/codec/cadence.c +++ b/src/audio/codec_adapter/codec/cadence.c @@ -308,6 +308,28 @@ err: 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 ret; @@ -498,6 +520,7 @@ int cadence_codec_free(struct comp_dev *dev) static struct codec_interface cadence_interface = { .init = cadence_codec_init, .prepare = cadence_codec_prepare, + .get_samples = cadence_codec_get_samples, .init_process = cadence_codec_init_process, .process = cadence_codec_process, .apply_config = cadence_codec_apply_config, diff --git a/src/audio/codec_adapter/codec/generic.c b/src/audio/codec_adapter/codec/generic.c index 0f11fe09c..0e480de04 100644 --- a/src/audio/codec_adapter/codec/generic.c +++ b/src/audio/codec_adapter/codec/generic.c @@ -279,6 +279,19 @@ out: 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 ret; diff --git a/src/include/sof/audio/codec_adapter/codec/cadence.h b/src/include/sof/audio/codec_adapter/codec/cadence.h index d8bb69754..76e833eb6 100644 --- a/src/include/sof/audio/codec_adapter/codec/cadence.h +++ b/src/include/sof/audio/codec_adapter/codec/cadence.h @@ -48,6 +48,7 @@ struct cadence_codec_data { /*****************************************************************************/ int cadence_codec_init(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_process(struct comp_dev *dev); int cadence_codec_apply_config(struct comp_dev *dev); diff --git a/src/include/sof/audio/codec_adapter/codec/generic.h b/src/include/sof/audio/codec_adapter/codec/generic.h index 2609445dc..f77eae6f3 100644 --- a/src/include/sof/audio/codec_adapter/codec/generic.h +++ b/src/include/sof/audio/codec_adapter/codec/generic.h @@ -85,6 +85,12 @@ struct codec_interface { * component preparation in .prepare() */ 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_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); void codec_free_all_memory(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_process(struct comp_dev *dev); int codec_apply_runtime_config(struct comp_dev *dev);