2016-05-24 12 views
3

に戻ったときに、次のコードを実行しているとき、私は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; 
} 

おそらく、フレーム内のポインタが有効なポインタであるように、健全にフレーム配列を返す方法を教えてもらえますか?

私ははっきりと問題を説明していませんでしたか、私はあなたがそれを徹底的に理解していないので、私はより詳細にそれを説明したいと思いますか、この遭遇していませんでした、あなたの応答を聞きたいです前に問題?

+0

'* frame'は' decode_packet'のどこから来ていますか?この変数はどこにでも宣言されていません... – rphv

+0

AVFrame * frame; //各フレームは正しくデコードされています。同様の問題を持つ他のユーザーができるように、問題は、あなたがここに役立つ提供の答えを見つけた場合は受け入れたとして、upvoteおよび/またはマークしてください、それらは配列に収集されたときに...あると送り返さ... – Kindermann

+0

@Kindermann利益。はるかに深刻な問題だ –

答えて

0

"frames_video []"をdecode_packetメソッドに渡しているため、このメソッド内では更新できません。 これを変更して、配列へのポインタとして渡してみてください。

+0

:私はAVFrameは[]の代わりAVFrameを使用してframes_video維持したい* frames_videoは[] – Kindermann

+0

さてあなたは、あなたがdecode_packetの外にポインタとしてそれを使用する必要はありませんが、あなたはそれを送信する必要がありますメソッドを参照渡しとして使用します。 –

+0

あなたは、ポインタを使用したいことはありません場合は、更新frames_video []を返すようにdecode_packetを変更することができます。 –

関連する問題