返回到帧数组

时间:2016-05-24 14:26:42

标签: c ffmpeg

运行以下代码时,我遇到了损坏的帧。它们是帧解码过程中的有效帧,

(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;
}

有人可能会告诉我如何正确地返回一个帧数组,以便帧内的指针仍然是有效的指针?

我想听听你的答复,我是否没有清楚地描述这个问题,所以你不能彻底理解它,然后我想更详细地解释它,或者你#&# 39;之前没有遇到过这种问题?

1 个答案:

答案 0 :(得分:0)

你传入&#34; frames_video []&#34;按值进入decode_packet方法,因此您无法在此方法中更新它。 尝试更改它以将其作为指向数组的指针传递。