All pastes #798544 Raw Edit

Untitled

public text v1 · immutable
#798544 ·published 2007-11-26 21:28 UTC
rendered paste body
Index: sbc.c
===================================================================
RCS file: /cvsroot/bluez/utils/sbc/sbc.c,v
retrieving revision 1.25
diff -u -3 -p -u -r1.25 sbc.c
--- sbc.c	23 Nov 2007 14:24:23 -0000	1.25
+++ sbc.c	26 Nov 2007 21:28:07 -0000
@@ -980,9 +980,6 @@ static int sbc_pack_frame(uint8_t *data,
 
 	u_int32_t scalefactor[2][8];	/* derived from frame->scale_factor */
 
-	if (len < 4)
-		return -1;
-
 	/* Clear first 4 bytes of data (that's the constant length part of the
 	 * SBC header) */
 	memset(data, 0, 4);
@@ -1041,11 +1038,11 @@ static int sbc_pack_frame(uint8_t *data,
 	data[2] = frame->bitpool;
 
 	if ((frame->channel_mode == MONO || frame->channel_mode == DUAL_CHANNEL) &&
-			frame->bitpool > 16 * frame->subbands)
+			frame->bitpool > frame->subbands << 4)
 		return -5;
 
 	if ((frame->channel_mode == STEREO || frame->channel_mode == JOINT_STEREO) &&
-			frame->bitpool > 32 * frame->subbands)
+			frame->bitpool > frame->subbands << 5)
 		return -5;
 
 	/* Can't fill in crc yet */
@@ -1121,31 +1118,25 @@ static int sbc_pack_frame(uint8_t *data,
 			}
 		}
 
-		if (len * 8 < produced + frame->subbands)
-			return -1;
-
 		data[4] = 0;
 		for (sb = 0; sb < frame->subbands - 1; sb++)
 			data[4] |= ((frame->join >> sb) & 0x01) << (7 - sb);
 
 		if (frame->subbands == 4)
-			crc_header[crc_pos / 8] = data[4] & 0xf0;
+			crc_header[crc_pos >> 3] = data[4] & 0xf0;
 		else
-			crc_header[crc_pos / 8] = data[4];
+			crc_header[crc_pos >> 3] = data[4];
 
 		produced += frame->subbands;
 		crc_pos += frame->subbands;
 	}
 
-	if (len * 8 < produced + (4 * frame->subbands * frame->channels))
-		return -1;
-
 	for (ch = 0; ch < frame->channels; ch++) {
 		for (sb = 0; sb < frame->subbands; sb++) {
 			if (produced % 8 == 0)
 				data[produced / 8] = 0;
-			data[produced / 8] |= ((frame->scale_factor[ch][sb] & 0x0F) << (4 - (produced % 8)));
-			crc_header[crc_pos / 8] |= ((frame->scale_factor[ch][sb] & 0x0F) << (4 - (crc_pos % 8)));
+			data[produced >> 3] |= ((frame->scale_factor[ch][sb] & 0x0F) << (4 - (produced % 8)));
+			crc_header[crc_pos >> 3] |= ((frame->scale_factor[ch][sb] & 0x0F) << (4 - (crc_pos % 8)));
 
 			produced += 4;
 			crc_pos += 4;
@@ -1171,23 +1162,15 @@ static int sbc_pack_frame(uint8_t *data,
 								levels[ch][sb]) >> 1);
 				else
 					frame->audio_sample[blk][ch][sb] = 0;
-			}
-		}
-	}
 
-	for (blk = 0; blk < frame->blocks; blk++) {
-		for (ch = 0; ch < frame->channels; ch++) {
-			for (sb = 0; sb < frame->subbands; sb++) {
 				if (bits[ch][sb] != 0) {
 					for (bit = 0; bit < bits[ch][sb]; bit++) {
 						int b;	/* A bit */
-						if (produced > len * 8)
-							return -1;
 						if (produced % 8 == 0)
-							data[produced / 8] = 0;
+							data[produced >> 3] = 0;
 						b = ((frame->audio_sample[blk][ch][sb]) >>
 								(bits[ch][sb] - bit - 1)) & 0x01;
-						data[produced / 8] |= b << (7 - (produced % 8));
+						data[produced >> 3] |= b << (7 - (produced % 8));
 						produced++;
 					}
 				}
@@ -1198,7 +1181,7 @@ static int sbc_pack_frame(uint8_t *data,
 	if (produced % 8 != 0)
 		produced += 8 - (produced % 8);
 
-	return produced / 8;
+	return produced >> 3;
 }
 
 struct sbc_priv {