int vdvi_decoder(uint16_t idx, u_char *decoder_state, coded_unit *c, sample *data) { int samples, len; u_char dvi_buf[80]; vdvi_state_t *v; assert(decoder_state); assert(c); assert(data); assert(idx < VDVI_NUM_FORMATS); v = (vdvi_state_t*)decoder_state; if (c->state_len > 0) { assert(c->state_len == sizeof(struct adpcm_state)); memcpy(v->as, c->state, sizeof(struct adpcm_state)); v->as->valprev = ntohs(v->as->valprev); } bs_attach(v->bs, c->data, c->data_len); len = vdvi_decode(v->bs, dvi_buf, 160); samples = cs[idx].format.bytes_per_block / sizeof(sample); adpcm_decoder(dvi_buf, data, samples, v->as); return samples; }
int main() { int i, n, coded_len, out_len, a, amp; memset(pad1, 0xff, 4); /* Memory overwrite test */ memset(pad2, 0xff, 4); memset(pad3, 0xff, 4); srandom(123213); for(n = 0; n < NUM_TESTS; n++) { amp = (random() &0x0f); for(i = 0; i< 80; i++) { a = (int)(amp * sin(M_PI * 2.0 * (float)i/16.0)); assert(abs(a) < 16); src[i] = (a << 4) & 0xf0; a = amp; assert(abs(a) < 16); src[i] |= (a & 0x0f); } memcpy(safe, src, 80); coded_len = vdvi_encode(src, 160, coded, 160); assert(!memcmp(src,safe,80)); check_padding(); out_len = vdvi_decode(coded, 160, dst, 160); assert(!memcmp(src,safe,80)); assert(!memcmp(dst,safe,80)); /* dst matches sources */ assert(coded_len == out_len); check_padding(); for(i = 0; i< 80; i++) { assert(src[i] == dst[i]); } if (0 == (n % 1000)) { printf("."); fflush(stdout); } } printf("\nTested %d frames\n", n); return 1; }
int vdvi_peek_frame_size(uint16_t idx, u_char *data, int data_len) { bitstream_t *bs; u_char dvi_buf[80]; int len; UNUSED(idx); bs_create(&bs); bs_attach(bs, data, data_len); len = vdvi_decode(bs, dvi_buf, 160); bs_destroy(&bs); assert(len <= data_len); return len; }