2 * This file is part of Libav.
4 * Libav is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * Libav is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with Libav; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 #include "libavutil/channel_layout.h"
20 #include "libavutil/common.h"
21 #include "libavcodec/avcodec.h"
26 /* TODO: buffer pool. see comment for avfilter_default_get_video_buffer() */
27 void ff_avfilter_default_free_buffer(AVFilterBuffer
*ptr
)
29 if (ptr
->extended_data
!= ptr
->data
)
30 av_freep(&ptr
->extended_data
);
31 av_free(ptr
->data
[0]);
35 AVFilterBufferRef
*avfilter_ref_buffer(AVFilterBufferRef
*ref
, int pmask
)
37 AVFilterBufferRef
*ret
= av_malloc(sizeof(AVFilterBufferRef
));
41 if (ref
->type
== AVMEDIA_TYPE_VIDEO
) {
42 ret
->video
= av_malloc(sizeof(AVFilterBufferRefVideoProps
));
47 *ret
->video
= *ref
->video
;
48 ret
->extended_data
= ret
->data
;
49 } else if (ref
->type
== AVMEDIA_TYPE_AUDIO
) {
50 ret
->audio
= av_malloc(sizeof(AVFilterBufferRefAudioProps
));
55 *ret
->audio
= *ref
->audio
;
57 if (ref
->extended_data
!= ref
->data
) {
58 int nb_channels
= av_get_channel_layout_nb_channels(ref
->audio
->channel_layout
);
59 if (!(ret
->extended_data
= av_malloc(sizeof(*ret
->extended_data
) *
61 av_freep(&ret
->audio
);
65 memcpy(ret
->extended_data
, ref
->extended_data
,
66 sizeof(*ret
->extended_data
) * nb_channels
);
68 ret
->extended_data
= ret
->data
;
71 ret
->buf
->refcount
++;
75 void avfilter_unref_buffer(AVFilterBufferRef
*ref
)
79 if (!(--ref
->buf
->refcount
))
80 ref
->buf
->free(ref
->buf
);
81 if (ref
->extended_data
!= ref
->data
)
82 av_freep(&ref
->extended_data
);
88 void avfilter_unref_bufferp(AVFilterBufferRef
**ref
)
90 avfilter_unref_buffer(*ref
);
94 int avfilter_copy_frame_props(AVFilterBufferRef
*dst
, const AVFrame
*src
)
97 dst
->format
= src
->format
;
100 case AVMEDIA_TYPE_VIDEO
:
101 dst
->video
->w
= src
->width
;
102 dst
->video
->h
= src
->height
;
103 dst
->video
->pixel_aspect
= src
->sample_aspect_ratio
;
104 dst
->video
->interlaced
= src
->interlaced_frame
;
105 dst
->video
->top_field_first
= src
->top_field_first
;
106 dst
->video
->key_frame
= src
->key_frame
;
107 dst
->video
->pict_type
= src
->pict_type
;
109 case AVMEDIA_TYPE_AUDIO
:
110 dst
->audio
->sample_rate
= src
->sample_rate
;
111 dst
->audio
->channel_layout
= src
->channel_layout
;
114 return AVERROR(EINVAL
);
120 int avfilter_copy_buf_props(AVFrame
*dst
, const AVFilterBufferRef
*src
)
122 int planes
, nb_channels
;
124 memcpy(dst
->data
, src
->data
, sizeof(dst
->data
));
125 memcpy(dst
->linesize
, src
->linesize
, sizeof(dst
->linesize
));
128 dst
->format
= src
->format
;
131 case AVMEDIA_TYPE_VIDEO
:
132 dst
->width
= src
->video
->w
;
133 dst
->height
= src
->video
->h
;
134 dst
->sample_aspect_ratio
= src
->video
->pixel_aspect
;
135 dst
->interlaced_frame
= src
->video
->interlaced
;
136 dst
->top_field_first
= src
->video
->top_field_first
;
137 dst
->key_frame
= src
->video
->key_frame
;
138 dst
->pict_type
= src
->video
->pict_type
;
140 case AVMEDIA_TYPE_AUDIO
:
141 nb_channels
= av_get_channel_layout_nb_channels(src
->audio
->channel_layout
);
142 planes
= av_sample_fmt_is_planar(src
->format
) ? nb_channels
: 1;
144 if (planes
> FF_ARRAY_ELEMS(dst
->data
)) {
145 dst
->extended_data
= av_mallocz(planes
* sizeof(*dst
->extended_data
));
146 if (!dst
->extended_data
)
147 return AVERROR(ENOMEM
);
148 memcpy(dst
->extended_data
, src
->extended_data
,
149 planes
* sizeof(*dst
->extended_data
));
151 dst
->extended_data
= dst
->data
;
153 dst
->sample_rate
= src
->audio
->sample_rate
;
154 dst
->channel_layout
= src
->audio
->channel_layout
;
155 dst
->nb_samples
= src
->audio
->nb_samples
;
158 return AVERROR(EINVAL
);
164 void avfilter_copy_buffer_ref_props(AVFilterBufferRef
*dst
, AVFilterBufferRef
*src
)
166 // copy common properties
171 case AVMEDIA_TYPE_VIDEO
: *dst
->video
= *src
->video
; break;
172 case AVMEDIA_TYPE_AUDIO
: *dst
->audio
= *src
->audio
; break;