Mercurial > libavcodec.hg
comparison vorbis_enc.c @ 3842:5f8cfa1a6fdb libavcodec
Original Commit: r39 | ods15 | 2006-09-23 09:36:11 +0300 (Sat, 23 Sep 2006) | 2 lines
add window function
author | ods15 |
---|---|
date | Mon, 02 Oct 2006 05:56:25 +0000 |
parents | 6591b55f6482 |
children | 2fa04cd17b7e |
comparison
equal
deleted
inserted
replaced
3841:6591b55f6482 | 3842:5f8cfa1a6fdb |
---|---|
96 int channels; | 96 int channels; |
97 int sample_rate; | 97 int sample_rate; |
98 int blocksize[2]; // in (1<<n) format | 98 int blocksize[2]; // in (1<<n) format |
99 MDCTContext mdct[2]; | 99 MDCTContext mdct[2]; |
100 const float * win[2]; | 100 const float * win[2]; |
101 int have_saved; | |
101 float * saved; | 102 float * saved; |
102 float * samples; | 103 float * samples; |
103 float * floor; // also used for tmp values for mdct | 104 float * floor; // also used for tmp values for mdct |
104 float * coeffs; // also used for residue after floor | 105 float * coeffs; // also used for residue after floor |
105 | 106 |
337 | 338 |
338 // single mode | 339 // single mode |
339 venc->modes[0].blockflag = 0; | 340 venc->modes[0].blockflag = 0; |
340 venc->modes[0].mapping = 0; | 341 venc->modes[0].mapping = 0; |
341 | 342 |
343 venc->have_saved = 0; | |
342 venc->saved = av_malloc(sizeof(float) * venc->channels * (1 << venc->blocksize[1]) / 2); | 344 venc->saved = av_malloc(sizeof(float) * venc->channels * (1 << venc->blocksize[1]) / 2); |
343 venc->samples = av_malloc(sizeof(float) * venc->channels * (1 << venc->blocksize[1])); | 345 venc->samples = av_malloc(sizeof(float) * venc->channels * (1 << venc->blocksize[1])); |
344 venc->floor = av_malloc(sizeof(float) * venc->channels * (1 << venc->blocksize[1]) / 2); | 346 venc->floor = av_malloc(sizeof(float) * venc->channels * (1 << venc->blocksize[1]) / 2); |
345 venc->coeffs = av_malloc(sizeof(float) * venc->channels * (1 << venc->blocksize[1]) / 2); | 347 venc->coeffs = av_malloc(sizeof(float) * venc->channels * (1 << venc->blocksize[1]) / 2); |
346 | 348 |
609 avccontext->coded_frame->key_frame = 1; | 611 avccontext->coded_frame->key_frame = 1; |
610 | 612 |
611 return 0; | 613 return 0; |
612 } | 614 } |
613 | 615 |
616 static int window(venc_context_t * venc, signed short * audio, int samples) { | |
617 int i, j, channel; | |
618 const float * win = venc->win[0]; | |
619 int window_len = 1 << (venc->blocksize[0] - 1); | |
620 // FIXME use dsp | |
621 | |
622 if (!venc->have_saved && !samples) return 0; | |
623 | |
624 if (venc->have_saved) { | |
625 for (channel = 0; channel < venc->channels; channel++) { | |
626 memcpy(venc->samples + channel*window_len*2, venc->saved + channel*window_len, sizeof(float)*window_len); | |
627 } | |
628 } else { | |
629 for (channel = 0; channel < venc->channels; channel++) { | |
630 memset(venc->samples + channel*window_len*2, 0, sizeof(float)*window_len); | |
631 } | |
632 } | |
633 | |
634 if (samples) { | |
635 for (channel = 0; channel < venc->channels; channel++) { | |
636 float * offset = venc->saved + channel*window_len*2 + window_len; | |
637 j = channel; | |
638 for (i = 0; i < samples; i++, j += venc->channels) | |
639 offset[i] = audio[j] / 32768. * win[window_len - i]; | |
640 } | |
641 } else { | |
642 for (channel = 0; channel < venc->channels; channel++) { | |
643 memset(venc->samples + channel*window_len*2 + window_len, 0, sizeof(float)*window_len); | |
644 } | |
645 } | |
646 | |
647 for (channel = 0; channel < venc->channels; channel++) { | |
648 ff_mdct_calc(&venc->mdct[0], venc->coeffs + channel*window_len, venc->samples + channel*window_len*2, venc->floor/*tmp*/); | |
649 } | |
650 | |
651 if (samples) { | |
652 for (channel = 0; channel < venc->channels; channel++) { | |
653 j = channel; | |
654 for (i = 0; i < samples; i++, j += venc->channels) | |
655 venc->saved[i] = audio[j] / 32768. * win[i]; | |
656 } | |
657 venc->have_saved = 1; | |
658 } else { | |
659 venc->have_saved = 0; | |
660 } | |
661 return 1; | |
662 } | |
614 | 663 |
615 static int vorbis_encode_frame(AVCodecContext * avccontext, unsigned char * packets, int buf_size, void *data) | 664 static int vorbis_encode_frame(AVCodecContext * avccontext, unsigned char * packets, int buf_size, void *data) |
616 { | 665 { |
617 venc_context_t * venc = avccontext->priv_data; | 666 venc_context_t * venc = avccontext->priv_data; |
618 signed short * audio = data; | 667 signed short * audio = data; |
619 int samples = data ? avccontext->frame_size : 0; | 668 int samples = data ? avccontext->frame_size : 0; |
620 vorbis_mode_t * mode; | 669 vorbis_mode_t * mode; |
621 mapping_t * mapping; | 670 mapping_t * mapping; |
622 PutBitContext pb; | 671 PutBitContext pb; |
623 int i; | 672 int i; |
673 | |
674 if (!window(venc, audio, samples)) return 0; | |
624 | 675 |
625 init_put_bits(&pb, packets, buf_size); | 676 init_put_bits(&pb, packets, buf_size); |
626 | 677 |
627 put_bits(&pb, 1, 0); // magic bit | 678 put_bits(&pb, 1, 0); // magic bit |
628 | 679 |