Beispiel #1
0
void huffman_decoder::decode_file(std::istream & ins, std::ostream & outs) {
    inbs = new ibstream(ins);
    
    chars_count = (((size_t)ins.get()) << 8) | ((size_t)ins.get());
    if (chars_count == 0) {
        return;
    }

    read_tree(ins);
    
    decode_and_write(outs);   
    
    free_resources();
}
static void
test_repair(struct s_sndfile *sf_out, 
            codec_id_t        cid,
            repair_id_t       repair_type,
            struct s_sndfile *sf_in)
{
        codec_state                *encoder;        
        struct s_codec_state_store *decoder_states;
        media_data                 *md_prev, *md_cur;
        coded_unit                 *cu;
        int32_t                     consec_lost = 0, total_lost, total_done;
        const codec_format_t       *cf;
        uint16_t                    i;
        repair_id_t                 repair_none;

        for (i = 0; i < repair_get_count(); i++) {
                const repair_details_t *rd;
                rd = repair_get_details(i);
                if (strcasecmp(rd->name, "none") == 0) {
                        repair_none = rd->id;
                        break;
                }
        }

        codec_encoder_create(cid, &encoder);
        codec_state_store_create(&decoder_states, DECODER);
        cf = codec_get_format(cid);

        /* Read and write one unit to kick off with */
        media_data_create(&md_cur, 1);
        read_and_encode(md_cur->rep[0], encoder, sf_in);
        decode_and_write(sf_out, decoder_states, md_cur);

        /* Initialize next reading cycle */
        md_prev = md_cur;
        md_cur  = NULL;
        media_data_create(&md_cur, 1);

        total_lost = total_done = 0;

        while(read_and_encode(md_cur->rep[0], encoder, sf_in)) {
                total_done++;
                if (do_drop()) {
                        total_lost++;
                        media_data_destroy(&md_cur, sizeof(media_data));
                        media_data_create(&md_cur, 0);
                        
                        cu = (coded_unit*)block_alloc(sizeof(coded_unit));
                        assert(cu != NULL);
                        memset(cu, 0, sizeof(coded_unit));

                        /* Loss happens - invoke repair */
                        if (repair_type != repair_none) {
                                cu->id = cid;
                                repair(repair_type,
                                       consec_lost,
                                       decoder_states,
                                       md_prev,
                                       cu);
                        } else {
                                
                                /* Create a silent unit */
                                cu->id = codec_get_native_coding((uint16_t)cf->format.sample_rate,
                                                                 (uint16_t)cf->format.channels);
                                cu->state     = NULL;
                                cu->state_len = 0;
                                cu->data      = (u_char*)block_alloc(cf->format.bytes_per_block);
                                cu->data_len  = cf->format.bytes_per_block;
                                memset(cu->data, 0, cu->data_len);
                        }
                        
                        /* Add repaired audio to frame */
                        md_cur->rep[md_cur->nrep] = cu;
                        md_cur->nrep++;
                        
                        consec_lost++;
                } else {
                        consec_lost = 0;
                }
                
                decode_and_write(sf_out, decoder_states, md_cur);

                media_data_destroy(&md_prev, sizeof(media_data));
                md_prev = md_cur;
                md_cur  = NULL;
                media_data_create(&md_cur, 1);
        }

        printf("# Dropped %d frames out of %d (%f loss %%)\n", total_lost, total_done, 100.0 * total_lost / (double)total_done);
        
        media_data_destroy(&md_cur, sizeof(media_data));
        media_data_destroy(&md_prev, sizeof(media_data));
        
