This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/osmocom-net-gprs@lists.osmocom.org/.
Max msuraev at sysmocom.deHi.
Thanks for your contribution. Could you please elaborate on the intent
of this function? Can we replace existing osmo_t4_encode() with it?
Having couple of test cases would be helpful in understanding what this
function do and how it's supposed to be used.
On 04/11/2016 02:48 PM, sangamesh sajjan wrote:
> This patch includes the changes for compression algorithm and the
> compression is carried out using T.4 run length coding and
> the code words used are based on 3GPP 44.060
> ---
> include/osmocom/core/bitcomp.h | 7 +++
> src/bitcomp.c | 129 ++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 136 insertions(+)
>
> diff --git a/include/osmocom/core/bitcomp.h b/include/osmocom/core/bitcomp.h
> index 89eccbc..c5c223c 100644
> --- a/include/osmocom/core/bitcomp.h
> +++ b/include/osmocom/core/bitcomp.h
> @@ -39,4 +39,11 @@
> int osmo_t4_encode(struct bitvec *bv);
> int osmo_t4_decode(const struct bitvec *in, bool cc, struct bitvec *out);
>
> +#define MOD64(X) ((X + 64) & 0x3F)
> +int osmo_bitmap_compress(
> + struct bitvec *rbb_vec,
> + uint16_t *ucmp_bmplen, //Uncompressed bitmap len
> + uint8_t *cmp_bmplen, //Compressed bitmap len
> + uint8_t *crbb_bitmap //Compressed bitmap
> + );
> /*! @} */
> diff --git a/src/bitcomp.c b/src/bitcomp.c
> index bf35927..f3326b2 100644
> --- a/src/bitcomp.c
> +++ b/src/bitcomp.c
> @@ -476,5 +476,134 @@ int osmo_t4_encode(struct bitvec *bv)
> }
> return -1;
> }
> +void compress_bitmap(
> + uint16_t *run_len_cnt, /* cnt: run length count */
> + uint16_t *codewrd_bitmap, /* code word */
> + uint8_t *codewrd_len, /* number of bits in the code word */
> + uint8_t *cbmbuf, /* bitmap buffer to put code word in */
> + uint16_t *cstrtbits, /* start bits to put codeword. start from
> + * 0, the first bit in the first octets
> + * and increment without octets
> + * consideration. i.e. can be more than 7.
> + */
> + uint8_t *cstrtocts, /* start octets to put codeword. start from 0*/
> + uint8_t clr_code)
> +{
> + int i = 0;
> + uint16_t bitsleft = 0;
> + uint16_t temp = 0;
> + *codewrd_bitmap = 0;
> + *codewrd_len = 0;
> +
> + if ((*run_len_cnt) >= 64) {
> + for (i = 0; i < 15; i++) {
> + if (t4_make_up_ind[i] == *run_len_cnt) {
> + *codewrd_bitmap = t4_make_up[clr_code][i];
> + *codewrd_len = t4_make_up_length[clr_code][i];
> + }
> + }
> + } else {
> + *codewrd_bitmap = t4_term[clr_code][*run_len_cnt];
> + *codewrd_len = t4_term_length[clr_code][*run_len_cnt];
> + }
> + bitsleft = *codewrd_len;
> + /* Move the codeword_bitmap to left in two bytes*/
> + (*codewrd_bitmap) = (*codewrd_bitmap)<<(16-(*codewrd_len));
> +
> + while (bitsleft != 0) {
> + /* Bring left most bits to right and start shifting by cstrtbits,
> + * we get each bit to update in compressed buffer
> + */
> + temp = (((*codewrd_bitmap) & 0x8000)>>15)<<(7-(*cstrtbits));
> + cbmbuf[*cstrtocts] = cbmbuf[*cstrtocts]|temp;
> +
> + (*codewrd_bitmap) = (*codewrd_bitmap)<<1;
> + (*cstrtbits)++;
> + bitsleft--;
> + if ((*cstrtbits) >= 8) {
> + (*cstrtbits) = (*cstrtbits)-8;
> + (*cstrtocts)++;
> + /* init buf */
> + cbmbuf[*cstrtocts] = 0x00;
> + }
> + }
> +}
> +
> +int osmo_bitmap_compress(
> + struct bitvec *rbb_vec,
> + uint16_t *ucmp_bmplen, /* Uncompressed bitmap len */
> + uint8_t *cmp_bmplen, /* Compressed bitmap len */
> + uint8_t *crbb_bitmap /* Compressed bitmap */
> + )
> +{
>
> + char run_len_bit;
> + int buflen = *ucmp_bmplen;
> + uint16_t rlen;
> + uint16_t temprl = 0;
> + uint16_t cbmap; /* Compressed code word */
> + uint8_t nbits; /* Length of code word */
> + uint16_t cstrtbits = 0;
> + uint8_t cstrtocts = 0;
> + uint16_t uclen = 0;
> + uint8_t clen = 0;
> + uint8_t clr_code = 0;
> +
> + run_len_bit = (rbb_vec->data[0] & 0x80)>>7;
> + while (buflen > 0) {
> + temprl = 0;
> + /* Find Run length */
> + if (run_len_bit == 1)
> + rlen = bitvec_rl(rbb_vec, true);
> + else
> + rlen = bitvec_rl(rbb_vec, false);
> +
> + buflen = buflen - rlen;
> + /* if rlen> 64 need 2 code words */
> + //Compress the bits
> + if (run_len_bit == 0) {
> + if (rlen >= 64) {
> + temprl = (rlen/64)*64;
> + compress_bitmap(&temprl, &cbmap, &nbits,
> + crbb_bitmap, &cstrtbits,
> + &cstrtocts, clr_code);
> + }
> + temprl = MOD64(rlen);
> + compress_bitmap(&temprl,
> + &cbmap, &nbits, crbb_bitmap,
> + &cstrtbits, &cstrtocts, clr_code);
> +
> + /* next time the run length will be Ones */
> + run_len_bit = 1;
> + } else {
> + if (rlen >= 64) {
> + temprl = (rlen/64)*64;
> + clr_code = 1;
> + compress_bitmap(&temprl, &cbmap,
> + &nbits, crbb_bitmap,
> + &cstrtbits, &cstrtocts,
> + clr_code);
> + }
> + temprl = MOD64(rlen);
> + compress_bitmap(&temprl, &cbmap,
> + &nbits, crbb_bitmap,
> + &cstrtbits, &cstrtocts, clr_code);
> +
> + /* next time the run length will be Zeros */
> + run_len_bit = 0;
> + }
> + uclen = uclen + (rlen);
> + clen = clen + nbits;
> + }
> + *cmp_bmplen = clen;
>
> + if (clen >= uclen) {
> + /* No Gain is observed, So no need to compress, copy original
> + * bitmap in uncompressed bitmap
> + */
> + return 0;
> + } else {
> + /* Add compressed bitmap to final buffer */
> + return 1;
> + }
> +}
--
Max Suraev <msuraev at sysmocom.de> http://www.sysmocom.de/
=======================================================================
* sysmocom - systems for mobile communications GmbH
* Alt-Moabit 93
* 10559 Berlin, Germany
* Sitz / Registered office: Berlin, HRB 134158 B
* Geschaeftsfuehrer / Managing Directors: Holger Freyther, Harald Welte