31 #ifndef OPENSHOT_FFMPEG_UTILITIES_H
32 #define OPENSHOT_FFMPEG_UTILITIES_H
36 #define INT64_C(c) (c ## LL)
37 #define UINT64_C(c) (c ## ULL)
41 #define IS_FFMPEG_3_2 (LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 64, 101))
45 #define HAVE_HW_ACCEL (LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 107, 100))
50 #include <libavcodec/avcodec.h>
51 #include <libavformat/avformat.h>
52 #if (LIBAVFORMAT_VERSION_MAJOR >= 57)
53 #include <libavutil/hwcontext.h>
55 #include <libswscale/swscale.h>
57 #if (LIBAVFORMAT_VERSION_MAJOR >= 57)
61 #include <libswresample/swresample.h>
63 #include <libavresample/avresample.h>
65 #include <libavutil/mathematics.h>
66 #include <libavutil/pixfmt.h>
67 #include <libavutil/pixdesc.h>
70 #if LIBAVFORMAT_VERSION_MAJOR >= 53
71 #include <libavutil/opt.h>
73 #include <libavcodec/opt.h>
77 #if LIBAVFORMAT_VERSION_MAJOR >= 54
78 #include <libavutil/channel_layout.h>
82 #include "libavutil/imgutils.h"
87 #ifndef AVCODEC_MAX_AUDIO_FRAME_SIZE
88 #define AVCODEC_MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio
90 #ifndef AV_ERROR_MAX_STRING_SIZE
91 #define AV_ERROR_MAX_STRING_SIZE 64
93 #ifndef AUDIO_PACKET_ENCODING_SIZE
94 #define AUDIO_PACKET_ENCODING_SIZE 768000 // 48khz * S16 (2 bytes) * max channels (8)
98 inline static const std::string av_make_error_string(
int errnum)
102 return (std::string)errbuf;
107 #define av_err2str(errnum) av_make_error_string(errnum).c_str()
111 #define PixelFormat AVPixelFormat
114 #define PIX_FMT_RGBA AV_PIX_FMT_RGBA
117 #define PIX_FMT_NONE AV_PIX_FMT_NONE
119 #ifndef PIX_FMT_RGB24
120 #define PIX_FMT_RGB24 AV_PIX_FMT_RGB24
122 #ifndef PIX_FMT_YUV420P
123 #define PIX_FMT_YUV420P AV_PIX_FMT_YUV420P
129 #define FF_RSHIFT(a, b) RSHIFT(a, b)
134 #define SWR_CONVERT(ctx, out, linesize, out_count, in, linesize2, in_count) \
135 swr_convert(ctx, out, out_count, (const uint8_t **)in, in_count)
136 #define SWR_ALLOC() swr_alloc()
137 #define SWR_CLOSE(ctx) {}
138 #define SWR_FREE(ctx) swr_free(ctx)
139 #define SWR_INIT(ctx) swr_init(ctx)
140 #define SWRCONTEXT SwrContext
142 #define SWR_CONVERT(ctx, out, linesize, out_count, in, linesize2, in_count) \
143 avresample_convert(ctx, out, linesize, out_count, (uint8_t **)in, linesize2, in_count)
144 #define SWR_ALLOC() avresample_alloc_context()
145 #define SWR_CLOSE(ctx) avresample_close(ctx)
146 #define SWR_FREE(ctx) avresample_free(ctx)
147 #define SWR_INIT(ctx) avresample_open(ctx)
148 #define SWRCONTEXT AVAudioResampleContext
152 #if (LIBAVFORMAT_VERSION_MAJOR >= 58)
153 #define AV_REGISTER_ALL
154 #define AVCODEC_REGISTER_ALL
155 #define AV_FILENAME url
156 #define AV_SET_FILENAME(oc, f) oc->AV_FILENAME = av_strdup(f)
157 #define MY_INPUT_BUFFER_PADDING_SIZE AV_INPUT_BUFFER_PADDING_SIZE
158 #define AV_ALLOCATE_FRAME() av_frame_alloc()
159 #define AV_ALLOCATE_IMAGE(av_frame, pix_fmt, width, height) av_image_alloc(av_frame->data, av_frame->linesize, width, height, pix_fmt, 1)
160 #define AV_RESET_FRAME(av_frame) av_frame_unref(av_frame)
161 #define AV_FREE_FRAME(av_frame) av_frame_free(av_frame)
162 #define AV_FREE_PACKET(av_packet) av_packet_unref(av_packet)
163 #define AV_FREE_CONTEXT(av_context) avcodec_free_context(&av_context)
164 #define AV_GET_CODEC_TYPE(av_stream) av_stream->codecpar->codec_type
165 #define AV_FIND_DECODER_CODEC_ID(av_stream) av_stream->codecpar->codec_id
167 AVCodecContext *context = avcodec_alloc_context3(av_codec); \
168 avcodec_parameters_to_context(context, av_stream->codecpar); \
171 #define AV_GET_CODEC_PAR_CONTEXT(av_stream, av_codec) av_codec;
172 #define AV_GET_CODEC_FROM_STREAM(av_stream,codec_in)
173 #define AV_GET_CODEC_ATTRIBUTES(av_stream, av_context) av_stream->codecpar
174 #define AV_GET_CODEC_PIXEL_FORMAT(av_stream, av_context) (AVPixelFormat) av_stream->codecpar->format
175 #define AV_GET_SAMPLE_FORMAT(av_stream, av_context) av_stream->codecpar->format
176 #define AV_GET_IMAGE_SIZE(pix_fmt, width, height) av_image_get_buffer_size(pix_fmt, width, height, 1)
177 #define AV_COPY_PICTURE_DATA(av_frame, buffer, pix_fmt, width, height) av_image_fill_arrays(av_frame->data, av_frame->linesize, buffer, pix_fmt, width, height, 1)
178 #define AV_OUTPUT_CONTEXT(output_context, path) avformat_alloc_output_context2( output_context, NULL, NULL, path)
179 #define AV_OPTION_FIND(priv_data, name) av_opt_find(priv_data, name, NULL, 0, 0)
180 #define AV_OPTION_SET( av_stream, priv_data, name, value, avcodec) av_opt_set(priv_data, name, value, 0); avcodec_parameters_from_context(av_stream->codecpar, avcodec);
181 #define AV_FORMAT_NEW_STREAM(oc, st_codec, av_codec, av_st) av_st = avformat_new_stream(oc, NULL);\
183 throw OutOfMemory("Could not allocate memory for the video stream.", path); \
184 c = avcodec_alloc_context3(av_codec); \
186 av_st->codecpar->codec_id = av_codec->id;
187 #define AV_COPY_PARAMS_FROM_CONTEXT(av_stream, av_codec) avcodec_parameters_from_context(av_stream->codecpar, av_codec);
189 #define AV_REGISTER_ALL av_register_all();
190 #define AVCODEC_REGISTER_ALL avcodec_register_all();
191 #define AV_FILENAME filename
192 #define AV_SET_FILENAME(oc, f) snprintf(oc->AV_FILENAME, sizeof(oc->AV_FILENAME), "%s", f)
193 #define MY_INPUT_BUFFER_PADDING_SIZE FF_INPUT_BUFFER_PADDING_SIZE
194 #define AV_ALLOCATE_FRAME() av_frame_alloc()
195 #define AV_ALLOCATE_IMAGE(av_frame, pix_fmt, width, height) av_image_alloc(av_frame->data, av_frame->linesize, width, height, pix_fmt, 1)
196 #define AV_RESET_FRAME(av_frame) av_frame_unref(av_frame)
197 #define AV_FREE_FRAME(av_frame) av_frame_free(av_frame)
198 #define AV_FREE_PACKET(av_packet) av_packet_unref(av_packet)
199 #define AV_FREE_CONTEXT(av_context) avcodec_free_context(&av_context)
200 #define AV_GET_CODEC_TYPE(av_stream) av_stream->codecpar->codec_type
201 #define AV_FIND_DECODER_CODEC_ID(av_stream) av_stream->codecpar->codec_id
203 AVCodecContext *context = avcodec_alloc_context3(av_codec); \
204 avcodec_parameters_to_context(context, av_stream->codecpar); \
207 #define AV_GET_CODEC_PAR_CONTEXT(av_stream, av_codec) av_codec;
208 #define AV_GET_CODEC_FROM_STREAM(av_stream,codec_in)
209 #define AV_GET_CODEC_ATTRIBUTES(av_stream, av_context) av_stream->codecpar
210 #define AV_GET_CODEC_PIXEL_FORMAT(av_stream, av_context) (AVPixelFormat) av_stream->codecpar->format
211 #define AV_GET_SAMPLE_FORMAT(av_stream, av_context) av_stream->codecpar->format
212 #define AV_GET_IMAGE_SIZE(pix_fmt, width, height) av_image_get_buffer_size(pix_fmt, width, height, 1)
213 #define AV_COPY_PICTURE_DATA(av_frame, buffer, pix_fmt, width, height) av_image_fill_arrays(av_frame->data, av_frame->linesize, buffer, pix_fmt, width, height, 1)
214 #define AV_OUTPUT_CONTEXT(output_context, path) avformat_alloc_output_context2( output_context, NULL, NULL, path)
215 #define AV_OPTION_FIND(priv_data, name) av_opt_find(priv_data, name, NULL, 0, 0)
216 #define AV_OPTION_SET( av_stream, priv_data, name, value, avcodec) av_opt_set(priv_data, name, value, 0); avcodec_parameters_from_context(av_stream->codecpar, avcodec);
217 #define AV_FORMAT_NEW_STREAM(oc, st_codec, av_codec, av_st) av_st = avformat_new_stream(oc, NULL);\
219 throw OutOfMemory("Could not allocate memory for the video stream.", path); \
220 _Pragma ("GCC diagnostic push"); \
221 _Pragma ("GCC diagnostic ignored \"-Wdeprecated-declarations\""); \
222 avcodec_get_context_defaults3(av_st->codec, av_codec); \
224 _Pragma ("GCC diagnostic pop"); \
226 #define AV_COPY_PARAMS_FROM_CONTEXT(av_stream, av_codec) avcodec_parameters_from_context(av_stream->codecpar, av_codec);
227 #elif LIBAVFORMAT_VERSION_MAJOR >= 55
228 #define AV_REGISTER_ALL av_register_all();
229 #define AVCODEC_REGISTER_ALL avcodec_register_all();
230 #define AV_FILENAME filename
231 #define AV_SET_FILENAME(oc, f) snprintf(oc->AV_FILENAME, sizeof(oc->AV_FILENAME), "%s", f)
232 #define MY_INPUT_BUFFER_PADDING_SIZE FF_INPUT_BUFFER_PADDING_SIZE
233 #define AV_ALLOCATE_FRAME() av_frame_alloc()
234 #define AV_ALLOCATE_IMAGE(av_frame, pix_fmt, width, height) avpicture_alloc((AVPicture *) av_frame, pix_fmt, width, height)
235 #define AV_RESET_FRAME(av_frame) av_frame_unref(av_frame)
236 #define AV_FREE_FRAME(av_frame) av_frame_free(av_frame)
237 #define AV_FREE_PACKET(av_packet) av_packet_unref(av_packet)
238 #define AV_FREE_CONTEXT(av_context) avcodec_close(av_context)
239 #define AV_GET_CODEC_TYPE(av_stream) av_stream->codec->codec_type
240 #define AV_FIND_DECODER_CODEC_ID(av_stream) av_stream->codec->codec_id
241 #define AV_GET_CODEC_CONTEXT(av_stream, av_codec) av_stream->codec
242 #define AV_GET_CODEC_PAR_CONTEXT(av_stream, av_codec) av_stream->codec
243 #define AV_GET_CODEC_FROM_STREAM(av_stream, codec_in) codec_in = av_stream->codec;
244 #define AV_GET_CODEC_ATTRIBUTES(av_stream, av_context) av_context
245 #define AV_GET_CODEC_PIXEL_FORMAT(av_stream, av_context) av_context->pix_fmt
246 #define AV_GET_SAMPLE_FORMAT(av_stream, av_context) av_context->sample_fmt
247 #define AV_GET_IMAGE_SIZE(pix_fmt, width, height) avpicture_get_size(pix_fmt, width, height)
248 #define AV_COPY_PICTURE_DATA(av_frame, buffer, pix_fmt, width, height) avpicture_fill((AVPicture *) av_frame, buffer, pix_fmt, width, height)
249 #define AV_OUTPUT_CONTEXT(output_context, path) oc = avformat_alloc_context()
250 #define AV_OPTION_FIND(priv_data, name) av_opt_find(priv_data, name, NULL, 0, 0)
251 #define AV_OPTION_SET(av_stream, priv_data, name, value, avcodec) av_opt_set (priv_data, name, value, 0)
252 #define AV_FORMAT_NEW_STREAM( oc, av_context, av_codec, av_st) av_st = avformat_new_stream(oc, av_codec); \
254 throw OutOfMemory("Could not allocate memory for the video stream.", path); \
255 avcodec_get_context_defaults3(av_st->codec, av_codec); \
257 #define AV_COPY_PARAMS_FROM_CONTEXT(av_stream, av_codec)
259 #define AV_REGISTER_ALL av_register_all();
260 #define AVCODEC_REGISTER_ALL avcodec_register_all();
261 #define AV_FILENAME filename
262 #define AV_SET_FILENAME(oc, f) snprintf(oc->AV_FILENAME, sizeof(oc->AV_FILENAME), "%s", f)
263 #define MY_INPUT_BUFFER_PADDING_SIZE FF_INPUT_BUFFER_PADDING_SIZE
264 #define AV_ALLOCATE_FRAME() avcodec_alloc_frame()
265 #define AV_ALLOCATE_IMAGE(av_frame, pix_fmt, width, height) avpicture_alloc((AVPicture *) av_frame, pix_fmt, width, height)
266 #define AV_RESET_FRAME(av_frame) avcodec_get_frame_defaults(av_frame)
267 #define AV_FREE_FRAME(av_frame) avcodec_free_frame(av_frame)
268 #define AV_FREE_PACKET(av_packet) av_free_packet(av_packet)
269 #define AV_FREE_CONTEXT(av_context) avcodec_close(av_context)
270 #define AV_GET_CODEC_TYPE(av_stream) av_stream->codec->codec_type
271 #define AV_FIND_DECODER_CODEC_ID(av_stream) av_stream->codec->codec_id
272 #define AV_GET_CODEC_CONTEXT(av_stream, av_codec) av_stream->codec
273 #define AV_GET_CODEC_PAR_CONTEXT(av_stream, av_codec) av_stream->codec
274 #define AV_GET_CODEC_FROM_STREAM(av_stream, codec_in ) codec_in = av_stream->codec;
275 #define AV_GET_CODEC_ATTRIBUTES(av_stream, av_context) av_context
276 #define AV_GET_CODEC_PIXEL_FORMAT(av_stream, av_context) av_context->pix_fmt
277 #define AV_GET_SAMPLE_FORMAT(av_stream, av_context) av_context->sample_fmt
278 #define AV_GET_IMAGE_SIZE(pix_fmt, width, height) avpicture_get_size(pix_fmt, width, height)
279 #define AV_COPY_PICTURE_DATA(av_frame, buffer, pix_fmt, width, height) avpicture_fill((AVPicture *) av_frame, buffer, pix_fmt, width, height)
280 #define AV_OUTPUT_CONTEXT(output_context, path) oc = avformat_alloc_context()
281 #define AV_OPTION_FIND(priv_data, name) av_opt_find(priv_data, name, NULL, 0, 0)
282 #define AV_OPTION_SET(av_stream, priv_data, name, value, avcodec) av_opt_set (priv_data, name, value, 0)
283 #define AV_FORMAT_NEW_STREAM( oc, av_context, av_codec, av_st) av_st = avformat_new_stream(oc, av_codec); \
285 throw OutOfMemory("Could not allocate memory for the video stream.", path); \
286 avcodec_get_context_defaults3(av_st->codec, av_codec); \
288 #define AV_COPY_PARAMS_FROM_CONTEXT(av_stream, av_codec)