int getpixelrow(float *pixelv) { static float pixels[PixelLine + SyncFilterLen]; static int npv = 0; static int synced = 0; static double max = 0.0; double corr, ecorr, lcorr; int res; if (npv > 0) memmove(pixelv, pixels, npv * sizeof(float)); if (npv < SyncFilterLen + 2) { res = getpixelv(&(pixelv[npv]), SyncFilterLen + 2 - npv); npv += res; if (npv < SyncFilterLen + 2) return (0); } /* test sync */ ecorr = fir(pixelv, Sync, SyncFilterLen); corr = fir(&(pixelv[1]), Sync, SyncFilterLen); lcorr = fir(&(pixelv[2]), Sync, SyncFilterLen); FreqLine = 1.0+((ecorr-lcorr) / corr / PixelLine / 4.0); if (corr < 0.75 * max) { synced = 0; FreqLine = 1.0; } max = corr; if (synced < 8) { int shift, mshift; if (npv < PixelLine + SyncFilterLen) { res = getpixelv(&(pixelv[npv]), PixelLine + SyncFilterLen - npv); npv += res; if (npv < PixelLine + SyncFilterLen) return (0); } /* lookup sync start */ mshift = 0; for (shift = 1; shift < PixelLine; shift++) { double corr; corr = fir(&(pixelv[shift + 1]), Sync, SyncFilterLen); if (corr > max) { mshift = shift; max = corr; } } if (mshift != 0) { memmove(pixelv, &(pixelv[mshift]), (npv - mshift) * sizeof(float)); npv -= mshift; synced = 0; FreqLine = 1.0; } else synced += 1; } if (npv < PixelLine) { res = getpixelv(&(pixelv[npv]), PixelLine - npv); npv += res; if (npv < PixelLine) return (0); } if (npv == PixelLine) { npv = 0; } else { memmove(pixels, &(pixelv[PixelLine]), (npv - PixelLine) * sizeof(float)); npv -= PixelLine; } return (1); }
int apt_decode(apt_t *apt, buffer_t *sound_buffer, float *pixels_out) { double corr, ecorr, lcorr; float pixelv[APT_IMG_WIDTH + SyncFilterLen] = {}; int res; int npv = apt->num_leftover_pixels; if (apt->num_leftover_pixels > 0) { memmove(pixelv, apt->leftover_pixels, npv * sizeof(float)); apt->num_leftover_pixels = 0; } if (npv < SyncFilterLen + 2) { res = getpixelv(sound_buffer, apt, &(pixelv[npv]), SyncFilterLen + 2 - npv); npv += res; if (npv < SyncFilterLen + 2) return (0); } /* test sync */ corr = fir(&(pixelv[1]), Sync, SyncFilterLen); ecorr = fir(pixelv, Sync, SyncFilterLen); lcorr = fir(&(pixelv[2]), Sync, SyncFilterLen); apt->FreqLine = 1.0 + (ecorr - lcorr) / corr / APT_IMG_WIDTH / 4.0; if (corr <= 0.75 * apt->last_max_correlation) { apt->synced = 0; apt->FreqLine = 1.0; } apt->last_max_correlation = corr; if (apt->synced < 8) { int shift, mshift; if (npv < APT_IMG_WIDTH + SyncFilterLen) { res = getpixelv(sound_buffer, apt, &(pixelv[npv]), APT_IMG_WIDTH + SyncFilterLen - npv); npv += res; if (npv < APT_IMG_WIDTH + SyncFilterLen) return (0); } /* lookup sync start */ mshift = 0; for (shift = 1; shift < APT_IMG_WIDTH; shift++) { double corr; corr = fir(&(pixelv[shift + 1]), Sync, SyncFilterLen); if (corr > apt->last_max_correlation) { mshift = shift; apt->last_max_correlation = corr; } } if (mshift != 0) { memmove(pixelv, &(pixelv[mshift]), (npv - mshift) * sizeof(float)); npv -= mshift; apt->synced = 0; apt->FreqLine = 1.0; } else apt->synced += 1; } if (npv < APT_IMG_WIDTH) { res = getpixelv(sound_buffer, apt, &(pixelv[npv]), APT_IMG_WIDTH - npv); npv += res; if (npv < APT_IMG_WIDTH) return (0); } if (npv == APT_IMG_WIDTH) { npv = 0; } else { memmove(apt->leftover_pixels, &(pixelv[APT_IMG_WIDTH]), (npv - APT_IMG_WIDTH) * sizeof(float)); apt->num_leftover_pixels = npv - APT_IMG_WIDTH; } memcpy(pixels_out, pixelv, APT_IMG_WIDTH*sizeof(float)); return (1); }