に戻ったときに、次のコードを実行しているとき、私はframes.Theyが、しかし、フレームの復号化処理の際に破損したフレームのフレーム列
(gdb) print frame->side_data
$2 = (AVFrameSideData **) 0x1a2ad40
(gdb) print frame->side_data->type
$3 = AV_FRAME_DATA_MOTION_VECTORS
有効なフレームでした彼らはAVFrame配列に戻したとき、私が見つけた壊れ遭遇私は次のようにそれが実証されているために責任だと思う
(gdb) print frames_video1[1]->side_data
$4 = (AVFrameSideData **) 0x1a21bc0
(gdb) print frames_video1[1]->side_data->type
Cannot access memory at address 0x0
コード:
意味し、ポインタがまだそこにいたが、私はポインタが実際に指摘するものにアクセスできませんでした配列、内部の破損したフレームAVFrame frames_video1[3];
char *src_filename1;
int main()
{
...
decode_video(src_filename1, frames_video1);
...
}
int decode_video(char *src_filename, AVFrame frames_video[])
{
...
video_dec_ctx->flags2 |= AV_CODEC_FLAG2_EXPORT_MVS;
...
decode_packet(&got_frame, 0, frames_video);
...
}
static int decode_packet(int *got_frame, int cached, AVFrame frames_video[])
{
int ret = 0;
int decoded = pkt.size;
*got_frame = 0;
if (pkt.stream_index == video_stream_idx) {
/* decode video frame */
ret = avcodec_decode_video2(video_dec_ctx, frame, got_frame, &pkt);
if (ret < 0) {
fprintf(stderr, "Error decoding video frame (%s)\n", av_err2str(ret));
return ret;
}
if (*got_frame) {
if(video_frame_count < FRAME_TO_COMPARE_NUM){
AVFrame tmp;
tmp = *frame; //here I inserted a breakpoint, frames here are still valid...
frames_video[video_frame_count] = tmp;
}
video_frame_count++;
}
return decoded;
}
おそらく、フレーム内のポインタが有効なポインタであるように、健全にフレーム配列を返す方法を教えてもらえますか?
私ははっきりと問題を説明していませんでしたか、私はあなたがそれを徹底的に理解していないので、私はより詳細にそれを説明したいと思いますか、この遭遇していませんでした、あなたの応答を聞きたいです前に問題?
'* frame'は' decode_packet'のどこから来ていますか?この変数はどこにでも宣言されていません... – rphv
AVFrame * frame; //各フレームは正しくデコードされています。同様の問題を持つ他のユーザーができるように、問題は、あなたがここに役立つ提供の答えを見つけた場合は受け入れたとして、upvoteおよび/またはマークしてください、それらは配列に収集されたときに...あると送り返さ... – Kindermann
@Kindermann利益。はるかに深刻な問題だ –