예제 #1
0
파일: fifo.c 프로젝트: markjreed/vice-emu
static int request_frame(AVFilterLink *outlink)
{
    FifoContext *fifo = outlink->src->priv;
    int ret = 0;

    if (!fifo->root.next) {
        if ((ret = ff_request_frame(outlink->src->inputs[0])) < 0) {
            if (ret == AVERROR_EOF && outlink->request_samples)
                return return_audio_frame(outlink->src);
            return ret;
        }
        av_assert0(fifo->root.next);
    }

    if (outlink->request_samples) {
        return return_audio_frame(outlink->src);
    } else {
        ret = ff_filter_frame(outlink, fifo->root.next->frame);
        queue_pop(fifo);
    }

    return ret;
}
예제 #2
0
파일: fifo.c 프로젝트: SmartJog/ffmpeg
static int request_frame(AVFilterLink *outlink)
{
    FifoContext *fifo = outlink->src->priv;
    int ret = 0;

    if (!fifo->root.next) {
        if ((ret = ff_request_frame(outlink->src->inputs[0])) < 0)
            return ret;
        av_assert0(fifo->root.next);
    }

    /* by doing this, we give ownership of the reference to the next filter,
     * so we don't have to worry about dereferencing it ourselves. */
    switch (outlink->type) {
    case AVMEDIA_TYPE_VIDEO:
        if ((ret = ff_start_frame(outlink, fifo->root.next->buf)) < 0 ||
            (ret = ff_draw_slice(outlink, 0, outlink->h, 1)) < 0 ||
            (ret = ff_end_frame(outlink)) < 0)
            return ret;

        queue_pop(fifo);
        break;
    case AVMEDIA_TYPE_AUDIO:
        if (outlink->request_samples) {
            return return_audio_frame(outlink->src);
        } else {
            ret = ff_filter_samples(outlink, fifo->root.next->buf);
            queue_pop(fifo);
        }
        break;
    default:
        return AVERROR(EINVAL);
    }

    return ret;
}