static int get_video_frame(VideoState *is, AVFrame *frame)

{

    int got_picture;



    if ((got_picture = decoder_decode_frame(&is->viddec, frame)) < 0)

        return -1;



    if (got_picture) {

        double dpts = NAN;



        if (frame->pts != AV_NOPTS_VALUE)

            dpts = av_q2d(is->video_st->time_base) * frame->pts;



        frame->sample_aspect_ratio = av_guess_sample_aspect_ratio(is->ic, is->video_st, frame);



        if (framedrop>0 || (framedrop && get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER)) {

            if (frame->pts != AV_NOPTS_VALUE) {

                double diff = dpts - get_master_clock(is);

                if (!isnan(diff) && fabs(diff) < AV_NOSYNC_THRESHOLD &&

                    diff - is->frame_last_filter_delay < 0 &&

                    is->viddec.pkt_serial == is->vidclk.serial &&

                    is->videoq.nb_packets) {

                    is->frame_drops_early++;

                    av_frame_unref(frame);

                    got_picture = 0;

                }

            }

        }

    }



    return got_picture;

}
