diff options
| author | Stefan Pöschel <github@basicmaster.de> | 2015-06-02 17:53:48 +0200 | 
|---|---|---|
| committer | Stefan Pöschel <github@basicmaster.de> | 2015-06-02 17:53:48 +0200 | 
| commit | 26d3d3435e4417bb4b8b3015fd0fd35b36104863 (patch) | |
| tree | fd68ace8f9a4d39ddf52a99af5ce2bd834130675 | |
| parent | 7d791ff4755da7bfb2e3f4a3aecbe8ad0630d365 (diff) | |
| download | ODR-AudioEnc-26d3d3435e4417bb4b8b3015fd0fd35b36104863.tar.gz ODR-AudioEnc-26d3d3435e4417bb4b8b3015fd0fd35b36104863.tar.bz2 ODR-AudioEnc-26d3d3435e4417bb4b8b3015fd0fd35b36104863.zip | |
Data Groups refactoring: DLS Data Group
| -rw-r--r-- | src/mot-encoder.cpp | 54 | 
1 files changed, 23 insertions, 31 deletions
| diff --git a/src/mot-encoder.cpp b/src/mot-encoder.cpp index 91362e1..a8efbaf 100644 --- a/src/mot-encoder.cpp +++ b/src/mot-encoder.cpp @@ -235,7 +235,7 @@ void writeMotPAD(int output_fd,          DATA_GROUP &mscdg,          unsigned short int padlen); -void create_dls_pads(const std::string& text, const int padlen, const uint8_t charset); +void create_dls_pads(const std::string& text, int padlen, uint8_t charset);  void writeDLS(int output_fd, const std::string& dls_file, int padlen, uint8_t charset, bool raw_dls);  // PAD related @@ -260,6 +260,9 @@ struct DATA_GROUP {          for (size_t i = 0; i < data.size(); i++)              crc = update_crc_ccitt(crc, data[i]);          crc = ~crc; +#if DEBUG +        fprintf(stderr, "crc=%04x ~crc=%04x\n", crc, ~crc); +#endif          data.push_back((crc & 0xFF00) >> 8);          data.push_back((crc & 0x00FF)); @@ -296,7 +299,6 @@ static int cindex_body = 0;  #define FPAD_LEN 2  #define DLS_SEG_LEN_PREFIX       2  #define DLS_SEG_LEN_CHAR_MAX    16 -#define DLS_SEG_LEN_MAX         (DLS_SEG_LEN_PREFIX + DLS_SEG_LEN_CHAR_MAX + CRC_LEN)  CharsetConverter charset_converter; @@ -1064,19 +1066,16 @@ int dls_count(const std::string& text) {  } -size_t dls_get(const std::string& text, const uint8_t charset, const unsigned int seg_index, uint8_t *seg_data) { -    int seg_count = dls_count(text); -    if (seg_index >= seg_count) -        return 0; - +DATA_GROUP dls_get(const std::string& text, uint8_t charset, unsigned int seg_index) {      bool first_seg = seg_index == 0; -    bool last_seg  = seg_index == seg_count - 1; +    bool last_seg  = seg_index == dls_count(text) - 1;      int seg_text_offset = seg_index * DLS_SEG_LEN_CHAR_MAX;      const char *seg_text_start = text.c_str() + seg_text_offset;      size_t seg_text_len = MIN(text.size() - seg_text_offset, DLS_SEG_LEN_CHAR_MAX); -    size_t seg_len = DLS_SEG_LEN_PREFIX + seg_text_len + CRC_LEN; +    DATA_GROUP dg(DLS_SEG_LEN_PREFIX + seg_text_len, 2, 3); +    uint8_vector_t &seg_data = dg.data;      // prefix: toggle? + first seg? + last seg? + (seg len - 1)      seg_data[0] = @@ -1089,31 +1088,22 @@ size_t dls_get(const std::string& text, const uint8_t charset, const unsigned in      seg_data[1] = (first_seg ? charset : seg_index) << 4;      // character field -    memcpy(seg_data + DLS_SEG_LEN_PREFIX, seg_text_start, seg_text_len); +    memcpy(&seg_data[DLS_SEG_LEN_PREFIX], seg_text_start, seg_text_len);      // CRC -    uint16_t crc = 0xFFFF; -    for (int i = 0; i < seg_len - CRC_LEN; i++) -        crc = update_crc_ccitt(crc, seg_data[i]); -    crc = ~crc; -#if DEBUG -    fprintf(stderr, "crc=%04x ~crc=%04x\n", ~crc, crc); -#endif -    seg_data[seg_len - 2] = (crc & 0xFF00) >> 8;    // HI CRC -    seg_data[seg_len - 1] =  crc & 0x00FF;          // LO CRC +    dg.AppendCRC();  #if DEBUG      fprintf(stderr, "DL segment:"); -    for (int i = 0; i < seg_len; i++) +    for (int i = 0; i < seg_data.size(); i++)          fprintf(stderr, " %02x", seg_data[i]);      fprintf(stderr, "\n");  #endif -    return seg_len; +    return dg;  } -void create_dls_pads(const std::string& text, const int padlen, const uint8_t charset) { -    uint8_t seg_data[DLS_SEG_LEN_MAX]; +void create_dls_pads(const std::string& text, int padlen, uint8_t charset) {      int xpadlengthmask = get_xpadlengthmask(padlen);      dls_pads.clear(); @@ -1125,18 +1115,18 @@ void create_dls_pads(const std::string& text, const int padlen, const uint8_t ch  #if DEBUG          fprintf(stderr, "Segment number %d\n", seg_index + 1);  #endif -        int seg_len = dls_get(text, charset, seg_index, seg_data); +        DATA_GROUP seg = dls_get(text, charset, seg_index); +        bool ci_needed = true;  // CI needed only at first data group          int dg_len;          int used_xpad_len;          // distribute the segment over one or more PADs -        for (int seg_off = 0; seg_off < seg_len;) { +        while (seg.Available()) {              dls_pads.push_back(pad_t(padlen + 1));              pad_t &pad = dls_pads.back();              int pad_off = padlen - 1;              bool var_size_pad = padlen != SHORT_PAD; -            bool ci_needed = seg_off == 0;  // CI needed only at first data group              if (ci_needed) {                  dg_len = get_xpadlength(xpadlengthmask); @@ -1146,7 +1136,7 @@ void create_dls_pads(const std::string& text, const int padlen, const uint8_t ch              } else {                  dg_len = used_xpad_len;              } -            int dg_used = MIN(dg_len, seg_len - seg_off); +            int dg_used = MIN(dg_len, seg.Available());              // F-PAD Byte L   (CI if needed) @@ -1157,15 +1147,15 @@ void create_dls_pads(const std::string& text, const int padlen, const uint8_t ch              // CI (app type 2 = DLS, start of X-PAD data group)              if (ci_needed) -                pad[pad_off--] = ((var_size_pad ? xpadlengthmask : 0) << 5) | 0x02; +                pad[pad_off--] = ((var_size_pad ? xpadlengthmask : 0) << 5) | seg.apptype_start;              // CI end marker              if (ci_needed && var_size_pad)                  pad[pad_off--] = 0x00;              // segment (part) -            for (int i = 0; i < dg_used; i++) -                pad[pad_off--] = seg_data[seg_off + i]; +            seg.WriteReversed(&pad[pad_off], dg_used); +            pad_off -= dg_used;              // NULL PADDING              std::fill_n(pad.begin(), pad_off + 1, 0x00); @@ -1179,7 +1169,9 @@ void create_dls_pads(const std::string& text, const int padlen, const uint8_t ch                  fprintf(stderr, " %02x", pad[i]);              fprintf(stderr, "\n");  #endif -            seg_off += dg_used; + +            if (ci_needed) +                ci_needed = false;          }      }  #if DEBUG | 
