Blender V4.5
movie_util.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include "BLI_path_utils.hh"
10#include "BLI_utildefines.h"
11
12#include "DNA_scene_types.h"
13
14#include "MOV_enums.hh"
15#include "MOV_util.hh"
16
17#include "ffmpeg_swscale.hh"
18#include "movie_util.hh"
19
20#ifdef WITH_FFMPEG
21
22# include "BLI_string.h"
23
24# include "BKE_global.hh"
25
26extern "C" {
27# include "ffmpeg_compat.h"
28# include <libavcodec/avcodec.h>
29# include <libavdevice/avdevice.h>
30# include <libavformat/avformat.h>
31# include <libavutil/log.h>
32}
33
34static char ffmpeg_last_error_buffer[1024];
35
36/* BLI_vsnprintf in ffmpeg_log_callback() causes invalid warning */
37# ifdef __GNUC__
38# pragma GCC diagnostic push
39# pragma GCC diagnostic ignored "-Wmissing-format-attribute"
40# endif
41
42static void ffmpeg_log_callback(void *ptr, int level, const char *format, va_list arg)
43{
44 if (ELEM(level, AV_LOG_FATAL, AV_LOG_ERROR)) {
45 size_t n;
46 va_list args_cpy;
47
48 va_copy(args_cpy, arg);
49 n = VSNPRINTF(ffmpeg_last_error_buffer, format, args_cpy);
50 va_end(args_cpy);
51
52 /* strip trailing \n */
53 ffmpeg_last_error_buffer[n - 1] = '\0';
54 }
55
56 if (G.debug & G_DEBUG_FFMPEG) {
57 /* call default logger to print all message to console */
58 av_log_default_callback(ptr, level, format, arg);
59 }
60}
61
62# ifdef __GNUC__
63# pragma GCC diagnostic pop
64# endif
65
66const char *ffmpeg_last_error()
67{
68 return ffmpeg_last_error_buffer;
69}
70
71static int isffmpeg(const char *filepath)
72{
73 AVFormatContext *pFormatCtx = nullptr;
74 uint i;
75 int videoStream;
76 const AVCodec *pCodec;
77
78 if (BLI_path_extension_check_n(filepath,
79 ".swf",
80 ".jpg",
81 ".jp2",
82 ".j2c",
83 ".png",
84 ".dds",
85 ".tga",
86 ".bmp",
87 ".tif",
88 ".exr",
89 ".cin",
90 ".wav",
91 nullptr))
92 {
93 return 0;
94 }
95
96 if (avformat_open_input(&pFormatCtx, filepath, nullptr, nullptr) != 0) {
97 return 0;
98 }
99
100 if (avformat_find_stream_info(pFormatCtx, nullptr) < 0) {
101 avformat_close_input(&pFormatCtx);
102 return 0;
103 }
104
105 /* Find the first video stream */
106 videoStream = -1;
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))
110 {
111 videoStream = i;
112 break;
113 }
114 }
115
116 if (videoStream == -1) {
117 avformat_close_input(&pFormatCtx);
118 return 0;
119 }
120
121 AVCodecParameters *codec_par = pFormatCtx->streams[videoStream]->codecpar;
122
123 /* Find the decoder for the video stream */
124 pCodec = avcodec_find_decoder(codec_par->codec_id);
125 if (pCodec == nullptr) {
126 avformat_close_input(&pFormatCtx);
127 return 0;
128 }
129
130 avformat_close_input(&pFormatCtx);
131
132 return 1;
133}
134
135/* -------------------------------------------------------------------- */
136/* AVFrame de-interlacing. Code for this was originally based on FFMPEG 2.6.4 (LGPL). */
137
138# define MAX_NEG_CROP 1024
139
140# define times4(x) x, x, x, x
141# define times256(x) times4(times4(times4(times4(times4(x)))))
142
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)};
166
167# undef times4
168# undef times256
169
170/* filter parameters: [-1 4 2 4 -1] // 8 */
171FFMPEG_INLINE void deinterlace_line(uint8_t *dst,
172 const uint8_t *lum_m4,
173 const uint8_t *lum_m3,
174 const uint8_t *lum_m2,
175 const uint8_t *lum_m1,
176 const uint8_t *lum,
177 int size)
178{
179 const uint8_t *cm = ff_compat_crop_tab + MAX_NEG_CROP;
180 int sum;
181
182 for (; size > 0; size--) {
183 sum = -lum_m4[0];
184 sum += lum_m3[0] << 2;
185 sum += lum_m2[0] << 1;
186 sum += lum_m1[0] << 2;
187 sum += -lum[0];
188 dst[0] = cm[(sum + 4) >> 3];
189 lum_m4++;
190 lum_m3++;
191 lum_m2++;
192 lum_m1++;
193 lum++;
194 dst++;
195 }
196}
197
198FFMPEG_INLINE void deinterlace_line_inplace(
199 uint8_t *lum_m4, uint8_t *lum_m3, uint8_t *lum_m2, uint8_t *lum_m1, uint8_t *lum, int size)
200{
201 const uint8_t *cm = ff_compat_crop_tab + MAX_NEG_CROP;
202 int sum;
203
204 for (; size > 0; size--) {
205 sum = -lum_m4[0];
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;
210 sum += -lum[0];
211 lum_m2[0] = cm[(sum + 4) >> 3];
212 lum_m4++;
213 lum_m3++;
214 lum_m2++;
215 lum_m1++;
216 lum++;
217 }
218}
219
224FFMPEG_INLINE void deinterlace_bottom_field(
225 uint8_t *dst, int dst_wrap, const uint8_t *src1, int src_wrap, int width, int height)
226{
227 const uint8_t *src_m2, *src_m1, *src_0, *src_p1, *src_p2;
228 int y;
229
230 src_m2 = src1;
231 src_m1 = src1;
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);
237 dst += dst_wrap;
238 deinterlace_line(dst, src_m2, src_m1, src_0, src_p1, src_p2, width);
239 src_m2 = src_0;
240 src_m1 = src_p1;
241 src_0 = src_p2;
242 src_p1 += 2 * src_wrap;
243 src_p2 += 2 * src_wrap;
244 dst += dst_wrap;
245 }
246 memcpy(dst, src_m1, width);
247 dst += dst_wrap;
248 /* do last line */
249 deinterlace_line(dst, src_m2, src_m1, src_0, src_0, src_0, width);
250}
251
252FFMPEG_INLINE int deinterlace_bottom_field_inplace(uint8_t *src1,
253 int src_wrap,
254 int width,
255 int height)
256{
257 uint8_t *src_m1, *src_0, *src_p1, *src_p2;
258 int y;
259 uint8_t *buf = (uint8_t *)av_malloc(width);
260 if (!buf) {
261 return AVERROR(ENOMEM);
262 }
263
264 src_m1 = src1;
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);
271 src_m1 = src_p1;
272 src_0 = src_p2;
273 src_p1 += 2 * src_wrap;
274 src_p2 += 2 * src_wrap;
275 }
276 /* do last line */
277 deinterlace_line_inplace(buf, src_m1, src_0, src_0, src_0, width);
278 av_free(buf);
279 return 0;
280}
281
282int ffmpeg_deinterlace(
283 AVFrame *dst, const AVFrame *src, enum AVPixelFormat pix_fmt, int width, int height)
284{
285 int i, ret;
286
287 if (!ELEM(pix_fmt,
288 AV_PIX_FMT_YUV420P,
289 AV_PIX_FMT_YUVJ420P,
290 AV_PIX_FMT_YUV422P,
291 AV_PIX_FMT_YUVJ422P,
292 AV_PIX_FMT_YUV444P,
293 AV_PIX_FMT_YUV411P,
294 AV_PIX_FMT_GRAY8))
295 {
296 return -1;
297 }
298 if ((width & 3) != 0 || (height & 3) != 0) {
299 return -1;
300 }
301
302 for (i = 0; i < 3; i++) {
303 if (i == 1) {
304 switch (pix_fmt) {
305 case AV_PIX_FMT_YUVJ420P:
306 case AV_PIX_FMT_YUV420P:
307 width >>= 1;
308 height >>= 1;
309 break;
310 case AV_PIX_FMT_YUV422P:
311 case AV_PIX_FMT_YUVJ422P:
312 width >>= 1;
313 break;
314 case AV_PIX_FMT_YUV411P:
315 width >>= 2;
316 break;
317 default:
318 break;
319 }
320 if (pix_fmt == AV_PIX_FMT_GRAY8) {
321 break;
322 }
323 }
324 if (src == dst) {
325 ret = deinterlace_bottom_field_inplace(dst->data[i], dst->linesize[i], width, height);
326 if (ret < 0) {
327 return ret;
328 }
329 }
330 else {
331 deinterlace_bottom_field(
332 dst->data[i], dst->linesize[i], src->data[i], src->linesize[i], width, height);
333 }
334 }
335 return 0;
336}
337
338AVCodecID mov_av_codec_id_get(IMB_Ffmpeg_Codec_ID id)
339{
340 switch (id) {
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;
391 }
392
394 return AV_CODEC_ID_NONE;
395}
396
397static void ffmpeg_preset_set(RenderData *rd, int preset)
398{
399 bool is_ntsc = (rd->frs_sec != 25);
400
401 switch (preset) {
404 rd->ffcodecdata.codec_id_set(FFMPEG_CODEC_ID_H264);
405 rd->ffcodecdata.video_bitrate = 6000;
406 rd->ffcodecdata.gop_size = is_ntsc ? 18 : 15;
407 rd->ffcodecdata.rc_max_rate = 9000;
408 rd->ffcodecdata.rc_min_rate = 0;
409 rd->ffcodecdata.rc_buffer_size = 224 * 8;
410 rd->ffcodecdata.mux_packet_size = 2048;
411 rd->ffcodecdata.mux_rate = 10080000;
412 break;
413
416 if (preset == FFMPEG_PRESET_XVID) {
418 rd->ffcodecdata.codec_id_set(FFMPEG_CODEC_ID_MPEG4);
419 }
420 else if (preset == FFMPEG_PRESET_THEORA) {
421 rd->ffcodecdata.type = FFMPEG_OGG; /* XXX broken */
422 rd->ffcodecdata.codec_id_set(FFMPEG_CODEC_ID_THEORA);
423 }
424
425 rd->ffcodecdata.video_bitrate = 6000;
426 rd->ffcodecdata.gop_size = is_ntsc ? 18 : 15;
427 rd->ffcodecdata.rc_max_rate = 9000;
428 rd->ffcodecdata.rc_min_rate = 0;
429 rd->ffcodecdata.rc_buffer_size = 224 * 8;
430 rd->ffcodecdata.mux_packet_size = 2048;
431 rd->ffcodecdata.mux_rate = 10080000;
432 break;
433
436 rd->ffcodecdata.codec_id_set(FFMPEG_CODEC_ID_AV1);
437 rd->ffcodecdata.video_bitrate = 6000;
438 rd->ffcodecdata.gop_size = is_ntsc ? 18 : 15;
439 rd->ffcodecdata.rc_max_rate = 9000;
440 rd->ffcodecdata.rc_min_rate = 0;
441 rd->ffcodecdata.rc_buffer_size = 224 * 8;
442 rd->ffcodecdata.mux_packet_size = 2048;
443 rd->ffcodecdata.mux_rate = 10080000;
444 break;
445 }
446}
447
448int MOV_codec_valid_bit_depths(AVCodecID av_codec_id)
449{
450 int bit_depths = R_IMF_CHAN_DEPTH_8;
451 /* Note: update properties_output.py `use_bpp` when changing this function. */
452 if (ELEM(av_codec_id,
453 AV_CODEC_ID_H264,
454 AV_CODEC_ID_H265,
455 AV_CODEC_ID_AV1,
456 AV_CODEC_ID_PRORES,
457 AV_CODEC_ID_FFV1))
458 {
459 bit_depths |= R_IMF_CHAN_DEPTH_10;
460 }
461 if (ELEM(av_codec_id, AV_CODEC_ID_H265, AV_CODEC_ID_AV1, AV_CODEC_ID_FFV1)) {
462 bit_depths |= R_IMF_CHAN_DEPTH_12;
463 }
464 if (ELEM(av_codec_id, AV_CODEC_ID_FFV1)) {
465 bit_depths |= R_IMF_CHAN_DEPTH_16;
466 }
467 return bit_depths;
468}
469
470bool MOV_codec_supports_alpha(AVCodecID av_codec_id, int ffmpeg_profile)
471{
472 if (av_codec_id == AV_CODEC_ID_PRORES) {
474 }
475 return ELEM(av_codec_id,
476 AV_CODEC_ID_FFV1,
477 AV_CODEC_ID_QTRLE,
478 AV_CODEC_ID_PNG,
479 AV_CODEC_ID_VP9,
480 AV_CODEC_ID_HUFFYUV);
481}
482
483bool MOV_codec_supports_crf(AVCodecID av_codec_id)
484{
485 return ELEM(av_codec_id,
486 AV_CODEC_ID_H264,
487 AV_CODEC_ID_H265,
488 AV_CODEC_ID_MPEG4,
489 AV_CODEC_ID_VP9,
490 AV_CODEC_ID_AV1);
491}
492
493#endif /* WITH_FFMPEG */
494
495bool MOV_is_movie_file(const char *filepath)
496{
497 BLI_assert(!BLI_path_is_rel(filepath));
498
499#ifdef WITH_FFMPEG
500 if (isffmpeg(filepath)) {
501 return true;
502 }
503#else
504 UNUSED_VARS(filepath);
505#endif
506
507 return false;
508}
509
511{
512#ifdef WITH_FFMPEG
513 avdevice_register_all();
514
515 ffmpeg_last_error_buffer[0] = '\0';
516
517 if (G.debug & G_DEBUG_FFMPEG) {
518 av_log_set_level(AV_LOG_DEBUG);
519 }
520
521 /* set separate callback which could store last error to report to UI */
522 av_log_set_callback(ffmpeg_log_callback);
523#endif
524}
525
527{
528#ifdef WITH_FFMPEG
529 ffmpeg_sws_exit();
530#endif
531}
532
534{
535#ifdef WITH_FFMPEG
536
537 if (imf->imtype == R_IMF_IMTYPE_FFMPEG) {
538 if (rd->ffcodecdata.type <= 0 || rd->ffcodecdata.codec_id_get() <= 0 ||
539 rd->ffcodecdata.video_bitrate <= 1)
540 {
541 ffmpeg_preset_set(rd, FFMPEG_PRESET_H264);
545 }
546 if (rd->ffcodecdata.type == FFMPEG_OGG) {
548 }
549 }
550 else if (imf->imtype == R_IMF_IMTYPE_H264) {
551 if (rd->ffcodecdata.codec_id_get() != FFMPEG_CODEC_ID_H264) {
552 ffmpeg_preset_set(rd, FFMPEG_PRESET_H264);
553 }
554 }
555 else if (imf->imtype == R_IMF_IMTYPE_XVID) {
556 if (rd->ffcodecdata.codec_id_get() != FFMPEG_CODEC_ID_MPEG4) {
557 ffmpeg_preset_set(rd, FFMPEG_PRESET_XVID);
558 }
559 }
560 else if (imf->imtype == R_IMF_IMTYPE_THEORA) {
561 if (rd->ffcodecdata.codec_id_get() != FFMPEG_CODEC_ID_THEORA) {
562 ffmpeg_preset_set(rd, FFMPEG_PRESET_THEORA);
563 }
564 }
565 else if (imf->imtype == R_IMF_IMTYPE_AV1) {
566 if (rd->ffcodecdata.codec_id_get() != FFMPEG_CODEC_ID_AV1) {
567 ffmpeg_preset_set(rd, FFMPEG_PRESET_AV1);
568 }
569 }
570#else
571 UNUSED_VARS(rd, imf);
572#endif
573}
574
576{
577#ifdef WITH_FFMPEG
578 return MOV_codec_valid_bit_depths(mov_av_codec_id_get(codec_id));
579#else
580 UNUSED_VARS(codec_id);
581 return R_IMF_CHAN_DEPTH_8;
582#endif
583}
584
585bool MOV_codec_supports_alpha(IMB_Ffmpeg_Codec_ID codec_id, int ffmpeg_profile)
586{
587#ifdef WITH_FFMPEG
588 return MOV_codec_supports_alpha(mov_av_codec_id_get(codec_id), ffmpeg_profile);
589#else
590 UNUSED_VARS(codec_id, ffmpeg_profile);
591 return false;
592#endif
593}
594
596{
597#ifdef WITH_FFMPEG
598 return MOV_codec_supports_crf(mov_av_codec_id_get(codec_id));
599#else
600 UNUSED_VARS(codec_id);
601 return false;
602#endif
603}
@ G_DEBUG_FFMPEG
#define BLI_assert_unreachable()
Definition BLI_assert.h:93
#define BLI_assert(a)
Definition BLI_assert.h:46
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)
Definition BLI_string.h:602
unsigned int uint
#define UNUSED_VARS(...)
#define ELEM(...)
IMB_Ffmpeg_Codec_ID
@ FFMPEG_CODEC_ID_VP9
@ FFMPEG_CODEC_ID_THEORA
@ FFMPEG_CODEC_ID_FLV1
@ FFMPEG_CODEC_ID_FFV1
@ FFMPEG_CODEC_ID_PRORES
@ FFMPEG_CODEC_ID_H264
@ FFMPEG_CODEC_ID_MPEG1VIDEO
@ FFMPEG_CODEC_ID_QTRLE
@ FFMPEG_CODEC_ID_PCM_S16LE
@ FFMPEG_CODEC_ID_MP3
@ FFMPEG_CODEC_ID_HUFFYUV
@ FFMPEG_CODEC_ID_AV1
@ FFMPEG_CODEC_ID_PNG
@ FFMPEG_CODEC_ID_DNXHD
@ FFMPEG_CODEC_ID_MP2
@ FFMPEG_CODEC_ID_AAC
@ FFMPEG_CODEC_ID_OPUS
@ FFMPEG_CODEC_ID_DVVIDEO
@ FFMPEG_CODEC_ID_MPEG4
@ FFMPEG_CODEC_ID_FLAC
@ FFMPEG_CODEC_ID_MPEG2VIDEO
@ FFMPEG_CODEC_ID_VORBIS
@ FFMPEG_CODEC_ID_H265
@ FFMPEG_CODEC_ID_NONE
@ FFMPEG_CODEC_ID_AC3
@ R_IMF_IMTYPE_FFMPEG
@ R_IMF_IMTYPE_H264
@ R_IMF_IMTYPE_THEORA
@ R_IMF_IMTYPE_AV1
@ R_IMF_IMTYPE_XVID
@ FFM_PRESET_GOOD
@ FFM_CRF_MEDIUM
@ R_IMF_CHAN_DEPTH_8
@ R_IMF_CHAN_DEPTH_16
@ R_IMF_CHAN_DEPTH_12
@ R_IMF_CHAN_DEPTH_10
@ FFM_PRORES_PROFILE_4444_XQ
@ FFM_PRORES_PROFILE_4444
@ FFMPEG_PRESET_AV1
Definition MOV_enums.hh:33
@ FFMPEG_PRESET_H264
Definition MOV_enums.hh:30
@ FFMPEG_PRESET_THEORA
Definition MOV_enums.hh:31
@ FFMPEG_PRESET_XVID
Definition MOV_enums.hh:32
@ FFMPEG_AV1
Definition MOV_enums.hh:25
@ FFMPEG_MPEG2
Definition MOV_enums.hh:13
@ FFMPEG_MKV
Definition MOV_enums.hh:21
@ FFMPEG_AVI
Definition MOV_enums.hh:15
@ FFMPEG_OGG
Definition MOV_enums.hh:22
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
static T sum(const btAlignedObjectArray< T > &items)
#define FFMPEG_INLINE
format
#define G(x, y, z)
void MOV_init()
bool MOV_is_movie_file(const char *filepath)
void MOV_exit()
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)
return ret
struct FFMpegCodecData ffcodecdata
i
Definition text_draw.cc:230
PointerRNA * ptr
Definition wm_files.cc:4227