28# include <libavcodec/avcodec.h>
29# include <libavdevice/avdevice.h>
30# include <libavformat/avformat.h>
31# include <libavutil/log.h>
34static char ffmpeg_last_error_buffer[1024];
38# pragma GCC diagnostic push
39# pragma GCC diagnostic ignored "-Wmissing-format-attribute"
42static void ffmpeg_log_callback(
void *
ptr,
int level,
const char *
format, va_list arg)
44 if (
ELEM(level, AV_LOG_FATAL, AV_LOG_ERROR)) {
48 va_copy(args_cpy, arg);
53 ffmpeg_last_error_buffer[n - 1] =
'\0';
58 av_log_default_callback(
ptr, level,
format, arg);
63# pragma GCC diagnostic pop
66const char *ffmpeg_last_error()
68 return ffmpeg_last_error_buffer;
71static int isffmpeg(
const char *filepath)
73 AVFormatContext *pFormatCtx =
nullptr;
76 const AVCodec *pCodec;
96 if (avformat_open_input(&pFormatCtx, filepath,
nullptr,
nullptr) != 0) {
100 if (avformat_find_stream_info(pFormatCtx,
nullptr) < 0) {
101 avformat_close_input(&pFormatCtx);
107 for (
i = 0;
i < pFormatCtx->nb_streams;
i++) {
108 if (pFormatCtx->streams[
i] && pFormatCtx->streams[
i]->codecpar &&
109 (pFormatCtx->streams[
i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO))
116 if (videoStream == -1) {
117 avformat_close_input(&pFormatCtx);
121 AVCodecParameters *codec_par = pFormatCtx->streams[videoStream]->codecpar;
124 pCodec = avcodec_find_decoder(codec_par->codec_id);
125 if (pCodec ==
nullptr) {
126 avformat_close_input(&pFormatCtx);
130 avformat_close_input(&pFormatCtx);
138# define MAX_NEG_CROP 1024
140# define times4(x) x, x, x, x
141# define times256(x) times4(times4(times4(times4(times4(x)))))
143static const uint8_t ff_compat_crop_tab[256 + 2 * MAX_NEG_CROP] = {
144 times256(0x00), 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
145 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
146 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22,
147 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E,
148 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A,
149 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,
150 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52,
151 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E,
152 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A,
153 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
154 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82,
155 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E,
156 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A,
157 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
158 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2,
159 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE,
160 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA,
161 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
162 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2,
163 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE,
164 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA,
165 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, times256(0xFF)};
172 const uint8_t *lum_m4,
173 const uint8_t *lum_m3,
174 const uint8_t *lum_m2,
175 const uint8_t *lum_m1,
179 const uint8_t *cm = ff_compat_crop_tab + MAX_NEG_CROP;
184 sum += lum_m3[0] << 2;
185 sum += lum_m2[0] << 1;
186 sum += lum_m1[0] << 2;
188 dst[0] = cm[(
sum + 4) >> 3];
199 uint8_t *lum_m4, uint8_t *lum_m3, uint8_t *lum_m2, uint8_t *lum_m1, uint8_t *lum,
int size)
201 const uint8_t *cm = ff_compat_crop_tab + MAX_NEG_CROP;
206 sum += lum_m3[0] << 2;
207 sum += lum_m2[0] << 1;
208 lum_m4[0] = lum_m2[0];
209 sum += lum_m1[0] << 2;
211 lum_m2[0] = cm[(
sum + 4) >> 3];
225 uint8_t *dst,
int dst_wrap,
const uint8_t *src1,
int src_wrap,
int width,
int height)
227 const uint8_t *src_m2, *src_m1, *src_0, *src_p1, *src_p2;
232 src_0 = &src_m1[src_wrap];
233 src_p1 = &src_0[src_wrap];
234 src_p2 = &src_p1[src_wrap];
235 for (
y = 0;
y < (height - 2);
y += 2) {
236 memcpy(dst, src_m1, width);
238 deinterlace_line(dst, src_m2, src_m1, src_0, src_p1, src_p2, width);
242 src_p1 += 2 * src_wrap;
243 src_p2 += 2 * src_wrap;
246 memcpy(dst, src_m1, width);
249 deinterlace_line(dst, src_m2, src_m1, src_0, src_0, src_0, width);
252FFMPEG_INLINE int deinterlace_bottom_field_inplace(uint8_t *src1,
257 uint8_t *src_m1, *src_0, *src_p1, *src_p2;
261 return AVERROR(ENOMEM);
265 memcpy(buf, src_m1, width);
266 src_0 = &src_m1[src_wrap];
267 src_p1 = &src_0[src_wrap];
268 src_p2 = &src_p1[src_wrap];
269 for (
y = 0;
y < (height - 2);
y += 2) {
270 deinterlace_line_inplace(buf, src_m1, src_0, src_p1, src_p2, width);
273 src_p1 += 2 * src_wrap;
274 src_p2 += 2 * src_wrap;
277 deinterlace_line_inplace(buf, src_m1, src_0, src_0, src_0, width);
282int ffmpeg_deinterlace(
283 AVFrame *dst,
const AVFrame *src,
enum AVPixelFormat pix_fmt,
int width,
int height)
298 if ((width & 3) != 0 || (height & 3) != 0) {
302 for (
i = 0;
i < 3;
i++) {
305 case AV_PIX_FMT_YUVJ420P:
306 case AV_PIX_FMT_YUV420P:
310 case AV_PIX_FMT_YUV422P:
311 case AV_PIX_FMT_YUVJ422P:
314 case AV_PIX_FMT_YUV411P:
320 if (pix_fmt == AV_PIX_FMT_GRAY8) {
325 ret = deinterlace_bottom_field_inplace(dst->data[
i], dst->linesize[
i], width, height);
331 deinterlace_bottom_field(
332 dst->data[
i], dst->linesize[
i], src->data[
i], src->linesize[
i], width, height);
342 return AV_CODEC_ID_NONE;
344 return AV_CODEC_ID_MPEG1VIDEO;
346 return AV_CODEC_ID_MPEG2VIDEO;
348 return AV_CODEC_ID_MPEG4;
350 return AV_CODEC_ID_FLV1;
352 return AV_CODEC_ID_DVVIDEO;
354 return AV_CODEC_ID_HUFFYUV;
356 return AV_CODEC_ID_H264;
358 return AV_CODEC_ID_THEORA;
360 return AV_CODEC_ID_FFV1;
362 return AV_CODEC_ID_QTRLE;
364 return AV_CODEC_ID_PNG;
366 return AV_CODEC_ID_DNXHD;
368 return AV_CODEC_ID_VP9;
370 return AV_CODEC_ID_H265;
372 return AV_CODEC_ID_AV1;
374 return AV_CODEC_ID_PRORES;
376 return AV_CODEC_ID_PCM_S16LE;
378 return AV_CODEC_ID_MP2;
380 return AV_CODEC_ID_MP3;
382 return AV_CODEC_ID_AAC;
384 return AV_CODEC_ID_AC3;
386 return AV_CODEC_ID_VORBIS;
388 return AV_CODEC_ID_FLAC;
390 return AV_CODEC_ID_OPUS;
394 return AV_CODEC_ID_NONE;
397static void ffmpeg_preset_set(
RenderData *rd,
int preset)
399 bool is_ntsc = (rd->
frs_sec != 25);
452 if (
ELEM(av_codec_id,
461 if (
ELEM(av_codec_id, AV_CODEC_ID_H265, AV_CODEC_ID_AV1, AV_CODEC_ID_FFV1)) {
464 if (
ELEM(av_codec_id, AV_CODEC_ID_FFV1)) {
472 if (av_codec_id == AV_CODEC_ID_PRORES) {
475 return ELEM(av_codec_id,
480 AV_CODEC_ID_HUFFYUV);
485 return ELEM(av_codec_id,
500 if (isffmpeg(filepath)) {
513 avdevice_register_all();
515 ffmpeg_last_error_buffer[0] =
'\0';
518 av_log_set_level(AV_LOG_DEBUG);
522 av_log_set_callback(ffmpeg_log_callback);
#define BLI_assert_unreachable()
bool BLI_path_is_rel(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
bool BLI_path_extension_check_n(const char *path,...) ATTR_NONNULL(1) ATTR_SENTINEL(0)
#define VSNPRINTF(dst, format, args)
@ FFMPEG_CODEC_ID_MPEG1VIDEO
@ FFMPEG_CODEC_ID_PCM_S16LE
@ FFMPEG_CODEC_ID_HUFFYUV
@ FFMPEG_CODEC_ID_DVVIDEO
@ FFMPEG_CODEC_ID_MPEG2VIDEO
@ FFM_PRORES_PROFILE_4444_XQ
@ FFM_PRORES_PROFILE_4444
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
static T sum(const btAlignedObjectArray< T > &items)
bool MOV_is_movie_file(const char *filepath)
int MOV_codec_valid_bit_depths(IMB_Ffmpeg_Codec_ID codec_id)
bool MOV_codec_supports_alpha(IMB_Ffmpeg_Codec_ID codec_id, int ffmpeg_profile)
void MOV_validate_output_settings(RenderData *rd, const ImageFormatData *imf)
bool MOV_codec_supports_crf(IMB_Ffmpeg_Codec_ID codec_id)
struct FFMpegCodecData ffcodecdata