运行下面的代码时,我遇到损坏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;
}
有人可能会告诉我如何健全地返回一个帧数组,使帧内的指针仍然是有效的指针?
我想听听你的回答,我是否没有清楚地描述过这个问题,所以你不完全理解它,然后我想更详细地解释它,或者你还没有遇到过这个问题这种问题之前?
'decode_packet'中来自哪个'* frame'?我没有看到这个变量在任何地方声明... – rphv
AVFrame * frame; //每个帧都被正确解码。问题是,当他们被收集到一个数组...并发回... – Kindermann
@Kindermann,如果您发现这里提供的答案有帮助,请将upvote和/或mark标记为已接受,以便其他具有类似问题的用户可以效益。 –