2016-05-24 57 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

'decode_packet'中来自哪个'* frame'?我没有看到这个变量在任何地方声明... – rphv

+0

AVFrame * frame; //每个帧都被正确解码。问题是,当他们被收集到一个数组...并发回... – Kindermann

+0

@Kindermann,如果您发现这里提供的答案有帮助,请将upvote和/或mark标记为已接受,以便其他具有类似问题的用户可以效益。 –

回答

0

您正在按照值将“frames_video []”传入decode_packet方法,因此您无法在此方法中更新它。 尝试改变它作为指向数组的指针传递它。

+0

这是一个更严重的问题:我想保留AVFrame frames_video []而不是使用AVFrame * frames_video [] – Kindermann

+0

那么你没有使用它作为decode_packet之外的指针,但是你将不得不将它发送给方法作为传递参考。 –

+0

如果您从不想使用指针,则可以更改decode_packet以返回更新的frames_video []。 –