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