From: Marcel Holtmann <marcel@holtmann.org>
To: "Frédéric Dalleau" <frederic.dalleau@linux.intel.com>
Cc: linux-bluetooth@vger.kernel.org
Subject: Re: [PATCH 06/11] Add support for mSBC frame header
Date: Thu, 18 Oct 2012 09:56:20 -0700 [thread overview]
Message-ID: <1350579380.2026.11.camel@aeonflux> (raw)
In-Reply-To: <1350576911-14678-7-git-send-email-frederic.dalleau@linux.intel.com>
Hi Fred,
> ---
> sbc/sbc.c | 225 ++++++++++++++++++++++++++++++++++++-------------------------
> 1 file changed, 135 insertions(+), 90 deletions(-)
>
> diff --git a/sbc/sbc.c b/sbc/sbc.c
> index fa90e07..8539bc6 100644
> --- a/sbc/sbc.c
> +++ b/sbc/sbc.c
> @@ -377,8 +377,8 @@ static void sbc_calculate_bits(const struct sbc_frame *frame, int (*bits)[8])
> * -3 CRC8 incorrect
> * -4 Bitpool value out of bounds
> */
> -static int sbc_unpack_frame(const uint8_t *data, struct sbc_frame *frame,
> - size_t len)
> +static int sbc_unpack_frame_internal(const uint8_t *data,
> + struct sbc_frame *frame, size_t len)
> {
> unsigned int consumed;
> /* Will copy the parts of the header that are relevant to crc
> @@ -393,59 +393,6 @@ static int sbc_unpack_frame(const uint8_t *data, struct sbc_frame *frame,
> int bits[2][8]; /* bits distribution */
> uint32_t levels[2][8]; /* levels derived from that */
>
> - if (len < 4)
> - return -1;
> -
> - if (data[0] != SBC_SYNCWORD)
> - return -2;
> -
> - frame->frequency = (data[1] >> 6) & 0x03;
> -
> - frame->block_mode = (data[1] >> 4) & 0x03;
> - switch (frame->block_mode) {
> - case SBC_BLK_4:
> - frame->blocks = 4;
> - break;
> - case SBC_BLK_8:
> - frame->blocks = 8;
> - break;
> - case SBC_BLK_12:
> - frame->blocks = 12;
> - break;
> - case SBC_BLK_16:
> - frame->blocks = 16;
> - break;
> - }
> -
> - frame->mode = (data[1] >> 2) & 0x03;
> - switch (frame->mode) {
> - case MONO:
> - frame->channels = 1;
> - break;
> - case DUAL_CHANNEL: /* fall-through */
> - case STEREO:
> - case JOINT_STEREO:
> - frame->channels = 2;
> - break;
> - }
> -
> - frame->allocation = (data[1] >> 1) & 0x01;
> -
> - frame->subband_mode = (data[1] & 0x01);
> - frame->subbands = frame->subband_mode ? 8 : 4;
> -
> - frame->bitpool = data[2];
> -
> - if ((frame->mode == MONO || frame->mode == DUAL_CHANNEL) &&
> - frame->bitpool > 16 * frame->subbands)
> - return -4;
> -
> - if ((frame->mode == STEREO || frame->mode == JOINT_STEREO) &&
> - frame->bitpool > 32 * frame->subbands)
> - return -4;
> -
> - /* data[3] is crc, we're checking it later */
> -
> consumed = 32;
>
> crc_header[0] = data[1];
> @@ -546,6 +493,88 @@ static int sbc_unpack_frame(const uint8_t *data, struct sbc_frame *frame,
> return consumed >> 3;
> }
>
> +static int sbc_unpack_frame(const uint8_t *data,
> + struct sbc_frame *frame, size_t len)
> +{
> + if (len < 4)
> + return -1;
empty line here.
> + if (data[0] != SBC_SYNCWORD)
> + return -2;
> +
> + frame->frequency = (data[1] >> 6) & 0x03;
> + frame->block_mode = (data[1] >> 4) & 0x03;
> +
> + switch (frame->block_mode) {
> + case SBC_BLK_4:
> + frame->blocks = 4;
> + break;
> + case SBC_BLK_8:
> + frame->blocks = 8;
> + break;
> + case SBC_BLK_12:
> + frame->blocks = 12;
> + break;
> + case SBC_BLK_16:
> + frame->blocks = 16;
> + break;
> + }
> +
> + frame->mode = (data[1] >> 2) & 0x03;
another empty line.
> + switch (frame->mode) {
> + case MONO:
> + frame->channels = 1;
> + break;
> + case DUAL_CHANNEL: /* fall-through */
> + case STEREO:
> + case JOINT_STEREO:
> + frame->channels = 2;
> + break;
> + }
> +
> + frame->allocation = (data[1] >> 1) & 0x01;
> +
> + frame->subband_mode = (data[1] & 0x01);
> + frame->subbands = frame->subband_mode ? 8 : 4;
> +
> + frame->bitpool = data[2];
> +
> + if ((frame->mode == MONO || frame->mode == DUAL_CHANNEL) &&
> + frame->bitpool > 16 * frame->subbands)
> + return -4;
> +
> + if ((frame->mode == STEREO || frame->mode == JOINT_STEREO) &&
> + frame->bitpool > 32 * frame->subbands)
> + return -4;
> +
> + return sbc_unpack_frame_internal(data, frame, len);
> +}
> +
> +static int msbc_unpack_frame(const uint8_t *data,
> + struct sbc_frame *frame, size_t len)
> +{
> + if (len < 4)
> + return -1;
> +
> + if (data[0] != MSBC_SYNCWORD)
> + return -2;
> + if (data[1] != 0)
> + return -5;
> + if (data[2] != 0)
> + return -6;
We have these newly invented error return code, why?
> +
> + frame->frequency = SBC_FREQ_16000;
> + frame->block_mode = SBC_BLK_4;
> + frame->blocks = MSBC_BLOCKS;
> + frame->allocation = LOUDNESS;
> + frame->mode = MONO;
> + frame->channels = 1;
> + frame->subband_mode = 1;
> + frame->subbands = 8;
> + frame->bitpool = 26;
> +
> + return sbc_unpack_frame_internal(data, frame, len);
> +}
> +
> static void sbc_decoder_init(struct sbc_decoder_state *state,
> const struct sbc_frame *frame)
> {
> @@ -792,38 +821,6 @@ static SBC_ALWAYS_INLINE ssize_t sbc_pack_frame_internal(uint8_t *data,
> uint32_t levels[2][8]; /* levels are derived from that */
> uint32_t sb_sample_delta[2][8];
>
> - data[0] = SBC_SYNCWORD;
> -
> - data[1] = (frame->frequency & 0x03) << 6;
> -
> - data[1] |= (frame->block_mode & 0x03) << 4;
> -
> - data[1] |= (frame->mode & 0x03) << 2;
> -
> - data[1] |= (frame->allocation & 0x01) << 1;
> -
> - switch (frame_subbands) {
> - case 4:
> - /* Nothing to do */
> - break;
> - case 8:
> - data[1] |= 0x01;
> - break;
> - default:
> - return -4;
> - break;
> - }
> -
> - data[2] = frame->bitpool;
> -
> - if ((frame->mode == MONO || frame->mode == DUAL_CHANNEL) &&
> - frame->bitpool > frame_subbands << 4)
> - return -5;
> -
> - if ((frame->mode == STEREO || frame->mode == JOINT_STEREO) &&
> - frame->bitpool > frame_subbands << 5)
> - return -5;
> -
> /* Can't fill in crc yet */
>
> crc_header[0] = data[1];
> @@ -891,6 +888,28 @@ static SBC_ALWAYS_INLINE ssize_t sbc_pack_frame_internal(uint8_t *data,
> static ssize_t sbc_pack_frame(uint8_t *data, struct sbc_frame *frame, size_t len,
> int joint)
> {
> + int frame_subbands = 4;
> +
> + data[0] = SBC_SYNCWORD;
> +
> + data[1] = (frame->frequency & 0x03) << 6;
> + data[1] |= (frame->block_mode & 0x03) << 4;
> + data[1] |= (frame->mode & 0x03) << 2;
> + data[1] |= (frame->allocation & 0x01) << 1;
> +
> + data[2] = frame->bitpool;
> +
> + if (frame->subbands != 4)
> + frame_subbands = 8;
> +
> + if ((frame->mode == MONO || frame->mode == DUAL_CHANNEL) &&
> + frame->bitpool > frame_subbands << 4)
> + return -5;
> +
> + if ((frame->mode == STEREO || frame->mode == JOINT_STEREO) &&
> + frame->bitpool > frame_subbands << 5)
> + return -5;
> +
> if (frame->subbands == 4) {
> if (frame->channels == 1)
> return sbc_pack_frame_internal(
> @@ -899,6 +918,7 @@ static ssize_t sbc_pack_frame(uint8_t *data, struct sbc_frame *frame, size_t len
> return sbc_pack_frame_internal(
> data, frame, len, 4, 2, joint);
> } else {
> + data[1] |= 0x01;
> if (frame->channels == 1)
> return sbc_pack_frame_internal(
> data, frame, len, 8, 1, joint);
> @@ -908,6 +928,17 @@ static ssize_t sbc_pack_frame(uint8_t *data, struct sbc_frame *frame, size_t len
> }
> }
>
> +static ssize_t msbc_pack_frame(uint8_t *data, struct sbc_frame *frame,
> + size_t len, int joint)
Indent this further to the back so it does not overlap with the function
name.
> +{
> + data[0] = MSBC_SYNCWORD;
> + data[1] = 0;
> + data[2] = 0;
> +
> + return sbc_pack_frame_internal(
> + data, frame, len, 8, 1, joint);
Don't start the second line with no argument in the first one. Break
this up a little bit nicer.
> +}
> +
> static void sbc_encoder_init(int msbc, struct sbc_encoder_state *state,
> const struct sbc_frame *frame)
> {
> @@ -924,10 +955,22 @@ struct sbc_priv {
> struct SBC_ALIGNED sbc_frame frame;
> struct SBC_ALIGNED sbc_decoder_state dec_state;
> struct SBC_ALIGNED sbc_encoder_state enc_state;
> + int (*sbc_unpack_frame)(const uint8_t *data, struct sbc_frame *frame,
> + size_t len);
> + ssize_t (*sbc_pack_frame)(uint8_t *data, struct sbc_frame *frame,
> + size_t len, int joint);
No need for a sbc_ prefix here. Just call it unpack_frame and
pack_frame.
> };
>
> static void sbc_set_defaults(sbc_t *sbc, unsigned long flags)
> {
> + struct sbc_priv *priv = sbc->priv;
empty line,
> + if (flags & SBC_MSBC) {
> + priv->sbc_pack_frame = msbc_pack_frame;
> + priv->sbc_unpack_frame = msbc_unpack_frame;
> + } else {
> + priv->sbc_pack_frame = sbc_pack_frame;
> + priv->sbc_unpack_frame = sbc_unpack_frame;
> + }
and here.
> sbc->flags = flags;
> sbc->frequency = SBC_FREQ_44100;
> sbc->mode = SBC_MODE_STEREO;
> @@ -981,7 +1024,7 @@ SBC_EXPORT ssize_t sbc_decode(sbc_t *sbc, const void *input, size_t input_len,
>
> priv = sbc->priv;
>
> - framelen = sbc_unpack_frame(input, &priv->frame, input_len);
> + framelen = priv->sbc_unpack_frame(input, &priv->frame, input_len);
>
> if (!priv->init) {
> sbc_decoder_init(&priv->dec_state, &priv->frame);
> @@ -1117,13 +1160,15 @@ SBC_EXPORT ssize_t sbc_encode(sbc_t *sbc, const void *input, size_t input_len,
> int j = priv->enc_state.sbc_calc_scalefactors_j(
> priv->frame.sb_sample_f, priv->frame.scale_factor,
> priv->frame.blocks, priv->frame.subbands);
> - framelen = sbc_pack_frame(output, &priv->frame, output_len, j);
> + framelen = priv->sbc_pack_frame(output,
> + &priv->frame, output_len, j);
> } else {
> priv->enc_state.sbc_calc_scalefactors(
> priv->frame.sb_sample_f, priv->frame.scale_factor,
> priv->frame.blocks, priv->frame.channels,
> priv->frame.subbands);
> - framelen = sbc_pack_frame(output, &priv->frame, output_len, 0);
> + framelen = priv->sbc_pack_frame(output,
> + &priv->frame, output_len, 0);
> }
>
> if (written)
Regards
Marcel
next prev parent reply other threads:[~2012-10-18 16:56 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-18 16:15 [PATCH 00/11] mSBC tests Frédéric Dalleau
2012-10-18 16:15 ` [PATCH 01/11] Pass encoder_state to process input functions Frédéric Dalleau
2012-10-18 16:50 ` Marcel Holtmann
2012-10-18 16:15 ` [PATCH 02/11] Add encoder_state parameter to analysis functions Frédéric Dalleau
2012-10-18 16:49 ` Marcel Holtmann
2012-10-18 16:15 ` [PATCH 03/11] Make increment variable Frédéric Dalleau
2012-10-18 16:48 ` Marcel Holtmann
2012-10-18 16:15 ` [PATCH 04/11] Add msbc encoding and decoding flag Frédéric Dalleau
2012-10-18 16:47 ` Marcel Holtmann
2012-10-18 16:15 ` [PATCH 05/11] Add simd primitive for 1b 8s analyse Frédéric Dalleau
2012-10-18 16:43 ` Marcel Holtmann
2012-10-18 16:15 ` [PATCH 06/11] Add support for mSBC frame header Frédéric Dalleau
2012-10-18 16:56 ` Marcel Holtmann [this message]
2012-10-18 16:15 ` [PATCH 07/11] Add mmx primitive for 1b 8s analyse Frédéric Dalleau
2012-10-18 16:15 ` [PATCH 08/11] update sbcdec for msbc Frédéric Dalleau
2012-10-18 16:15 ` [PATCH 09/11] update sbcenc " Frédéric Dalleau
2012-10-18 16:15 ` [PATCH 10/11] update sbcinfo " Frédéric Dalleau
2012-10-18 16:59 ` Marcel Holtmann
2012-10-18 16:15 ` [PATCH 11/11] Update copyrights Frédéric Dalleau
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1350579380.2026.11.camel@aeonflux \
--to=marcel@holtmann.org \
--cc=frederic.dalleau@linux.intel.com \
--cc=linux-bluetooth@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox