0

私はffmpegで作業してきましたが、うまく機能しましたが、メモリリークが発生しました。いくつかの指示に従って修正しました( use などav_frame_unref)。そのため、ffmpegをバージョン1.2に更新する必要がありました。すべてがうまく機能していたので、これは私にとって奇妙です。その後、更新により、アプリケーションが memcpy でクラッシュし始めました。

正直なところ、何が起こっているのかわかりません。ググってみましたが、答えはありませんでした。助けていただければ幸いです。失敗しているコードのセグメントは次のとおりです。

int WbMedia::DecodeAudioFrame(int16_t *audio_buf){
static AVFrame *frame;
static AVPacket pkt;
static uint8_t *audio_pkt_data = NULL;
static int audio_pkt_size = 0;
static bool first_time = true;

if(first_time){
    first_time=false;
}

int len1, data_size = 0;

for(;;){
    bool do_rt = false;

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

        if (!frame) {
            if (!(frame = avcodec_alloc_frame())) {
                MessageBox(0,"Out of memory error","Error: Memory",MB_ICONWARNING | MB_OK);
                return -1;
            }
        }

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

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

        audio_pkt_data+=len1;
        audio_pkt_size-=len1;

        if(data_size < 0){
            continue;
        }


        return data_size;
    }

    if(pkt.data){
        //MessageBox(0,"hi","Hi",MB_OK); // This is only for test if the app si reaching this av_free_packet
        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;
}

本当にありがとう。

4

0 に答える 0