[ create a new paste ] login | about

Link: http://codepad.org/qoknuYAB    [ raw code | fork ]

C, pasted on Jun 20:
#define AUDIO_INBUF_SIZE 20480
static char audio_buf[AUDIO_INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];

//avresample_convert method
int outputframe_audio(VideoState *is,AVFrame *frame)
{
    AVCodecContext *dec = is->audio_st->codec;

    if( is->avr== NULL)
    {
        is->avr = avresample_alloc_context();
        av_opt_set_int(is->avr, "in_channel_layout",  AV_CH_LAYOUT_STEREO, 0);
        av_opt_set_int(is->avr, "in_sample_fmt",      AV_SAMPLE_FMT_FLTP,   0);
        av_opt_set_int(is->avr, "in_sample_rate",     44100,     0);
        av_opt_set_int(is->avr, "out_channel_layout", AV_CH_LAYOUT_STEREO,  0);
        av_opt_set_int(is->avr, "out_sample_fmt",     AV_SAMPLE_FMT_S16,    0);
        av_opt_set_int(is->avr, "out_sample_rate",    44100,     0);
        avresample_open(is->avr);
    }
    if(is->avr)
    {
        int maxLen;
        uint8_t *output=NULL;
        int out_linesize;
        int out_size = av_samples_get_buffer_size(&out_linesize,
                                                    2,
                                                    frame->nb_samples,
                                                    AV_SAMPLE_FMT_S16, 0);
        int out_samples = frame->nb_samples;
        output = av_realloc(output, out_size);
        maxLen = avresample_convert(is->avr, 
                                    &output, 
                                    out_linesize, 
                                    out_samples, 
                                    frame->data,//extended_data, 
                                    frame->linesize[0], 
                                    frame->nb_samples) *4;  // for 2channels

        memcpy(audio_buf, output, maxLen);
        av_freep(&output);

        audio_output(audio_buf,maxLen);

    }

}

//swr_convert method
int outputframe_audio(VideoState *is,AVFrame *frame)
{
    AVCodecContext *dec = is->audio_st->codec;

    if( is->swr_ctx== NULL)
    {
        is->swr_ctx = swr_alloc(); 
        is->swr_ctx=swr_alloc_set_opts(NULL,
                                    AV_CH_LAYOUT_STEREO, 
                                    AV_SAMPLE_FMT_S16, 
                                    44100,  
                                    dec->channel_layout,
                                    dec->sample_fmt , 
                                    44100,//dec->sample_rate,
                                    0, 
                                    NULL); 
        swr_init(is->swr_ctx);         
    }

    if (is->swr_ctx) 
    {
        int out_linesize;
        int needed_buf_size = av_samples_get_buffer_size(&out_linesize, 
                                                        dec->channels, 
                                                        frame->nb_samples, 
                                                        AV_SAMPLE_FMT_S16, 1);
        

        uint8_t *out[] = { audio_buf };
        int outsamples = swr_convert(is->swr_ctx, 
                                    out, 
                                    out_linesize,//needed_buf_size, 
                                    dst,//(const uint8_t**)frame->extended_data, //&is->frame->data[0],
                                    frame->nb_samples);

        is->audio_buf = audio_buf;
        
        int resampled_data_size = outsamples * dec->channels * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16);
        

        audio_output(audio_buf,resampled_data_size);
    
        
        
    }
}


Create a new paste based on this one


Comments: