2 * Copyright Stefano Sabatini <stefasab gmail com>
3 * Copyright Anton Khirnov <anton khirnov net>
4 * Copyright Michael Niedermayer <michaelni gmx at>
6 * This file is part of FFmpeg.
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.
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.
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
23 #include "libavutil/channel_layout.h"
24 #include "libavutil/avassert.h"
25 #include "libavutil/common.h"
26 #include "libavutil/imgutils.h"
27 #include "libavutil/internal.h"
28 #include "libavcodec/avcodec.h"
36 #if FF_API_AVFILTERBUFFER
37 void ff_avfilter_default_free_buffer(AVFilterBuffer
*ptr
)
39 if (ptr
->extended_data
!= ptr
->data
)
40 av_freep(&ptr
->extended_data
);
41 av_free(ptr
->data
[0]);
45 static void copy_video_props(AVFilterBufferRefVideoProps
*dst
, AVFilterBufferRefVideoProps
*src
) {
48 int qsize
= src
->qp_table_size
;
49 dst
->qp_table
= av_malloc(qsize
);
50 memcpy(dst
->qp_table
, src
->qp_table
, qsize
);
54 AVFilterBufferRef
*avfilter_ref_buffer(AVFilterBufferRef
*ref
, int pmask
)
56 AVFilterBufferRef
*ret
= av_malloc(sizeof(AVFilterBufferRef
));
62 av_dict_copy(&ret
->metadata
, ref
->metadata
, 0);
64 if (ref
->type
== AVMEDIA_TYPE_VIDEO
) {
65 ret
->video
= av_malloc(sizeof(AVFilterBufferRefVideoProps
));
70 copy_video_props(ret
->video
, ref
->video
);
71 ret
->extended_data
= ret
->data
;
72 } else if (ref
->type
== AVMEDIA_TYPE_AUDIO
) {
73 ret
->audio
= av_malloc(sizeof(AVFilterBufferRefAudioProps
));
78 *ret
->audio
= *ref
->audio
;
80 if (ref
->extended_data
&& ref
->extended_data
!= ref
->data
) {
81 int nb_channels
= av_get_channel_layout_nb_channels(ref
->audio
->channel_layout
);
82 if (!(ret
->extended_data
= av_malloc_array(sizeof(*ret
->extended_data
),
84 av_freep(&ret
->audio
);
88 memcpy(ret
->extended_data
, ref
->extended_data
,
89 sizeof(*ret
->extended_data
) * nb_channels
);
91 ret
->extended_data
= ret
->data
;
94 ret
->buf
->refcount
++;
98 void avfilter_unref_buffer(AVFilterBufferRef
*ref
)
102 av_assert0(ref
->buf
->refcount
> 0);
103 if (!(--ref
->buf
->refcount
))
104 ref
->buf
->free(ref
->buf
);
105 if (ref
->extended_data
!= ref
->data
)
106 av_freep(&ref
->extended_data
);
108 av_freep(&ref
->video
->qp_table
);
109 av_freep(&ref
->video
);
110 av_freep(&ref
->audio
);
111 av_dict_free(&ref
->metadata
);
115 void avfilter_unref_bufferp(AVFilterBufferRef
**ref
)
117 FF_DISABLE_DEPRECATION_WARNINGS
118 avfilter_unref_buffer(*ref
);
119 FF_ENABLE_DEPRECATION_WARNINGS
123 int avfilter_copy_frame_props(AVFilterBufferRef
*dst
, const AVFrame
*src
)
126 dst
->pos
= av_frame_get_pkt_pos(src
);
127 dst
->format
= src
->format
;
129 av_dict_free(&dst
->metadata
);
130 av_dict_copy(&dst
->metadata
, av_frame_get_metadata(src
), 0);
133 case AVMEDIA_TYPE_VIDEO
:
134 dst
->video
->w
= src
->width
;
135 dst
->video
->h
= src
->height
;
136 dst
->video
->sample_aspect_ratio
= src
->sample_aspect_ratio
;
137 dst
->video
->interlaced
= src
->interlaced_frame
;
138 dst
->video
->top_field_first
= src
->top_field_first
;
139 dst
->video
->key_frame
= src
->key_frame
;
140 dst
->video
->pict_type
= src
->pict_type
;
142 case AVMEDIA_TYPE_AUDIO
:
143 dst
->audio
->sample_rate
= src
->sample_rate
;
144 dst
->audio
->channel_layout
= src
->channel_layout
;
147 return AVERROR(EINVAL
);
153 void avfilter_copy_buffer_ref_props(AVFilterBufferRef
*dst
, const AVFilterBufferRef
*src
)
155 // copy common properties
160 case AVMEDIA_TYPE_VIDEO
: {
161 if (dst
->video
->qp_table
)
162 av_freep(&dst
->video
->qp_table
);
163 copy_video_props(dst
->video
, src
->video
);
166 case AVMEDIA_TYPE_AUDIO
: *dst
->audio
= *src
->audio
; break;
170 av_dict_free(&dst
->metadata
);
171 av_dict_copy(&dst
->metadata
, src
->metadata
, 0);
173 #endif /* FF_API_AVFILTERBUFFER */