int decode(unsigned char *address, const size_t size) { Frequency freq; RangeCoder rc; image_buf = address; image_size = size; rc_initialize(&rc, bgetc, bputc); frequency_initialize(&freq); return rc_decode(&freq, &rc); }
int rc_analyze(int port, struct rcspec *rc){ struct irspec ir; int i; int ret; int length; int index; long son[RC_SIGLEN], soff[RC_SIGLEN]; long *work; // setup required parameters ir.fd = rc_passign(port); if(ir.fd <= 0){ fprintf(stderr, "Port invalid.\n"); return -1; } ir.son = son; ir.soff = soff; ret = rc_start(&ir);// wait for first shot if(ret <= 0){ fprintf(stderr, "Illegal signal format.\n"); close(ir.fd); rc_pfree(port); return -1; } rc_record(&ir);// record signal length = ir.length;// save signal length in bits ret = rc_next(&ir);// check next shot if(ret <= 0){ rc->multi = 0; } else if((ir.repeat < ir.loff * 8 / 10) || (ir.repeat > ir.loff * 12 / 10)){ fprintf(stderr, "Repeat code was found. 2nd signal was reduced.\n" "Leader off: %dusec, standard: %dusec.\n", ir.repeat, ir.loff); rc->multi = 0; } else { ir.code = rc->code2; rc_decode(&ir); rc->multi = 1; } close(ir.fd); rc_pfree(port); //report analyze rc->lon = ir.lon; rc->loff = ir.loff; // analyze T work = (long *)calloc(length, sizeof(long)); for(i = 0; i < length; i++) work[i] = son[i]; rc->t = rc_center(work, length); // analyze H length index = 0; for(i = 0; i < length; i++){ if(rc->t * 2 < soff[i]){ work[index++] = soff[i]; } } rc->h = rc_center(work, index); // analyze L length index = 0; for(i = 0; i < length; i++){ if(rc->t * 2 >= soff[i]){ work[index++] = soff[i]; } } rc->l = rc_center(work, index); free(work); // decode signal for(i = 0; i < length; i++){ rc->code1[i / 8] <<= 1; rc->code1[i / 8] |= (rc->t * 2 < soff[i]); } rc->count1 = (length + 7) / 8; if(length % 8) fprintf(stderr, "1st shot is not filled with bit\n"); if(rc->multi){ rc->interval = ir.interval; rc->gap = ir.gap; rc->count2 = ir.count; if(ir.length % 8) fprintf(stderr, "2nd shot is not filled with bit\n"); } return 0; }
void cb_rec(Fl_Widget* widget, void* pall){ int i; char buf[80]; int ret; int length; int index; long *work; allspec *all; all = (allspec *)pall; all->ir.fd = rc_passign(all->op.port); if(all->ir.fd <= 0){ close(all->ir.fd); rc_pfree(all->op.port); all->report_buf->text("Port invalid.\nRestoration carried out.\nTry again."); return; } ret = rc_start(&all->ir); if(ret <= 0){ all->report_buf->text("Illegal signal format.\nTry again."); close(all->ir.fd); rc_pfree(all->op.port); return; } rc_record(&all->ir); length = all->ir.length; ret = rc_next(&all->ir); if(ret <= 0){ all->rc.multi = 0; } else if((all->ir.repeat < all->ir.loff * 8 / 10) || (all->ir.repeat > all->ir.loff * 12 / 10)){ fprintf(stderr, "WARNNING: Repeat code was found. 2nd signal was reducd.\n" "Leader off: %dusec, standard: %dusec.\n", all->ir.repeat, all->ir.loff); all->rc.multi = 0; } else { all->ir.code = all->rc.code2; rc_decode(&all->ir); all->rc.multi = 1; } close(all->ir.fd); rc_pfree(all->op.port); // setup all->rc all->rc.lon = all->ir.lon; all->rc.loff = all->ir.loff; for(i = 0; i < length; i++){ all->rc.code1[i / 8] <<= 1; all->rc.code1[i / 8] |= (all->ir.son[i] * 2 < all->ir.soff[i]); } all->rc.count1 = (length + 7) / 8; if(length % 8) fprintf(stderr, "WARNNING: 1st shot is not filled with bit.\n"); if(all->rc.multi){ all->rc.interval = all->ir.interval; all->rc.gap = all->ir.gap; all->rc.count2 = all->ir.count; if(all->ir.length % 8) fprintf(stderr, "WARNNING: 2nd shot is not filled with bit.\n"); } work = (long *)calloc(length, sizeof(long)); for(i = 0; i < length; i++) work[i] = all->ir.son[i]; all->rc.t = all->dist_t->setdata(length, work); index = 0; for(i = 0; i < length; i++) if(all->rc.t * 2 < all->ir.soff[i]) index++; work = (long *)calloc(index, sizeof(long)); index = 0; for(i = 0; i < length; i++) if(all->rc.t * 2 < all->ir.soff[i]) work[index++] = all->ir.soff[i]; all->rc.h = all->dist_1->setdata(index, work); index = 0; for(i = 0; i < length; i++) if(all->rc.t * 2 >= all->ir.soff[i]) index++; work = (long *)calloc(index, sizeof(long)); index = 0; for(i = 0; i < length; i++) if(all->rc.t * 2 >= all->ir.soff[i]) work[index++] = all->ir.soff[i]; all->rc.l = all->dist_0->setdata(index, work); all->wave_l->setdata(all->rc.lon, all->rc.loff); all->wave_1->setdata(all->rc.t, all->rc.h); all->wave_0->setdata(all->rc.t, all->rc.l); all->report_buf->text("Analyze complete as follows.\n\n"); if(all->rc.multi) all->report_buf->append("1st signal\n"); sprintf(buf, "Signal count: %dbytes.\n", all->rc.count1); all->report_buf->append(buf); for(i = 0; i < all->rc.count1 - 1; i++){ sprintf(buf, "%02X", all->rc.code1[i]); all->report_buf->append(buf); all->report_buf->append((i + 1) % 8 ? ", " : "\n"); } sprintf(buf, "%02X.\n\n", all->rc.code1[i]); all->report_buf->append(buf); if(all->rc.multi){ sprintf(buf, "Gap: %dusec.\n", all->rc.gap); all->report_buf->append(buf); sprintf(buf, "Interval: %dusec.\n\n", all->rc.interval); all->report_buf->append(buf); sprintf(buf, "Signal count: %dbytes.\n", all->rc.count2); all->report_buf->append(buf); for(i = 0; i < all->rc.count2 - 1; i++){ sprintf(buf, "%02X", all->rc.code2[i]); all->report_buf->append(buf); all->report_buf->append((i + 1) % 8 ? ", " : "\n"); } sprintf(buf, "%02X.\n\n", all->rc.code2[i]); all->report_buf->append(buf); } all->new_data = 1; all->btn_play->activate(); all->btn_memo->activate(); }