AV free crashes application randomly-FFMPEG C++

estou a tentar criar um media player simples para uma introdução ao mundo do ffmpeg, o problema é que cada vez que ligo {[[2]} a aplicação cai.

Se Eu não ligar av_freep eu tiver uma fuga de memória e a memória usada pelo programa aumentar até 1000MB( já medido), aqui está o código:

int16_t* audioBuffer=(int16_t*)av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE+FF_INPUT_BUFFER_PADDING_SIZE);

if(!audioBuffer){
    MessageBox(0,"Error allocating in audioBuffer","Error: Mem",MB_ICONWARNING | MB_OK);
    return -1;
}

int sz = MEDIA->DecodeAudioFrame((void*)audioBuffer,0);

Pa_WriteStream(MEDIA->output_stream,(int16_t*)audioBuffer,MEDIA->_audio_ccontext->frame_size);

av_freep(audioBuffer);

aqui está o meu código da função' DecodeAudioFrame':

int WbMedia::DecodeAudioFrame(void *audio_buf, int buf_size){
static AVFrame frame;
static AVPacket pkt;
static uint8_t *audio_pkt_data = NULL;
static int audio_pkt_size = 0;

int len1=0;

for(;;){
    bool do_rt = false;


    while(audio_pkt_size > 0){
        int obt_frame = 0;

        len1 = avcodec_decode_audio4(_audio_ccontext,&frame,&obt_frame,&pkt);
        if(len1 < 0){
            audio_pkt_size = 0;
            break;
        }

        audio_pkt_data+=len1;
        audio_pkt_size-=len1;

        if(obt_frame){
            data_size = av_samples_get_buffer_size(frame.linesize,channel_count,sample_fr,_audio_ccontext->sample_fmt,1);
            memcpy(audio_buf,frame.data[0],data_size);
        }

        if(data_size < 0){
            continue;
        }

        if(pkt.data){
            av_free_packet(&pkt);
        }
        return data_size;

    }

    if(pkt.data){
        av_free_packet(&pkt);
    }

    if(do_rt){
        return data_size;
    }

    // Try to get a new packet
    if(!audio_packets.empty()){
        WaitForSingleObject(Queue_Audio_Mutex,INFINITE);
            pkt = audio_packets.front();
            audio_packets.pop();
        ReleaseMutex(Queue_Audio_Mutex);

        audio_pkt_size = pkt.size;
        audio_pkt_data = pkt.data;
    }else{
        return -1;
    }
}
return 0;
}
Preciso de ajuda com este problema, não sei se é um insecto ou o que preciso de fazer. fazer. O que se passa aí? Porque é que se despenha na chamada? Como posso consertá-lo?

Obrigado.
Author: Spamdark, 2013-05-11

2 answers

av_freep leva um ponteiro para o ponteiro que você quer libertar; ele define o ponteiro libertado para NULL Depois. Portanto, você precisa usá-lo como

av_freep(&audioBuffer);

Em alternativa, pode utilizar

av_free(audioBuffer);
audioBuffer = NULL;

Que é equivalente.

 4
Author: nneonneo, 2013-05-11 15:40:19
int16_t* audioBuffer=(int16_t*)av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE+FF_INPUT_BUFFER_PADDING_SIZE);
Isto está errado. AVCODEC_MAX_AUDIO_FRAME_SIZE está desactualizado (removido em novas versões). Com a nova API de descodificação, poderá obter imagens descodificadas maiores do que esta.
static AVFrame frame;
Não. Não alocar o AVFrame na pilha, ele vai quebrar. Use avcodec_alloc_frame() (ou av_frame_alloc() com novas versões).
data_size = av_samples_get_buffer_size(frame.linesize,channel_count,sample_fr,_audio_ccontext->sample_fmt,1);
Tens noção de que estás a escrever a moldura original, certo? Pergunto-me se é essa a intenção.

Também, o que é sample_fr? Isso é alguma constante de algum lado? Usar AVFrame.nb_samples.

Finalmente, o seu código assume aparentemente áudio intercalado (isto é, as amostras de áudio para todos os canais intercalados num buffer). Muitos decodificadores agora produzem áudio planar (ou seja, as amostras para cada canal em um buffer separado). Esta pode ser a razão para o estoiro, uma vez que av_samples_get_buffer_size calcula o tamanho total de todas as amostras em todos os canais, enquanto data[0] conterá apenas as amostras para o primeiro canal.

Se o áudio planar é de facto a razão, você deve alterar o seu código para o suportar ou usar libavresample para converter planar para interleaved

 0
Author: Anton Khirnov, 2013-05-12 10:21:46