comparison vorbis_enc.c @ 3859:0d0bd4b2baef libavcodec

Original Commit: r59 | ods15 | 2006-09-24 17:40:40 +0300 (Sun, 24 Sep 2006) | 2 lines cosmetic, reorganize
author ods15
date Mon, 02 Oct 2006 06:07:44 +0000
parents 70b4bc721531
children be0344cea4ea
comparison
equal deleted inserted replaced
3858:70b4bc721531 3859:0d0bd4b2baef
594 p += hlens[i]; 594 p += hlens[i];
595 buffer_len += hlens[i]; 595 buffer_len += hlens[i];
596 } 596 }
597 597
598 return p - *out; 598 return p - *out;
599 }
600
601 static int vorbis_encode_init(AVCodecContext * avccontext)
602 {
603 venc_context_t * venc = avccontext->priv_data;
604
605 create_vorbis_context(venc, avccontext);
606
607 //if (avccontext->flags & CODEC_FLAG_QSCALE) avccontext->global_quality / (float)FF_QP2LAMBDA); else avccontext->bit_rate;
608 //if(avccontext->cutoff > 0) cfreq = avccontext->cutoff / 1000.0;
609
610 avccontext->extradata_size = put_main_header(venc, (uint8_t**)&avccontext->extradata);
611
612 avccontext->frame_size = 1 << (venc->blocksize[0] - 1);
613
614 avccontext->coded_frame = avcodec_alloc_frame();
615 avccontext->coded_frame->key_frame = 1;
616
617 return 0;
618 }
619
620 static int window(venc_context_t * venc, signed short * audio, int samples) {
621 int i, j, channel;
622 const float * win = venc->win[0];
623 int window_len = 1 << (venc->blocksize[0] - 1);
624 float n = (float)(1 << venc->blocksize[0]) / 4.;
625 // FIXME use dsp
626
627 if (!venc->have_saved && !samples) return 0;
628
629 if (venc->have_saved) {
630 for (channel = 0; channel < venc->channels; channel++) {
631 memcpy(venc->samples + channel*window_len*2, venc->saved + channel*window_len, sizeof(float)*window_len);
632 }
633 } else {
634 for (channel = 0; channel < venc->channels; channel++) {
635 memset(venc->samples + channel*window_len*2, 0, sizeof(float)*window_len);
636 }
637 }
638
639 if (samples) {
640 for (channel = 0; channel < venc->channels; channel++) {
641 float * offset = venc->samples + channel*window_len*2 + window_len;
642 j = channel;
643 for (i = 0; i < samples; i++, j += venc->channels)
644 offset[i] = audio[j] / 32768. * win[window_len - i] / n;
645 }
646 } else {
647 for (channel = 0; channel < venc->channels; channel++) {
648 memset(venc->samples + channel*window_len*2 + window_len, 0, sizeof(float)*window_len);
649 }
650 }
651
652 for (channel = 0; channel < venc->channels; channel++) {
653 ff_mdct_calc(&venc->mdct[0], venc->coeffs + channel*window_len, venc->samples + channel*window_len*2, venc->floor/*tmp*/);
654 }
655
656 if (samples) {
657 for (channel = 0; channel < venc->channels; channel++) {
658 float * offset = venc->saved + channel*window_len;
659 j = channel;
660 for (i = 0; i < samples; i++, j += venc->channels)
661 offset[i] = audio[j] / 32768. * win[i] / n;
662 }
663 venc->have_saved = 1;
664 } else {
665 venc->have_saved = 0;
666 }
667 return 1;
668 } 599 }
669 600
670 static float * put_vector(codebook_t * book, PutBitContext * pb, float * num) { 601 static float * put_vector(codebook_t * book, PutBitContext * pb, float * num) {
671 int i; 602 int i;
672 int entry = -1; 603 int entry = -1;
726 } 657 }
727 } 658 }
728 } 659 }
729 } 660 }
730 661
662 static int window(venc_context_t * venc, signed short * audio, int samples) {
663 int i, j, channel;
664 const float * win = venc->win[0];
665 int window_len = 1 << (venc->blocksize[0] - 1);
666 float n = (float)(1 << venc->blocksize[0]) / 4.;
667 // FIXME use dsp
668
669 if (!venc->have_saved && !samples) return 0;
670
671 if (venc->have_saved) {
672 for (channel = 0; channel < venc->channels; channel++) {
673 memcpy(venc->samples + channel*window_len*2, venc->saved + channel*window_len, sizeof(float)*window_len);
674 }
675 } else {
676 for (channel = 0; channel < venc->channels; channel++) {
677 memset(venc->samples + channel*window_len*2, 0, sizeof(float)*window_len);
678 }
679 }
680
681 if (samples) {
682 for (channel = 0; channel < venc->channels; channel++) {
683 float * offset = venc->samples + channel*window_len*2 + window_len;
684 j = channel;
685 for (i = 0; i < samples; i++, j += venc->channels)
686 offset[i] = audio[j] / 32768. * win[window_len - i] / n;
687 }
688 } else {
689 for (channel = 0; channel < venc->channels; channel++) {
690 memset(venc->samples + channel*window_len*2 + window_len, 0, sizeof(float)*window_len);
691 }
692 }
693
694 for (channel = 0; channel < venc->channels; channel++) {
695 ff_mdct_calc(&venc->mdct[0], venc->coeffs + channel*window_len, venc->samples + channel*window_len*2, venc->floor/*tmp*/);
696 }
697
698 if (samples) {
699 for (channel = 0; channel < venc->channels; channel++) {
700 float * offset = venc->saved + channel*window_len;
701 j = channel;
702 for (i = 0; i < samples; i++, j += venc->channels)
703 offset[i] = audio[j] / 32768. * win[i] / n;
704 }
705 venc->have_saved = 1;
706 } else {
707 venc->have_saved = 0;
708 }
709 return 1;
710 }
711
712 static int vorbis_encode_init(AVCodecContext * avccontext)
713 {
714 venc_context_t * venc = avccontext->priv_data;
715
716 create_vorbis_context(venc, avccontext);
717
718 //if (avccontext->flags & CODEC_FLAG_QSCALE) avccontext->global_quality / (float)FF_QP2LAMBDA); else avccontext->bit_rate;
719 //if(avccontext->cutoff > 0) cfreq = avccontext->cutoff / 1000.0;
720
721 avccontext->extradata_size = put_main_header(venc, (uint8_t**)&avccontext->extradata);
722
723 avccontext->frame_size = 1 << (venc->blocksize[0] - 1);
724
725 avccontext->coded_frame = avcodec_alloc_frame();
726 avccontext->coded_frame->key_frame = 1;
727
728 return 0;
729 }
730
731 static int vorbis_encode_frame(AVCodecContext * avccontext, unsigned char * packets, int buf_size, void *data) 731 static int vorbis_encode_frame(AVCodecContext * avccontext, unsigned char * packets, int buf_size, void *data)
732 { 732 {
733 venc_context_t * venc = avccontext->priv_data; 733 venc_context_t * venc = avccontext->priv_data;
734 signed short * audio = data; 734 signed short * audio = data;
735 int samples = data ? avccontext->frame_size : 0; 735 int samples = data ? avccontext->frame_size : 0;