OpenShot Library | libopenshot 0.2.7
FFmpegUtilities.h
Go to the documentation of this file.
1/**
2 * @file
3 * @brief Header file for FFmpegUtilities
4 * @author Jonathan Thomas <jonathan@openshot.org>
5 *
6 * @ref License
7 */
8
9/* LICENSE
10 *
11 * Copyright (c) 2008-2019 OpenShot Studios, LLC
12 * <http://www.openshotstudios.com/>. This file is part of
13 * OpenShot Library (libopenshot), an open-source project dedicated to
14 * delivering high quality video editing and animation solutions to the
15 * world. For more information visit <http://www.openshot.org/>.
16 *
17 * OpenShot Library (libopenshot) is free software: you can redistribute it
18 * and/or modify it under the terms of the GNU Lesser General Public License
19 * as published by the Free Software Foundation, either version 3 of the
20 * License, or (at your option) any later version.
21 *
22 * OpenShot Library (libopenshot) is distributed in the hope that it will be
23 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 * GNU Lesser General Public License for more details.
26 *
27 * You should have received a copy of the GNU Lesser General Public License
28 * along with OpenShot Library. If not, see <http://www.gnu.org/licenses/>.
29 */
30
31#ifndef OPENSHOT_FFMPEG_UTILITIES_H
32#define OPENSHOT_FFMPEG_UTILITIES_H
33
34#include "OpenShotVersion.h" // For FFMPEG_USE_SWRESAMPLE
35
36// Required for libavformat to build on Windows
37#ifndef INT64_C
38#define INT64_C(c) (c ## LL)
39#define UINT64_C(c) (c ## ULL)
40#endif
41
42#ifndef IS_FFMPEG_3_2
43#define IS_FFMPEG_3_2 (LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 64, 101))
44#endif
45
46#ifndef USE_HW_ACCEL
47#define USE_HW_ACCEL (LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 107, 100))
48#endif
49
50#ifndef USE_SW
51#define USE_SW FFMPEG_USE_SWRESAMPLE
52#endif
53
54// Include the FFmpeg headers
55extern "C" {
56 #include <libavcodec/avcodec.h>
57 #include <libavformat/avformat.h>
58
59#if (LIBAVFORMAT_VERSION_MAJOR >= 57)
60 #include <libavutil/hwcontext.h> //PM
61#endif
62 #include <libswscale/swscale.h>
63
64#if USE_SW
65 #include <libswresample/swresample.h>
66#else
67 #include <libavresample/avresample.h>
68#endif
69
70 #include <libavutil/mathematics.h>
71 #include <libavutil/pixfmt.h>
72 #include <libavutil/pixdesc.h>
73
74 // libavutil changed folders at some point
75#if LIBAVFORMAT_VERSION_MAJOR >= 53
76 #include <libavutil/opt.h>
77#else
78 #include <libavcodec/opt.h>
79#endif
80
81 // channel header refactored
82#if LIBAVFORMAT_VERSION_MAJOR >= 54
83 #include <libavutil/channel_layout.h>
84#endif
85
86#if IS_FFMPEG_3_2
87 #include "libavutil/imgutils.h"
88#endif
89}
90
91// This was removed from newer versions of FFmpeg (but still used in libopenshot)
92#ifndef AVCODEC_MAX_AUDIO_FRAME_SIZE
93 // 1 second of 48khz 32bit audio
94 #define AVCODEC_MAX_AUDIO_FRAME_SIZE 192000
95#endif
96#ifndef AV_ERROR_MAX_STRING_SIZE
97 #define AV_ERROR_MAX_STRING_SIZE 64
98#endif
99#ifndef AUDIO_PACKET_ENCODING_SIZE
100 // 48khz * S16 (2 bytes) * max channels (8)
101 #define AUDIO_PACKET_ENCODING_SIZE 768000
102#endif
103
104// This wraps an unsafe C macro to be C++ compatible function
105inline static const std::string av_err2string(int errnum)
106{
107 char errbuf[AV_ERROR_MAX_STRING_SIZE];
108 av_strerror(errnum, errbuf, AV_ERROR_MAX_STRING_SIZE);
109 return static_cast<std::string>(errbuf);
110}
111
112// Redefine the C macro to use our new C++ function
113#undef av_err2str
114#define av_err2str(errnum) av_err2string(errnum).c_str()
115
116// Define this for compatibility
117#ifndef PixelFormat
118 #define PixelFormat AVPixelFormat
119#endif
120#ifndef PIX_FMT_RGBA
121 #define PIX_FMT_RGBA AV_PIX_FMT_RGBA
122#endif
123#ifndef PIX_FMT_NONE
124 #define PIX_FMT_NONE AV_PIX_FMT_NONE
125#endif
126#ifndef PIX_FMT_RGB24
127 #define PIX_FMT_RGB24 AV_PIX_FMT_RGB24
128#endif
129#ifndef PIX_FMT_YUV420P
130 #define PIX_FMT_YUV420P AV_PIX_FMT_YUV420P
131#endif
132#ifndef PIX_FMT_YUV444P
133 #define PIX_FMT_YUV444P AV_PIX_FMT_YUV444P
134#endif
135
136// Does ffmpeg pixel format contain an alpha channel?
137inline static bool ffmpeg_has_alpha(PixelFormat pix_fmt) {
138 const AVPixFmtDescriptor *fmt_desc = av_pix_fmt_desc_get(pix_fmt);
139 return bool(fmt_desc->flags & AV_PIX_FMT_FLAG_ALPHA);
140}
141
142// FFmpeg's libavutil/common.h defines an RSHIFT incompatible with Ruby's
143// definition in ruby/config.h, so we move it to FF_RSHIFT
144#ifdef RSHIFT
145 #define FF_RSHIFT(a, b) RSHIFT(a, b)
146 #undef RSHIFT
147#endif
148
149// libswresample/libavresample API switching
150#if USE_SW
151 #define SWR_CONVERT(ctx, out, linesize, out_count, in, linesize2, in_count) \
152 swr_convert(ctx, out, out_count, (const uint8_t **)in, in_count)
153 #define SWR_ALLOC() swr_alloc()
154 #define SWR_CLOSE(ctx) {}
155 #define SWR_FREE(ctx) swr_free(ctx)
156 #define SWR_INIT(ctx) swr_init(ctx)
157 #define SWRCONTEXT SwrContext
158
159#else
160 #define SWR_CONVERT(ctx, out, linesize, out_count, in, linesize2, in_count) \
161 avresample_convert(ctx, out, linesize, out_count, (uint8_t **)in, linesize2, in_count)
162 #define SWR_ALLOC() avresample_alloc_context()
163 #define SWR_CLOSE(ctx) avresample_close(ctx)
164 #define SWR_FREE(ctx) avresample_free(ctx)
165 #define SWR_INIT(ctx) avresample_open(ctx)
166 #define SWRCONTEXT AVAudioResampleContext
167#endif
168
169
170#if (LIBAVFORMAT_VERSION_MAJOR >= 58)
171 #define AV_REGISTER_ALL
172 #define AVCODEC_REGISTER_ALL
173 #define AV_FILENAME url
174 #define AV_SET_FILENAME(oc, f) oc->AV_FILENAME = av_strdup(f)
175 #define MY_INPUT_BUFFER_PADDING_SIZE AV_INPUT_BUFFER_PADDING_SIZE
176 #define AV_ALLOCATE_FRAME() av_frame_alloc()
177 #define AV_ALLOCATE_IMAGE(av_frame, pix_fmt, width, height) \
178 av_image_alloc(av_frame->data, av_frame->linesize, width, height, pix_fmt, 1)
179 #define AV_RESET_FRAME(av_frame) av_frame_unref(av_frame)
180 #define AV_FREE_FRAME(av_frame) av_frame_free(av_frame)
181 #define AV_FREE_PACKET(av_packet) av_packet_unref(av_packet)
182 #define AV_FREE_CONTEXT(av_context) avcodec_free_context(&av_context)
183 #define AV_GET_CODEC_TYPE(av_stream) av_stream->codecpar->codec_type
184 #define AV_FIND_DECODER_CODEC_ID(av_stream) av_stream->codecpar->codec_id
185 #define AV_GET_CODEC_CONTEXT(av_stream, av_codec) \
186 ({ AVCodecContext *context = avcodec_alloc_context3(av_codec); \
187 avcodec_parameters_to_context(context, av_stream->codecpar); \
188 context; })
189 #define AV_GET_CODEC_PAR_CONTEXT(av_stream, av_codec) av_codec;
190 #define AV_GET_CODEC_FROM_STREAM(av_stream,codec_in)
191 #define AV_GET_CODEC_ATTRIBUTES(av_stream, av_context) av_stream->codecpar
192 #define AV_GET_CODEC_PIXEL_FORMAT(av_stream, av_context) (AVPixelFormat) av_stream->codecpar->format
193 #define AV_GET_SAMPLE_FORMAT(av_stream, av_context) av_stream->codecpar->format
194 #define AV_GET_IMAGE_SIZE(pix_fmt, width, height) \
195 av_image_get_buffer_size(pix_fmt, width, height, 1)
196 #define AV_COPY_PICTURE_DATA(av_frame, buffer, pix_fmt, width, height) \
197 av_image_fill_arrays(av_frame->data, av_frame->linesize, buffer, pix_fmt, width, height, 1)
198 #define AV_OUTPUT_CONTEXT(output_context, path) avformat_alloc_output_context2( output_context, NULL, NULL, path)
199 #define AV_OPTION_FIND(priv_data, name) av_opt_find(priv_data, name, NULL, 0, 0)
200 #define AV_OPTION_SET( av_stream, priv_data, name, value, avcodec) \
201 av_opt_set(priv_data, name, value, 0); \
202 avcodec_parameters_from_context(av_stream->codecpar, avcodec);
203 #define ALLOC_CODEC_CTX(ctx, codec, stream) \
204 ctx = avcodec_alloc_context3(codec);
205 #define AV_COPY_PARAMS_FROM_CONTEXT(av_stream, av_codec_ctx) \
206 avcodec_parameters_from_context(av_stream->codecpar, av_codec_ctx);
207
208#elif IS_FFMPEG_3_2
209 #define AV_REGISTER_ALL av_register_all();
210 #define AVCODEC_REGISTER_ALL avcodec_register_all();
211 #define AV_FILENAME filename
212 #define AV_SET_FILENAME(oc, f) snprintf(oc->AV_FILENAME, sizeof(oc->AV_FILENAME), "%s", f)
213 #define MY_INPUT_BUFFER_PADDING_SIZE FF_INPUT_BUFFER_PADDING_SIZE
214 #define AV_ALLOCATE_FRAME() av_frame_alloc()
215 #define AV_ALLOCATE_IMAGE(av_frame, pix_fmt, width, height) \
216 av_image_alloc(av_frame->data, av_frame->linesize, width, height, pix_fmt, 1)
217 #define AV_RESET_FRAME(av_frame) av_frame_unref(av_frame)
218 #define AV_FREE_FRAME(av_frame) av_frame_free(av_frame)
219 #define AV_FREE_PACKET(av_packet) av_packet_unref(av_packet)
220 #define AV_FREE_CONTEXT(av_context) avcodec_free_context(&av_context)
221 #define AV_GET_CODEC_TYPE(av_stream) av_stream->codecpar->codec_type
222 #define AV_FIND_DECODER_CODEC_ID(av_stream) av_stream->codecpar->codec_id
223 #define AV_GET_CODEC_CONTEXT(av_stream, av_codec) \
224 ({ AVCodecContext *context = avcodec_alloc_context3(av_codec); \
225 avcodec_parameters_to_context(context, av_stream->codecpar); \
226 context; })
227 #define AV_GET_CODEC_PAR_CONTEXT(av_stream, av_codec) av_codec;
228 #define AV_GET_CODEC_FROM_STREAM(av_stream,codec_in)
229 #define AV_GET_CODEC_ATTRIBUTES(av_stream, av_context) av_stream->codecpar
230 #define AV_GET_CODEC_PIXEL_FORMAT(av_stream, av_context) \
231 (AVPixelFormat) av_stream->codecpar->format
232 #define AV_GET_SAMPLE_FORMAT(av_stream, av_context) av_stream->codecpar->format
233 #define AV_GET_IMAGE_SIZE(pix_fmt, width, height) av_image_get_buffer_size(pix_fmt, width, height, 1)
234 #define AV_COPY_PICTURE_DATA(av_frame, buffer, pix_fmt, width, height) \
235 av_image_fill_arrays(av_frame->data, av_frame->linesize, buffer, pix_fmt, width, height, 1)
236 #define AV_OUTPUT_CONTEXT(output_context, path) \
237 avformat_alloc_output_context2( output_context, NULL, NULL, path)
238 #define AV_OPTION_FIND(priv_data, name) av_opt_find(priv_data, name, NULL, 0, 0)
239 #define AV_OPTION_SET( av_stream, priv_data, name, value, avcodec) \
240 av_opt_set(priv_data, name, value, 0); \
241 avcodec_parameters_from_context(av_stream->codecpar, avcodec);
242 #define ALLOC_CODEC_CTX(ctx, codec, stream) \
243 ctx = avcodec_alloc_context3(codec);
244 #define AV_COPY_PARAMS_FROM_CONTEXT(av_stream, av_codec) \
245 avcodec_parameters_from_context(av_stream->codecpar, av_codec);
246
247#elif LIBAVFORMAT_VERSION_MAJOR >= 55
248 #define AV_REGISTER_ALL av_register_all();
249 #define AVCODEC_REGISTER_ALL avcodec_register_all();
250 #define AV_FILENAME filename
251 #define AV_SET_FILENAME(oc, f) snprintf(oc->AV_FILENAME, sizeof(oc->AV_FILENAME), "%s", f)
252 #define MY_INPUT_BUFFER_PADDING_SIZE FF_INPUT_BUFFER_PADDING_SIZE
253 #define AV_ALLOCATE_FRAME() av_frame_alloc()
254 #define AV_ALLOCATE_IMAGE(av_frame, pix_fmt, width, height) \
255 avpicture_alloc((AVPicture *) av_frame, pix_fmt, width, height)
256 #define AV_RESET_FRAME(av_frame) av_frame_unref(av_frame)
257 #define AV_FREE_FRAME(av_frame) av_frame_free(av_frame)
258 #define AV_FREE_PACKET(av_packet) av_packet_unref(av_packet)
259 #define AV_FREE_CONTEXT(av_context) avcodec_close(av_context)
260 #define AV_GET_CODEC_TYPE(av_stream) av_stream->codec->codec_type
261 #define AV_FIND_DECODER_CODEC_ID(av_stream) av_stream->codec->codec_id
262 #define AV_GET_CODEC_CONTEXT(av_stream, av_codec) av_stream->codec
263 #define AV_GET_CODEC_PAR_CONTEXT(av_stream, av_codec) av_stream->codec
264 #define AV_GET_CODEC_FROM_STREAM(av_stream, codec_in) codec_in = av_stream->codec;
265 #define AV_GET_CODEC_ATTRIBUTES(av_stream, av_context) av_context
266 #define AV_GET_CODEC_PIXEL_FORMAT(av_stream, av_context) av_context->pix_fmt
267 #define AV_GET_SAMPLE_FORMAT(av_stream, av_context) av_context->sample_fmt
268 #define AV_GET_IMAGE_SIZE(pix_fmt, width, height) avpicture_get_size(pix_fmt, width, height)
269 #define AV_COPY_PICTURE_DATA(av_frame, buffer, pix_fmt, width, height) \
270 avpicture_fill((AVPicture *) av_frame, buffer, pix_fmt, width, height)
271 #define AV_OUTPUT_CONTEXT(output_context, path) oc = avformat_alloc_context()
272 #define AV_OPTION_FIND(priv_data, name) av_opt_find(priv_data, name, NULL, 0, 0)
273 #define AV_OPTION_SET(av_stream, priv_data, name, value, avcodec) av_opt_set (priv_data, name, value, 0)
274 #define ALLOC_CODEC_CTX(ctx, av_codec, stream) \
275 avcodec_get_context_defaults3(av_st->codec, av_codec); \
276 ctx = av_st->codec;
277 #define AV_COPY_PARAMS_FROM_CONTEXT(av_stream, av_codec)
278
279#else
280 #define AV_REGISTER_ALL av_register_all();
281 #define AVCODEC_REGISTER_ALL avcodec_register_all();
282 #define AV_FILENAME filename
283 #define AV_SET_FILENAME(oc, f) snprintf(oc->AV_FILENAME, sizeof(oc->AV_FILENAME), "%s", f)
284 #define MY_INPUT_BUFFER_PADDING_SIZE FF_INPUT_BUFFER_PADDING_SIZE
285 #define AV_ALLOCATE_FRAME() avcodec_alloc_frame()
286 #define AV_ALLOCATE_IMAGE(av_frame, pix_fmt, width, height) \
287 avpicture_alloc((AVPicture *) av_frame, pix_fmt, width, height)
288 #define AV_RESET_FRAME(av_frame) avcodec_get_frame_defaults(av_frame)
289 #define AV_FREE_FRAME(av_frame) avcodec_free_frame(av_frame)
290 #define AV_FREE_PACKET(av_packet) av_free_packet(av_packet)
291 #define AV_FREE_CONTEXT(av_context) avcodec_close(av_context)
292 #define AV_GET_CODEC_TYPE(av_stream) av_stream->codec->codec_type
293 #define AV_FIND_DECODER_CODEC_ID(av_stream) av_stream->codec->codec_id
294 #define AV_GET_CODEC_CONTEXT(av_stream, av_codec) av_stream->codec
295 #define AV_GET_CODEC_PAR_CONTEXT(av_stream, av_codec) av_stream->codec
296 #define AV_GET_CODEC_FROM_STREAM(av_stream, codec_in ) codec_in = av_stream->codec;
297 #define AV_GET_CODEC_ATTRIBUTES(av_stream, av_context) av_context
298 #define AV_GET_CODEC_PIXEL_FORMAT(av_stream, av_context) av_context->pix_fmt
299 #define AV_GET_SAMPLE_FORMAT(av_stream, av_context) av_context->sample_fmt
300 #define AV_GET_IMAGE_SIZE(pix_fmt, width, height) avpicture_get_size(pix_fmt, width, height)
301 #define AV_COPY_PICTURE_DATA(av_frame, buffer, pix_fmt, width, height) \
302 avpicture_fill((AVPicture *) av_frame, buffer, pix_fmt, width, height)
303 #define AV_OUTPUT_CONTEXT(output_context, path) oc = avformat_alloc_context()
304 #define AV_OPTION_FIND(priv_data, name) av_opt_find(priv_data, name, NULL, 0, 0)
305 #define AV_OPTION_SET(av_stream, priv_data, name, value, avcodec) av_opt_set (priv_data, name, value, 0)
306 #define ALLOC_CODEC_CTX(ctx, av_codec, stream) \
307 avcodec_get_context_defaults3(stream->codec, av_codec); \
308 ctx = stream->codec;
309 #define AV_COPY_PARAMS_FROM_CONTEXT(av_stream, av_codec)
310#endif
311
312
313#endif // OPENSHOT_FFMPEG_UTILITIES_H
#define AV_ERROR_MAX_STRING_SIZE
#define PixelFormat
Header file that includes the version number of libopenshot.