video.c
Go to the documentation of this file.
1 /*
2  * Copyright 2007 Bobby Bingham
3  * Copyright Stefano Sabatini <stefasab gmail com>
4  * Copyright Vitor Sessak <vitor1001 gmail com>
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 <string.h>
24 #include <stdio.h>
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 
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. */
44 {
46  int ret;
47 
48 #if 0 //POOL
49  AVFilterPool *pool = link->pool;
50  if (pool) {
51  for (i = 0; i < POOL_SIZE; i++) {
52  picref = pool->pic[i];
53  if (picref && picref->buf->format == link->format && picref->buf->w == w && picref->buf->h == h) {
54  AVFilterBuffer *pic = picref->buf;
55  pool->pic[i] = NULL;
56  pool->count--;
57  av_assert0(!picref->video->qp_table);
58  picref->video->w = w;
59  picref->video->h = h;
60  picref->perms = full_perms;
61  picref->format = link->format;
62  pic->refcount = 1;
63  memcpy(picref->data, pic->data, sizeof(picref->data));
64  memcpy(picref->linesize, pic->linesize, sizeof(picref->linesize));
65  pool->refcount++;
66  return picref;
67  }
68  }
69  } else {
70  pool = link->pool = av_mallocz(sizeof(AVFilterPool));
71  pool->refcount = 1;
72  }
73 #endif
74  if (!frame)
75  return NULL;
76 
77  frame->width = w;
78  frame->height = h;
79  frame->format = link->format;
80 
81  ret = av_frame_get_buffer(frame, 32);
82  if (ret < 0)
83  av_frame_free(&frame);
84 
85 #if 0 //POOL
86  memset(data[0], 128, i);
87 
88  picref->buf->priv = pool;
89  picref->buf->free = NULL;
90  pool->refcount++;
91 #endif
92 
93  return frame;
94 }
95 
96 #if FF_API_AVFILTERBUFFER
97 AVFilterBufferRef *
98 avfilter_get_video_buffer_ref_from_arrays(uint8_t * const data[4], const int linesize[4], int perms,
99  int w, int h, enum AVPixelFormat format)
100 {
101  AVFilterBuffer *pic = av_mallocz(sizeof(AVFilterBuffer));
102  AVFilterBufferRef *picref = av_mallocz(sizeof(AVFilterBufferRef));
103 
104  if (!pic || !picref)
105  goto fail;
106 
107  picref->buf = pic;
108  picref->buf->free = ff_avfilter_default_free_buffer;
109  if (!(picref->video = av_mallocz(sizeof(AVFilterBufferRefVideoProps))))
110  goto fail;
111 
112  pic->w = picref->video->w = w;
113  pic->h = picref->video->h = h;
114 
115  /* make sure the buffer gets read permission or it's useless for output */
116  picref->perms = perms | AV_PERM_READ;
117 
118  pic->refcount = 1;
119  picref->type = AVMEDIA_TYPE_VIDEO;
120  pic->format = picref->format = format;
121 
122  memcpy(pic->data, data, 4*sizeof(data[0]));
123  memcpy(pic->linesize, linesize, 4*sizeof(linesize[0]));
124  memcpy(picref->data, pic->data, sizeof(picref->data));
125  memcpy(picref->linesize, pic->linesize, sizeof(picref->linesize));
126 
127  pic-> extended_data = pic->data;
128  picref->extended_data = picref->data;
129 
130  picref->pts = AV_NOPTS_VALUE;
131 
132  return picref;
133 
134 fail:
135  if (picref && picref->video)
136  av_free(picref->video);
137  av_free(picref);
138  av_free(pic);
139  return NULL;
140 }
141 #endif
142 
144 {
145  AVFrame *ret = NULL;
146 
147  av_unused char buf[16];
149 
150  if (link->dstpad->get_video_buffer)
151  ret = link->dstpad->get_video_buffer(link, w, h);
152 
153  if (!ret)
154  ret = ff_default_get_video_buffer(link, w, h);
155 
156  return ret;
157 }
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:205
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
misc image utilities
external API header
memory handling functions
int av_frame_get_buffer(AVFrame *frame, int align)
Allocate new buffer(s) for audio or video data.
Definition: frame.c:215
AVFrame * ff_null_get_video_buffer(AVFilterLink *link, int w, int h)
Definition: video.c:35
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
Definition: video.c:143
output residual component w
void ff_avfilter_default_free_buffer(AVFilterBuffer *ptr)
default handler for freeing audio/video buffer when there are no references left
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
uint8_t
static AVFrame * get_video_buffer(AVFilterLink *inlink, int w, int h)
Definition: avf_concat.c:202
#define POOL_SIZE
frame
Definition: stft.m:14
int width
width and height of the video frame
Definition: frame.h:122
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
Definition: mem.c:183
Spectrum Plot time data
simple assert() macros that are a bit more flexible than ISO C assert().
#define FF_TPRINTF_START(ctx, func)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a link
AVFrame *(* get_video_buffer)(AVFilterLink *link, int w, int h)
Callback function to get a video buffer.
ret
Definition: avfilter.c:821
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample format(the sample packing is implied by the sample format) and sample rate.The lists are not just lists
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames...
Definition: frame.h:134
NULL
Definition: eval.c:55
void ff_tlog_link(void *ctx, AVFilterLink *link, int end)
Definition: avfilter.c:295
void * buf
Definition: avisynth_c.h:594
synthesis window for stochastic i
refcounted data buffer API
AVFilterBufferRef * pic[POOL_SIZE]
AVFilterLink ** outputs
array of pointers to output links
Definition: avfilter.h:539
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:95
AVFrame * ff_default_get_video_buffer(AVFilterLink *link, int w, int h)
Definition: video.c:43
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:108
int height
Definition: frame.h:122
internal API functions
AVPixelFormat
Pixel format.
Definition: pixfmt.h:66
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:190
#define av_unused
Definition: attributes.h:114