        codec_encoder_destroy(&encoder);
        codec_state_store_destroy(&decoder_states);
}
Beispiel #3
0
bool reedSolomonCoder::decode(QByteArray &ba,QString fn,QString &newFileName,QByteArray &baFile,QString extension,QList<int> &erasuresArray)
{

  int i,j;
  int startOfSegment,row;
//  QByteArray *t;

  init();
//  qDebug() << "size of ba" << ba.size();
  origFileName=fn;
  fpin.setFileName(fn);

  if(extension=="rs1") fileType=RST1;
  else if(extension=="rs2") fileType=RST2;
  else if(extension=="rs3") fileType=RST3;
  else if(extension=="rs4") fileType=RST4;
  else
    {
      return FALSE;
    }
  tr_buf=ba;
  got=tr_buf.size();
  bep_size = got/RSBSIZE;
  if (got % RSBSIZE)
    {
      bep_size++ ;
      tr_buf=tr_buf.leftJustified(bep_size*RSBSIZE,'\0');
    }
//  qDebug() << "got" << got << "bep_size" << bep_size;
  int rest=tr_buf.count()%64;
   if(rest!=0)
     {
       tr_buf=tr_buf.leftJustified(bep_size*RSBSIZE+(64-rest),'\0');
//       qDebug() << "size of tr_buf extended" << tr_buf.count();

   }
  ec_buf.resize(bep_size*RSBSIZE);
  bk_buf.resize(bep_size*RSBSIZE);

  rs_bsize=RSBSIZE;
  switch (fileType)
    {
    case RST1: rs_dsize=RSDSIZERS1; break;
    case RST2: rs_dsize=RSDSIZERS2; break;
    case RST3: rs_dsize=RSDSIZERS3; break;
    case RST4: rs_dsize=RSDSIZERS4; break;
    case RSTNONE: return FALSE;
    }
  init_rs(rs_dsize);
  // setup erasure info
  numMissing=0;
  if(erasuresArray.count()>2)  // we have erasure positions
    {
      totalSegments=erasuresArray.at(0);
      segmentLength=erasuresArray.at(1);
      numMissing=erasuresArray.count()-2;
//      qDebug() << "numMissing" << numMissing;
      if(zeroPositions) delete zeroPositions;
      if(newZeroPositions) delete newZeroPositions;
      zeroPositions=new int[segmentLength*(totalSegments+1)];
      newZeroPositions=new int[256*bep_size];
//      qDebug() << "newZeroPositions len" << (segmentLength*(totalSegments+1));
      for(i=0;i<(segmentLength*totalSegments);i++) zeroPositions[i]=-1;
    }
  else
    {
      qDebug() << "no erasure info";
      return FALSE;
    }
  /* now label the erasures positions */
  for (i= 0 ; i < numMissing; i++)
    {
      startOfSegment = erasuresArray.at(i+2)*segmentLength ;  // +2 because of header in array
      for (j=0; j < segmentLength ; j++)
        {
          row = (startOfSegment +j ) / bep_size;
          /* if ( row < rs_dsize)  */
          zeroPositions[startOfSegment+j] = row;
        }
    }
  /*  distribute version pa0mbo for the indexes */
  int *pointzero=newZeroPositions;
  for (i=0; i < bep_size ; i++)
    {
      for (j=0; j < 255 ; j++)
        {
          *(pointzero++) = *(zeroPositions + j*bep_size + i);
        }
    }

  distribute((byte *)tr_buf.data(),(byte *)ec_buf.data(),bep_size,rs_bsize,DECODE);
  if(!decode_and_write())
    {
//      fpout.close();
      return FALSE;
    }
  //  fpin.close();
//  fpout.close();
//  tr_buf=ec_buf;
  if(uncorrectableFailures>0) return FALSE;
//  if(fpout.open(QIODevice::ReadOnly)<=0) return FALSE;
//  tr_buf=fpout.readAll();
  if (bep_size != (((unsigned char) tr_buf[1]) + ((unsigned char) tr_buf[2])*256 ))
    {
      qDebug()<< "problems with bep_size coded in file";
      qDebug() << "bep_size: " << bep_size <<" coded size: " << (((unsigned char) tr_buf[1]) + ((unsigned char) tr_buf[2])*256 ) ;
      qDebug() << "bep_sizeaa: " << bep_size <<" coded size: " << (((unsigned char) ba[1]) + ((unsigned char)ba[2])*256 ) ;
      return FALSE;
    }
  coded_file_size = bep_size*rs_dsize - (int)tr_buf[0];
  strncpy(coded_file_ext, tr_buf.data()+3,3);
  coded_file_ext[3]=0;


  QFileInfo fileInfo(origFileName);
  QString baseName=rxImagesPath+"/"+fileInfo.completeBaseName();
  baseName.append(".");
  baseName.append(coded_file_ext);

//  qDebug() <<" new filename: " << baseName;
//  qDebug() << "tr_buf count before truncation: " << tr_buf.count();
  tr_buf=tr_buf.right(tr_buf.count()-7);
  tr_buf=tr_buf.left(coded_file_size);
//  qDebug() << "coded_file_size: " << coded_file_size << "tr_buf count: " << tr_buf.count();

  newFileName=baseName;
//  t=&tr_buf;
  baFile=tr_buf;
//  fpout.close();
  if(uncorrectableFailures>0)
    {
//      qDebug() <<"uncorrectable failures:" << uncorrectableFailures;
      return FALSE;
    }

  return TRUE;
}