Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4349 Serge 1
/*
2
 * Copyright 2007 Bobby Bingham
3
 * Copyright Stefano Sabatini 
4
 * Copyright Vitor Sessak 
5
 *
6
 * This file is part of FFmpeg.
7
 *
8
 * FFmpeg is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU Lesser General Public
10
 * License as published by the Free Software Foundation; either
11
 * version 2.1 of the License, or (at your option) any later version.
12
 *
13
 * FFmpeg is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16
 * Lesser General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU Lesser General Public
19
 * License along with FFmpeg; if not, write to the Free Software
20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
 */
22
 
23
#include 
24
#include 
25
 
26
#include "libavutil/avassert.h"
27
#include "libavutil/buffer.h"
28
#include "libavutil/imgutils.h"
29
#include "libavutil/mem.h"
30
 
31
#include "avfilter.h"
32
#include "internal.h"
33
#include "video.h"
34
 
35
AVFrame *ff_null_get_video_buffer(AVFilterLink *link, int w, int h)
36
{
37
    return ff_get_video_buffer(link->dst->outputs[0], w, h);
38
}
39
 
40
/* TODO: set the buffer's priv member to a context structure for the whole
41
 * filter chain.  This will allow for a buffer pool instead of the constant
42
 * alloc & free cycle currently implemented. */
43
AVFrame *ff_default_get_video_buffer(AVFilterLink *link, int w, int h)
44
{
45
    AVFrame *frame = av_frame_alloc();
46
    int ret;
47
 
48
    if (!frame)
49
        return NULL;
50
 
51
    frame->width  = w;
52
    frame->height = h;
53
    frame->format = link->format;
54
 
55
    ret = av_frame_get_buffer(frame, 32);
56
    if (ret < 0)
57
        av_frame_free(&frame);
58
 
59
    return frame;
60
}
61
 
62
#if FF_API_AVFILTERBUFFER
63
AVFilterBufferRef *
64
avfilter_get_video_buffer_ref_from_arrays(uint8_t * const data[4], const int linesize[4], int perms,
65
                                          int w, int h, enum AVPixelFormat format)
66
{
67
    AVFilterBuffer *pic = av_mallocz(sizeof(AVFilterBuffer));
68
    AVFilterBufferRef *picref = av_mallocz(sizeof(AVFilterBufferRef));
69
 
70
    if (!pic || !picref)
71
        goto fail;
72
 
73
    picref->buf = pic;
74
    picref->buf->free = ff_avfilter_default_free_buffer;
75
    if (!(picref->video = av_mallocz(sizeof(AVFilterBufferRefVideoProps))))
76
        goto fail;
77
 
78
    pic->w = picref->video->w = w;
79
    pic->h = picref->video->h = h;
80
 
81
    /* make sure the buffer gets read permission or it's useless for output */
82
    picref->perms = perms | AV_PERM_READ;
83
 
84
    pic->refcount = 1;
85
    picref->type = AVMEDIA_TYPE_VIDEO;
86
    pic->format = picref->format = format;
87
 
88
    memcpy(pic->data,        data,          4*sizeof(data[0]));
89
    memcpy(pic->linesize,    linesize,      4*sizeof(linesize[0]));
90
    memcpy(picref->data,     pic->data,     sizeof(picref->data));
91
    memcpy(picref->linesize, pic->linesize, sizeof(picref->linesize));
92
 
93
    pic->   extended_data = pic->data;
94
    picref->extended_data = picref->data;
95
 
96
    picref->pts = AV_NOPTS_VALUE;
97
 
98
    return picref;
99
 
100
fail:
101
    if (picref && picref->video)
102
        av_free(picref->video);
103
    av_free(picref);
104
    av_free(pic);
105
    return NULL;
106
}
107
#endif
108
 
109
AVFrame *ff_get_video_buffer(AVFilterLink *link, int w, int h)
110
{
111
    AVFrame *ret = NULL;
112
 
113
    av_unused char buf[16];
114
    FF_TPRINTF_START(NULL, get_video_buffer); ff_tlog_link(NULL, link, 0);
115
 
116
    if (link->dstpad->get_video_buffer)
117
        ret = link->dstpad->get_video_buffer(link, w, h);
118
 
119
    if (!ret)
120
        ret = ff_default_get_video_buffer(link, w, h);
121
 
122
    return ret;
123
}