Changeset 0d0dffabce3a6d428e8a0dfbfb585ddcef543f7b
- Timestamp:
- 06/29/03 22:58:16 (5 years ago)
- git-parent:
- Files:
-
- configure.ac (modified) (2 diffs)
- modules/mux/ogg.c (modified) (2 diffs)
- modules/stream_out/transcode.c (modified) (24 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
configure.ac
rc0d6278 r0d0dffa 1 1 dnl Autoconf settings for vlc 2 dnl $Id: configure.ac,v 1.1 6 2003/06/28 14:31:40 samExp $2 dnl $Id: configure.ac,v 1.17 2003/06/29 20:58:16 gbazin Exp $ 3 3 4 4 AC_INIT(vlc,0.6.0) … … 1535 1535 dnl XXX: we don't link with -lavcodec blah blah blah 1536 1536 dnl AX_ADD_LDFLAGS([encoder_ffmpeg],[${LDFLAGS_ffmpeg}]) 1537 1538 AC_CHECK_HEADERS(vorbis/vorbisenc.h vorbis/codec.h, 1539 AX_ADD_LDFLAGS([stream_out_transcode],[-lvorbisenc -lvorbis -logg]) ) 1537 1540 fi 1538 1541 modules/mux/ogg.c
r8b67039 r0d0dffa 3 3 ***************************************************************************** 4 4 * Copyright (C) 2001, 2002 VideoLAN 5 * $Id: ogg.c,v 1. 6 2003/06/23 23:51:31gbazin Exp $5 * $Id: ogg.c,v 1.7 2003/06/29 20:58:16 gbazin Exp $ 6 6 * 7 7 * Authors: Laurent Aimar <fenrir@via.ecp.fr> … … 650 650 p_stream->i_length = 0; 651 651 652 msg_Dbg( p_mux, "writing data..." );653 652 sout_AccessOutWrite( p_mux->p_access, p_og ); 654 653 modules/stream_out/transcode.c
r209f2ea r0d0dffa 3 3 ***************************************************************************** 4 4 * Copyright (C) 2001, 2002 VideoLAN 5 * $Id: transcode.c,v 1.1 8 2003/06/25 21:47:05 fenrirExp $5 * $Id: transcode.c,v 1.19 2003/06/29 20:58:16 gbazin Exp $ 6 6 * 7 7 * Authors: Laurent Aimar <fenrir@via.ecp.fr> … … 39 39 #endif 40 40 41 /* vorbis header */ 42 #ifdef HAVE_VORBIS_VORBISENC_H 43 # include <vorbis/vorbisenc.h> 44 #endif 45 41 46 /***************************************************************************** 42 47 * Exported prototypes … … 301 306 302 307 ImgReSampleContext *p_vresample; 308 309 #ifdef HAVE_VORBIS_VORBISENC_H 310 311 /* Vorbis part */ 312 vorbis_info *p_vi; 313 vorbis_dsp_state *p_vd; 314 vorbis_block *p_vb; 315 vorbis_comment *p_vc; 316 int i_last_block_size; 317 int i_samples_delay; 318 vlc_bool_t b_headers_sent; 319 #endif 303 320 }; 304 321 305 322 306 static sout_stream_id_t * Add ( sout_stream_t *p_stream, sout_format_t *p_fmt )323 static sout_stream_id_t * Add( sout_stream_t *p_stream, sout_format_t *p_fmt ) 307 324 { 308 325 sout_stream_sys_t *p_sys = p_stream->p_sys; … … 413 430 } 414 431 415 static int Send ( sout_stream_t *p_stream, sout_stream_id_t *id, sout_buffer_t *p_buffer ) 432 static int Send( sout_stream_t *p_stream, sout_stream_id_t *id, 433 sout_buffer_t *p_buffer ) 416 434 { 417 435 sout_stream_sys_t *p_sys = p_stream->p_sys; … … 463 481 { VLC_FOURCC( 'w', 'm', 'a', '1' ), CODEC_ID_WMAV1 }, 464 482 { VLC_FOURCC( 'w', 'm', 'a', '2' ), CODEC_ID_WMAV2 }, 483 { VLC_FOURCC( 'v', 'o', 'r', 'b' ), CODEC_ID_VORBIS }, 465 484 466 485 /* video */ … … 526 545 } 527 546 528 static int transcode_audio_ffmpeg_new ( sout_stream_t *p_stream, sout_stream_id_t *id ) 547 static int transcode_audio_ffmpeg_new( sout_stream_t *p_stream, 548 sout_stream_id_t *id ) 529 549 { 530 550 int i_ff_codec; … … 576 596 577 597 /* find encoder */ 598 id->i_buffer_in = 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE; 599 id->i_buffer_in_pos = 0; 600 id->p_buffer_in = malloc( id->i_buffer_in ); 601 602 id->i_buffer = 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE; 603 id->i_buffer_pos = 0; 604 id->p_buffer = malloc( id->i_buffer ); 605 606 id->i_buffer_out = 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE; 607 id->i_buffer_out_pos = 0; 608 id->p_buffer_out = malloc( id->i_buffer_out ); 609 610 #ifdef HAVE_VORBIS_VORBISENC_H 611 if( id->f_dst.i_fourcc == VLC_FOURCC('v','o','r','b') ) 612 { 613 id->p_vi = (vorbis_info *)malloc( sizeof(vorbis_info) ); 614 id->p_vd = (vorbis_dsp_state *)malloc( sizeof(vorbis_dsp_state) ); 615 id->p_vb = (vorbis_block *)malloc( sizeof(vorbis_block) ); 616 id->p_vc = (vorbis_comment *)malloc( sizeof(vorbis_comment) ); 617 618 vorbis_info_init( id->p_vi ); 619 620 if( vorbis_encode_setup_managed( id->p_vi, id->f_dst.i_channels, 621 id->f_dst.i_sample_rate, -1, id->f_dst.i_bitrate, -1 ) || 622 vorbis_encode_ctl( id->p_vi, OV_ECTL_RATEMANAGE_AVG, NULL ) || 623 vorbis_encode_setup_init( id->p_vi ) ){} 624 625 /* add a comment */ 626 vorbis_comment_init( id->p_vc); 627 vorbis_comment_add_tag( id->p_vc, "ENCODER", "VLC media player"); 628 629 /* set up the analysis state and auxiliary encoding storage */ 630 vorbis_analysis_init( id->p_vd, id->p_vi ); 631 vorbis_block_init( id->p_vd, id->p_vb ); 632 633 id->b_headers_sent = VLC_FALSE; 634 id->i_last_block_size = 0; 635 id->i_samples_delay = 0; 636 637 return VLC_SUCCESS; 638 } 639 #endif 640 578 641 i_ff_codec = get_ff_codec( id->f_dst.i_fourcc ); 579 642 if( i_ff_codec == 0 ) … … 601 664 } 602 665 603 604 id->i_buffer_in = 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE;605 id->i_buffer_in_pos = 0;606 id->p_buffer_in = malloc( id->i_buffer_in );607 608 id->i_buffer = 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE;609 id->i_buffer_pos = 0;610 id->p_buffer = malloc( id->i_buffer );611 612 id->i_buffer_out = 2 * AVCODEC_MAX_AUDIO_FRAME_SIZE;613 id->i_buffer_out_pos = 0;614 id->p_buffer_out = malloc( id->i_buffer_out );615 616 666 return VLC_SUCCESS; 617 667 } 618 668 619 static void transcode_audio_ffmpeg_close ( sout_stream_t *p_stream, sout_stream_id_t *id ) 669 static void transcode_audio_ffmpeg_close( sout_stream_t *p_stream, 670 sout_stream_id_t *id ) 620 671 { 621 672 if( id->ff_dec ) … … 623 674 avcodec_close( id->ff_dec_c ); 624 675 } 625 avcodec_close( id->ff_enc_c ); 676 677 #ifdef HAVE_VORBIS_VORBISENC_H 678 if( id->f_dst.i_fourcc == VLC_FOURCC('v','o','r','b') ) 679 { 680 vorbis_block_clear( id->p_vb ); 681 vorbis_dsp_clear( id->p_vd ); 682 vorbis_comment_clear( id->p_vc ); 683 vorbis_info_clear( id->p_vi ); /* must be called last */ 684 685 free( id->p_vi ); 686 free( id->p_vd ); 687 free( id->p_vb ); 688 free( id->p_vc ); 689 } 690 else 691 #endif 692 avcodec_close( id->ff_enc_c ); 626 693 627 694 free( id->ff_dec_c ); 628 free( id->ff_enc_c ); 695 if( id->f_dst.i_fourcc != VLC_FOURCC('v','o','r','b') ) 696 free( id->ff_enc_c ); 629 697 630 698 free( id->p_buffer_in ); … … 633 701 } 634 702 635 static int transcode_audio_ffmpeg_process( sout_stream_t *p_stream, sout_stream_id_t *id, 636 sout_buffer_t *in, sout_buffer_t **out ) 703 static int transcode_audio_ffmpeg_process( sout_stream_t *p_stream, 704 sout_stream_id_t *id, 705 sout_buffer_t *in, 706 sout_buffer_t **out ) 637 707 { 638 708 vlc_bool_t b_again = VLC_FALSE; … … 641 711 642 712 /* gather data into p_buffer_in */ 713 if( id->f_dst.i_fourcc == VLC_FOURCC( 'v', 'o', 'r', 'b' ) ) 714 id->i_dts = in->i_dts - 715 (mtime_t)1000000 * (mtime_t)id->i_samples_delay / 716 (mtime_t)id->f_dst.i_sample_rate; 717 else 643 718 id->i_dts = in->i_dts - 644 719 (mtime_t)1000000 * … … 646 721 (mtime_t)id->ff_enc_c->sample_rate; 647 722 648 if( id->i_buffer_in_pos + in->i_size > id->i_buffer_in )723 if( id->i_buffer_in_pos + (int)in->i_size > id->i_buffer_in ) 649 724 { 650 725 /* extend buffer_in */ … … 653 728 } 654 729 memcpy( &id->p_buffer_in[id->i_buffer_in_pos], 655 in->p_buffer, 656 in->i_size ); 730 in->p_buffer, in->i_size ); 657 731 id->i_buffer_in_pos += in->i_size; 658 732 659 733 do 660 734 { 661 /* decode as m anydata as possible */735 /* decode as much data as possible */ 662 736 if( id->ff_dec ) 663 737 { … … 670 744 671 745 i_used = avcodec_decode_audio( id->ff_dec_c, 672 (int16_t*)&id->p_buffer[id->i_buffer_pos], &i_buffer_size, 673 id->p_buffer_in, id->i_buffer_in_pos ); 674 675 /* msg_Warn( p_stream, "avcodec_decode_audio: %d used", i_used ); */ 746 (int16_t*)&id->p_buffer[id->i_buffer_pos], 747 &i_buffer_size, id->p_buffer_in, 748 id->i_buffer_in_pos ); 749 750 /* msg_Warn( p_stream, "avcodec_decode_audio: %d used", 751 i_used ); */ 676 752 id->i_buffer_pos += i_buffer_size; 677 753 … … 711 787 { 712 788 int8_t *sin = (int8_t*)id->p_buffer_in; 713 int i_samples = __MIN( ( id->i_buffer - id->i_buffer_pos ) / 2, id->i_buffer_in_pos ); 789 int i_samples = __MIN( ( id->i_buffer - id->i_buffer_pos ) 790 / 2, id->i_buffer_in_pos ); 714 791 i_used = i_samples; 715 792 while( i_samples > 0 ) … … 722 799 { 723 800 int8_t *sin = (int8_t*)id->p_buffer_in; 724 int i_samples = __MIN( ( id->i_buffer - id->i_buffer_pos ) / 2, id->i_buffer_in_pos ); 801 int i_samples = __MIN( ( id->i_buffer - id->i_buffer_pos ) 802 / 2, id->i_buffer_in_pos ); 725 803 i_used = i_samples; 726 804 while( i_samples > 0 ) … … 732 810 else if( id->f_src.i_fourcc == VLC_FOURCC( 's', '1', '6', 'l' ) ) 733 811 { 734 int i_samples = __MIN( ( id->i_buffer - id->i_buffer_pos ) / 2, id->i_buffer_in_pos / 2); 812 int i_samples = __MIN( ( id->i_buffer - id->i_buffer_pos ) 813 / 2, id->i_buffer_in_pos / 2); 735 814 #ifdef WORDS_BIGENDIAN 736 815 uint8_t *sin = (uint8_t*)id->p_buffer_in; … … 754 833 else if( id->f_src.i_fourcc == VLC_FOURCC( 's', '1', '6', 'b' ) ) 755 834 { 756 int i_samples = __MIN( ( id->i_buffer - id->i_buffer_pos ) / 2, id->i_buffer_in_pos / 2); 835 int i_samples = __MIN( ( id->i_buffer - id->i_buffer_pos ) 836 / 2, id->i_buffer_in_pos / 2); 757 837 #ifdef WORDS_BIGENDIAN 758 838 memcpy( sout, id->p_buffer_in, i_samples * 2 ); … … 784 864 } 785 865 786 /* encode as many data as possible */ 866 /* encode as much data as possible */ 867 868 #ifdef HAVE_VORBIS_VORBISENC_H 869 if( id->i_buffer_pos == 0 ); 870 else if( id->f_dst.i_fourcc == VLC_FOURCC( 'v', 'o', 'r', 'b' ) ) 871 { 872 float **buffer; 873 int i, j, i_samples; 874 sout_buffer_t *p_out; 875 ogg_packet op; 876 877 if( id->i_buffer_pos == 0 ) 878 { 879 break; 880 } 881 882 if( !id->b_headers_sent ) 883 { 884 ogg_packet header[3]; 885 vorbis_analysis_headerout( id->p_vd, id->p_vc, 886 &header[0], &header[1], &header[2]); 887 for( i = 0; i < 3; i++ ) 888 { 889 p_out = sout_BufferNew( p_stream->p_sout, header[i].bytes); 890 memcpy( p_out->p_buffer, header[i].packet, 891 header[i].bytes ); 892 893 p_out->i_size = header[i].bytes; 894 p_out->i_length = 0; 895 896 p_out->i_dts = p_out->i_pts = 0; 897 898 sout_BufferChain( out, p_out ); 899 } 900 id->b_headers_sent = VLC_TRUE; 901 } 902 903 i_samples = id->i_buffer_pos / id->f_dst.i_channels / 2; 904 id->i_samples_delay += i_samples; 905 id->i_buffer_pos = 0; 906 907 buffer = vorbis_analysis_buffer( id->p_vd, i_samples ); 908 909 /* convert samples to float and uninterleave */ 910 for( i = 0; i < id->f_dst.i_channels; i++ ) 911 { 912 for( j = 0 ; j < i_samples ; j++ ) 913 { 914 buffer[i][j]= ((float)( ((int16_t *)id->p_buffer) 915 [j*id->f_dst.i_channels + i ] ))/ 32768.f; 916 } 917 } 918 919 vorbis_analysis_wrote( id->p_vd, i_samples ); 920 921 while( vorbis_analysis_blockout( id->p_vd, id->p_vb ) == 1 ) 922 { 923 vorbis_analysis( id->p_vb, NULL ); 924 vorbis_bitrate_addblock( id->p_vb ); 925 926 while( vorbis_bitrate_flushpacket( id->p_vd, &op ) ) 927 { 928 int i_block_size; 929 p_out = sout_BufferNew( p_stream->p_sout, op.bytes ); 930 memcpy( p_out->p_buffer, op.packet, op.bytes ); 931 932 i_block_size = vorbis_packet_blocksize( id->p_vi, &op ); 933 934 if( i_block_size < 0 ) i_block_size = 0; 935 i_samples = ( id->i_last_block_size + 936 i_block_size ) >> 2; 937 id->i_last_block_size = i_block_size; 938 939 p_out->i_size = op.bytes; 940 p_out->i_length = (mtime_t)1000000 * 941 (mtime_t)i_samples / 942 (mtime_t)id->f_dst.i_sample_rate; 943 944 //msg_Err( p_stream, "i_dts: %lld", id->i_dts ); 945 946 /* FIXME */ 947 p_out->i_dts = id->i_dts; 948 p_out->i_pts = id->i_dts; 949 950 id->i_samples_delay -= i_samples; 951 952 static mtime_t i_old_dts = 0; 953 954 /* update dts */ 955 id->i_dts += p_out->i_length; 956 i_old_dts = id->i_dts; 957 sout_BufferChain( out, p_out ); 958 959 } 960 } 961 } 962 else 963 #endif 964 787 965 for( ;; ) 788 966 { 789 int i_frame_size = id->ff_enc_c->frame_size * 2 * id->ff_enc_c->channels; 967 int i_frame_size = id->ff_enc_c->frame_size * 2 * 968 id->ff_enc_c->channels; 790 969 int i_out_size; 791 970 sout_buffer_t *p_out; … … 796 975 } 797 976 798 /* msg_Warn( p_stream, "avcodec_encode_audio: frame size%d", i_frame_size); */ 977 /* msg_Warn( p_stream, "avcodec_encode_audio: frame size%d", 978 i_frame_size); */ 799 979 i_out_size = avcodec_encode_audio( id->ff_enc_c, 800 id->p_buffer_out, id->i_buffer_out,801 (int16_t*)id->p_buffer );980 id->p_buffer_out, id->i_buffer_out, 981 (int16_t*)id->p_buffer ); 802 982 803 983 if( i_out_size <= 0 ) … … 813 993 memcpy( p_out->p_buffer, id->p_buffer_out, i_out_size ); 814 994 p_out->i_size = i_out_size; 815 p_out->i_length = (mtime_t)1000000 * (mtime_t)id->ff_enc_c->frame_size / (mtime_t)id->ff_enc_c->sample_rate; 995 p_out->i_length = (mtime_t)1000000 * 996 (mtime_t)id->ff_enc_c->frame_size / 997 (mtime_t)id->ff_enc_c->sample_rate; 998 816 999 /* FIXME */ 817 1000 p_out->i_dts = id->i_dts; … … 821 1004 id->i_dts += p_out->i_length; 822 1005 823 /* msg_Warn( p_stream, "frame dts=%lld len %lld out=%d", p_out->i_dts, p_out->i_length, i_out_size ); */ 1006 /* msg_Warn( p_stream, "frame dts=%lld len %lld out=%d", 1007 p_out->i_dts, p_out->i_length, i_out_size ); */ 1008 824 1009 sout_BufferChain( out, p_out ); 825 1010 } … … 834 1019 * video 835 1020 */ 836 static int transcode_video_ffmpeg_new ( sout_stream_t *p_stream, sout_stream_id_t *id ) 1021 static int transcode_video_ffmpeg_new( sout_stream_t *p_stream, 1022 sout_stream_id_t *id ) 837 1023 { 838 1024 sout_stream_sys_t *p_sys = p_stream->p_sys; … … 1197 1383 return VLC_SUCCESS; 1198 1384 } 1199
