123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014 |
- Patch to extend support ffmpeg>=5.0 in Blender 3.0.1 (for latest slackbuild compatible with Slackware64 current)
- Source: https://github.com/blender/blender/commit/af6a1b08e3f0d0070ac9423868d2d3f81057717a
- Adapted by Giancarlo Dessi <slack at giand dot it>
- --- blender-3.0.1/extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp
- +++ blender-3.0.1-fixed/extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp
- @@ -177,7 +177,7 @@
-
- // get a decoder and open it
- #ifndef FFMPEG_OLD_CODE
- - AVCodec* aCodec = avcodec_find_decoder(m_formatCtx->streams[m_stream]->codecpar->codec_id);
- + const AVCodec* aCodec = avcodec_find_decoder(m_formatCtx->streams[m_stream]->codecpar->codec_id);
-
- if(!aCodec)
- AUD_THROW(FileException, "File couldn't be read, no decoder found with ffmpeg.");
- --- blender-3.0.1/extern/audaspace/plugins/ffmpeg/FFMPEGWriter.cpp
- +++ blender-3.0.1-fixed/extern/audaspace/plugins/ffmpeg/FFMPEGWriter.cpp
- @@ -23,6 +23,7 @@
- extern "C" {
- #include <libavcodec/avcodec.h>
- #include <libavformat/avio.h>
- +#include <libavutil/channel_layout.h>
- }
-
- AUD_NAMESPACE_BEGIN
- @@ -171,66 +172,66 @@
- if(avformat_alloc_output_context2(&m_formatCtx, nullptr, formats[format], filename.c_str()) < 0)
- AUD_THROW(FileException, "File couldn't be written, format couldn't be found with ffmpeg.");
-
- - AVOutputFormat* outputFmt = m_formatCtx->oformat;
- + const AVOutputFormat* outputFmt = m_formatCtx->oformat;
-
- if(!outputFmt) {
- avformat_free_context(m_formatCtx);
- AUD_THROW(FileException, "File couldn't be written, output format couldn't be found with ffmpeg.");
- }
-
- - outputFmt->audio_codec = AV_CODEC_ID_NONE;
- + AVCodecID audio_codec = AV_CODEC_ID_NONE;
-
- switch(codec)
- {
- case CODEC_AAC:
- - outputFmt->audio_codec = AV_CODEC_ID_AAC;
- + audio_codec = AV_CODEC_ID_AAC;
- break;
- case CODEC_AC3:
- - outputFmt->audio_codec = AV_CODEC_ID_AC3;
- + audio_codec = AV_CODEC_ID_AC3;
- break;
- case CODEC_FLAC:
- - outputFmt->audio_codec = AV_CODEC_ID_FLAC;
- + audio_codec = AV_CODEC_ID_FLAC;
- break;
- case CODEC_MP2:
- - outputFmt->audio_codec = AV_CODEC_ID_MP2;
- + audio_codec = AV_CODEC_ID_MP2;
- break;
- case CODEC_MP3:
- - outputFmt->audio_codec = AV_CODEC_ID_MP3;
- + audio_codec = AV_CODEC_ID_MP3;
- break;
- case CODEC_OPUS:
- - outputFmt->audio_codec = AV_CODEC_ID_OPUS;
- + audio_codec = AV_CODEC_ID_OPUS;
- break;
- case CODEC_PCM:
- switch(specs.format)
- {
- case FORMAT_U8:
- - outputFmt->audio_codec = AV_CODEC_ID_PCM_U8;
- + audio_codec = AV_CODEC_ID_PCM_U8;
- break;
- case FORMAT_S16:
- - outputFmt->audio_codec = AV_CODEC_ID_PCM_S16LE;
- + audio_codec = AV_CODEC_ID_PCM_S16LE;
- break;
- case FORMAT_S24:
- - outputFmt->audio_codec = AV_CODEC_ID_PCM_S24LE;
- + audio_codec = AV_CODEC_ID_PCM_S24LE;
- break;
- case FORMAT_S32:
- - outputFmt->audio_codec = AV_CODEC_ID_PCM_S32LE;
- + audio_codec = AV_CODEC_ID_PCM_S32LE;
- break;
- case FORMAT_FLOAT32:
- - outputFmt->audio_codec = AV_CODEC_ID_PCM_F32LE;
- + audio_codec = AV_CODEC_ID_PCM_F32LE;
- break;
- case FORMAT_FLOAT64:
- - outputFmt->audio_codec = AV_CODEC_ID_PCM_F64LE;
- + audio_codec = AV_CODEC_ID_PCM_F64LE;
- break;
- default:
- - outputFmt->audio_codec = AV_CODEC_ID_NONE;
- + audio_codec = AV_CODEC_ID_NONE;
- break;
- }
- break;
- case CODEC_VORBIS:
- - outputFmt->audio_codec = AV_CODEC_ID_VORBIS;
- + audio_codec = AV_CODEC_ID_VORBIS;
- break;
- default:
- - outputFmt->audio_codec = AV_CODEC_ID_NONE;
- + audio_codec = AV_CODEC_ID_NONE;
- break;
- }
-
- @@ -268,10 +269,10 @@
-
- try
- {
- - if(outputFmt->audio_codec == AV_CODEC_ID_NONE)
- + if(audio_codec == AV_CODEC_ID_NONE)
- AUD_THROW(FileException, "File couldn't be written, audio codec not found with ffmpeg.");
-
- - AVCodec* codec = avcodec_find_encoder(outputFmt->audio_codec);
- + const AVCodec* codec = avcodec_find_encoder(audio_codec);
- if(!codec)
- AUD_THROW(FileException, "File couldn't be written, audio encoder couldn't be found with ffmpeg.");
-
- --- blender-3.0.1/source/blender/blenkernel/BKE_writeffmpeg.h
- +++ blender-3.0.1-fixed/source/blender/blenkernel/BKE_writeffmpeg.h
- @@ -85,12 +85,8 @@
-
- void BKE_ffmpeg_preset_set(struct RenderData *rd, int preset);
- void BKE_ffmpeg_image_type_verify(struct RenderData *rd, struct ImageFormatData *imf);
- -void BKE_ffmpeg_codec_settings_verify(struct RenderData *rd);
- bool BKE_ffmpeg_alpha_channel_is_supported(const struct RenderData *rd);
-
- -int BKE_ffmpeg_property_add_string(struct RenderData *rd, const char *type, const char *str);
- -void BKE_ffmpeg_property_del(struct RenderData *rd, void *type, void *prop_);
- -
- void *BKE_ffmpeg_context_create(void);
- void BKE_ffmpeg_context_free(void *context_v);
-
- --- blender-3.0.1/source/blender/blenkernel/intern/scene.c
- +++ blender-3.0.1-fixed/source/blender/blenkernel/intern/scene.c
- @@ -332,12 +332,6 @@
- scene_dst->r.avicodecdata->lpParms = MEM_dupallocN(scene_dst->r.avicodecdata->lpParms);
- }
-
- - if (scene_src->r.ffcodecdata.properties) {
- - /* intentionally check sce_dst not sce_src. */ /* XXX ??? comment outdated... */
- - scene_dst->r.ffcodecdata.properties = IDP_CopyProperty_ex(scene_src->r.ffcodecdata.properties,
- - flag_subdata);
- - }
- -
- if (scene_src->display.shading.prop) {
- scene_dst->display.shading.prop = IDP_CopyProperty(scene_src->display.shading.prop);
- }
- @@ -408,10 +402,6 @@
- MEM_freeN(scene->r.avicodecdata);
- scene->r.avicodecdata = NULL;
- }
- - if (scene->r.ffcodecdata.properties) {
- - IDP_FreeProperty(scene->r.ffcodecdata.properties);
- - scene->r.ffcodecdata.properties = NULL;
- - }
-
- scene_free_markers(scene, do_id_user);
- BLI_freelistN(&scene->transform_spaces);
- @@ -915,9 +905,6 @@
- BLO_write_raw(writer, (size_t)sce->r.avicodecdata->cbParms, sce->r.avicodecdata->lpParms);
- }
- }
- - if (sce->r.ffcodecdata.properties) {
- - IDP_BlendWrite(writer, sce->r.ffcodecdata.properties);
- - }
-
- /* writing dynamic list of TimeMarkers to the blend file */
- LISTBASE_FOREACH (TimeMarker *, marker, &sce->markers) {
- @@ -1157,11 +1144,6 @@
- BLO_read_data_address(reader, &sce->r.avicodecdata->lpFormat);
- BLO_read_data_address(reader, &sce->r.avicodecdata->lpParms);
- }
- - if (sce->r.ffcodecdata.properties) {
- - BLO_read_data_address(reader, &sce->r.ffcodecdata.properties);
- - IDP_BlendDataRead(reader, &sce->r.ffcodecdata.properties);
- - }
- -
- BLO_read_list(reader, &(sce->markers));
- LISTBASE_FOREACH (TimeMarker *, marker, &sce->markers) {
- BLO_read_data_address(reader, &marker->prop);
- @@ -1773,10 +1755,6 @@
- sce_copy->r.avicodecdata->lpParms = MEM_dupallocN(sce_copy->r.avicodecdata->lpParms);
- }
-
- - if (sce->r.ffcodecdata.properties) { /* intentionally check scen not sce. */
- - sce_copy->r.ffcodecdata.properties = IDP_CopyProperty(sce->r.ffcodecdata.properties);
- - }
- -
- BKE_sound_reset_scene_runtime(sce_copy);
-
- /* grease pencil */
- --- blender-3.0.1/source/blender/blenkernel/intern/writeffmpeg.c
- +++ blender-3.0.1-fixed/source/blender/blenkernel/intern/writeffmpeg.c
- @@ -56,6 +56,7 @@
- * like M_SQRT1_2 leading to warnings with MSVC */
- # include <libavcodec/avcodec.h>
- # include <libavformat/avformat.h>
- +# include <libavutil/channel_layout.h>
- # include <libavutil/imgutils.h>
- # include <libavutil/opt.h>
- # include <libavutil/rational.h>
- @@ -113,8 +114,6 @@
- printf
-
- static void ffmpeg_dict_set_int(AVDictionary **dict, const char *key, int value);
- -static void ffmpeg_dict_set_float(AVDictionary **dict, const char *key, float value);
- -static void ffmpeg_set_expert_options(RenderData *rd);
- static void ffmpeg_filepath_get(FFMpegContext *context,
- char *string,
- const struct RenderData *rd,
- @@ -425,99 +424,6 @@
- return context->current_frame;
- }
-
- -static void set_ffmpeg_property_option(IDProperty *prop, AVDictionary **dictionary)
- -{
- - char name[128];
- - char *param;
- -
- - PRINT("FFMPEG expert option: %s: ", prop->name);
- -
- - BLI_strncpy(name, prop->name, sizeof(name));
- -
- - param = strchr(name, ':');
- -
- - if (param) {
- - *param++ = '\0';
- - }
- -
- - switch (prop->type) {
- - case IDP_STRING:
- - PRINT("%s.\n", IDP_String(prop));
- - av_dict_set(dictionary, name, IDP_String(prop), 0);
- - break;
- - case IDP_FLOAT:
- - PRINT("%g.\n", IDP_Float(prop));
- - ffmpeg_dict_set_float(dictionary, prop->name, IDP_Float(prop));
- - break;
- - case IDP_INT:
- - PRINT("%d.\n", IDP_Int(prop));
- -
- - if (param) {
- - if (IDP_Int(prop)) {
- - av_dict_set(dictionary, name, param, 0);
- - }
- - else {
- - return;
- - }
- - }
- - else {
- - ffmpeg_dict_set_int(dictionary, prop->name, IDP_Int(prop));
- - }
- - break;
- - }
- -}
- -
- -static int ffmpeg_proprty_valid(AVCodecContext *c, const char *prop_name, IDProperty *curr)
- -{
- - int valid = 1;
- -
- - if (STREQ(prop_name, "video")) {
- - if (STREQ(curr->name, "bf")) {
- - /* flash codec doesn't support b frames */
- - valid &= c->codec_id != AV_CODEC_ID_FLV1;
- - }
- - }
- -
- - return valid;
- -}
- -
- -static void set_ffmpeg_properties(RenderData *rd,
- - AVCodecContext *c,
- - const char *prop_name,
- - AVDictionary **dictionary)
- -{
- - IDProperty *prop;
- - IDProperty *curr;
- -
- - /* TODO(sergey): This is actually rather stupid, because changing
- - * codec settings in render panel would also set expert options.
- - *
- - * But we need ti here in order to get rid of deprecated settings
- - * when opening old files in new blender.
- - *
- - * For as long we don't allow editing properties in the interface
- - * it's all good. bug if we allow editing them, we'll need to
- - * replace it with some smarter code which would port settings
- - * from deprecated to new one.
- - */
- - ffmpeg_set_expert_options(rd);
- -
- - if (!rd->ffcodecdata.properties) {
- - return;
- - }
- -
- - prop = IDP_GetPropertyFromGroup(rd->ffcodecdata.properties, prop_name);
- - if (!prop) {
- - return;
- - }
- -
- - for (curr = prop->data.group.first; curr; curr = curr->next) {
- - if (ffmpeg_proprty_valid(c, prop_name, curr)) {
- - set_ffmpeg_property_option(curr, dictionary);
- - }
- - }
- -}
- -
- static AVRational calc_time_base(uint den, double num, int codec_id)
- {
- /* Convert the input 'num' to an integer. Simply shift the decimal places until we get an integer
- @@ -572,7 +478,7 @@
- int error_size)
- {
- AVStream *st;
- - AVCodec *codec;
- + const AVCodec *codec;
- AVDictionary *opts = NULL;
-
- error[0] = '\0';
- @@ -585,21 +491,15 @@
-
- /* Set up the codec context */
-
- - context->video_codec = avcodec_alloc_context3(NULL);
- - AVCodecContext *c = context->video_codec;
- - c->codec_id = codec_id;
- - c->codec_type = AVMEDIA_TYPE_VIDEO;
- -
- - codec = avcodec_find_encoder(c->codec_id);
- + codec = avcodec_find_encoder(codec_id);
- if (!codec) {
- fprintf(stderr, "Couldn't find valid video codec\n");
- - avcodec_free_context(&c);
- context->video_codec = NULL;
- return NULL;
- }
-
- - /* Load codec defaults into 'c'. */
- - avcodec_get_context_defaults3(c, codec);
- + context->video_codec = avcodec_alloc_context3(codec);
- + AVCodecContext *c = context->video_codec;
-
- /* Get some values from the current render settings */
-
- @@ -713,6 +613,13 @@
- }
- }
-
- + if (codec_id == AV_CODEC_ID_DNXHD) {
- + if (rd->ffcodecdata.flags & FFMPEG_LOSSLESS_OUTPUT) {
- + /* Set the block decision algorithm to be of the highest quality ("rd" == 2). */
- + c->mb_decision = 2;
- + }
- + }
- +
- if (codec_id == AV_CODEC_ID_FFV1) {
- c->pix_fmt = AV_PIX_FMT_RGB32;
- }
- @@ -751,8 +658,6 @@
- 255);
- st->avg_frame_rate = av_inv_q(c->time_base);
-
- - set_ffmpeg_properties(rd, c, "video", &opts);
- -
- if (codec->capabilities & AV_CODEC_CAP_AUTO_THREADS) {
- c->thread_count = 0;
- }
- @@ -815,8 +720,7 @@
- int error_size)
- {
- AVStream *st;
- - AVCodec *codec;
- - AVDictionary *opts = NULL;
- + const AVCodec *codec;
-
- error[0] = '\0';
-
- @@ -826,24 +730,17 @@
- }
- st->id = 1;
-
- - context->audio_codec = avcodec_alloc_context3(NULL);
- - AVCodecContext *c = context->audio_codec;
- - c->thread_count = BLI_system_thread_count();
- - c->thread_type = FF_THREAD_SLICE;
- -
- - c->codec_id = codec_id;
- - c->codec_type = AVMEDIA_TYPE_AUDIO;
- -
- - codec = avcodec_find_encoder(c->codec_id);
- + codec = avcodec_find_encoder(codec_id);
- if (!codec) {
- fprintf(stderr, "Couldn't find valid audio codec\n");
- - avcodec_free_context(&c);
- context->audio_codec = NULL;
- return NULL;
- }
-
- - /* Load codec defaults into 'c'. */
- - avcodec_get_context_defaults3(c, codec);
- + context->audio_codec = avcodec_alloc_context3(codec);
- + AVCodecContext *c = context->audio_codec;
- + c->thread_count = BLI_system_thread_count();
- + c->thread_type = FF_THREAD_SLICE;
-
- c->sample_rate = rd->ffcodecdata.audio_mixrate;
- c->bit_rate = context->ffmpeg_audio_bitrate * 1000;
- @@ -911,19 +808,15 @@
- c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
- }
-
- - set_ffmpeg_properties(rd, c, "audio", &opts);
- -
- - int ret = avcodec_open2(c, codec, &opts);
- + int ret = avcodec_open2(c, codec, NULL);
-
- if (ret < 0) {
- fprintf(stderr, "Couldn't initialize audio codec: %s\n", av_err2str(ret));
- BLI_strncpy(error, IMB_ffmpeg_last_error(), error_size);
- - av_dict_free(&opts);
- avcodec_free_context(&c);
- context->audio_codec = NULL;
- return NULL;
- }
- - av_dict_free(&opts);
-
- /* need to prevent floating point exception when using vorbis audio codec,
- * initialize this value in the same way as it's done in FFmpeg itself (sergey) */
- @@ -969,15 +862,6 @@
- av_dict_set(dict, key, buffer, 0);
- }
-
- -static void ffmpeg_dict_set_float(AVDictionary **dict, const char *key, float value)
- -{
- - char buffer[32];
- -
- - BLI_snprintf(buffer, sizeof(buffer), "%.8f", value);
- -
- - av_dict_set(dict, key, buffer, 0);
- -}
- -
- static void ffmpeg_add_metadata_callback(void *data,
- const char *propname,
- char *propvalue,
- @@ -996,8 +880,7 @@
- {
- /* Handle to the output file */
- AVFormatContext *of;
- - AVOutputFormat *fmt;
- - AVDictionary *opts = NULL;
- + const AVOutputFormat *fmt;
- char name[FILE_MAX], error[1024];
- const char **exts;
-
- @@ -1034,11 +917,13 @@
- rectx,
- recty);
-
- + /* Sanity checks for the output file extensions. */
- exts = get_file_extensions(context->ffmpeg_type);
- if (!exts) {
- BKE_report(reports, RPT_ERROR, "No valid formats found");
- return 0;
- }
- +
- fmt = av_guess_format(NULL, exts[0], NULL);
- if (!fmt) {
- BKE_report(reports, RPT_ERROR, "No valid formats found");
- @@ -1047,66 +932,50 @@
-
- of = avformat_alloc_context();
- if (!of) {
- - BKE_report(reports, RPT_ERROR, "Error opening output file");
- + BKE_report(reports, RPT_ERROR, "Can't allocate ffmpeg format context");
- return 0;
- }
-
- - /* Returns after this must 'goto fail;' */
- -
- - of->oformat = fmt;
- -
- - /* Only bother with setting packet size & mux rate when CRF is not used. */
- - if (context->ffmpeg_crf == 0) {
- - of->packet_size = rd->ffcodecdata.mux_packet_size;
- - if (context->ffmpeg_audio_codec != AV_CODEC_ID_NONE) {
- - ffmpeg_dict_set_int(&opts, "muxrate", rd->ffcodecdata.mux_rate);
- - }
- - else {
- - av_dict_set(&opts, "muxrate", "0", 0);
- - }
- - }
- -
- - ffmpeg_dict_set_int(&opts, "preload", (int)(0.5 * AV_TIME_BASE));
- -
- - of->max_delay = (int)(0.7 * AV_TIME_BASE);
- -
- - fmt->audio_codec = context->ffmpeg_audio_codec;
- + enum AVCodecID audio_codec = context->ffmpeg_audio_codec;
- + enum AVCodecID video_codec = context->ffmpeg_codec;
-
- of->url = av_strdup(name);
- - /* set the codec to the user's selection */
- + /* Check if we need to force change the codec because of file type codec restrictions */
- switch (context->ffmpeg_type) {
- - case FFMPEG_AVI:
- - case FFMPEG_MOV:
- - case FFMPEG_MKV:
- - fmt->video_codec = context->ffmpeg_codec;
- - break;
- case FFMPEG_OGG:
- - fmt->video_codec = AV_CODEC_ID_THEORA;
- + video_codec = AV_CODEC_ID_THEORA;
- break;
- case FFMPEG_DV:
- - fmt->video_codec = AV_CODEC_ID_DVVIDEO;
- + video_codec = AV_CODEC_ID_DVVIDEO;
- break;
- case FFMPEG_MPEG1:
- - fmt->video_codec = AV_CODEC_ID_MPEG1VIDEO;
- + video_codec = AV_CODEC_ID_MPEG1VIDEO;
- break;
- case FFMPEG_MPEG2:
- - fmt->video_codec = AV_CODEC_ID_MPEG2VIDEO;
- + video_codec = AV_CODEC_ID_MPEG2VIDEO;
- break;
- case FFMPEG_H264:
- - fmt->video_codec = AV_CODEC_ID_H264;
- + video_codec = AV_CODEC_ID_H264;
- break;
- case FFMPEG_XVID:
- - fmt->video_codec = AV_CODEC_ID_MPEG4;
- + video_codec = AV_CODEC_ID_MPEG4;
- break;
- case FFMPEG_FLV:
- - fmt->video_codec = AV_CODEC_ID_FLV1;
- + video_codec = AV_CODEC_ID_FLV1;
- break;
- - case FFMPEG_MPEG4:
- default:
- - fmt->video_codec = context->ffmpeg_codec;
- + /* These containers are not restricted to any specific codec types.
- + * Currently we expect these to be .avi, .mov, .mkv, and .mp4.
- + */
- + video_codec = context->ffmpeg_codec;
- break;
- }
- - if (fmt->video_codec == AV_CODEC_ID_DVVIDEO) {
- +
- + /* Returns after this must 'goto fail;' */
- +
- + of->oformat = fmt;
- +
- + if (video_codec == AV_CODEC_ID_DVVIDEO) {
- if (rectx != 720) {
- BKE_report(reports, RPT_ERROR, "Render width has to be 720 pixels for DV!");
- goto fail;
- @@ -1122,17 +991,17 @@
- }
-
- if (context->ffmpeg_type == FFMPEG_DV) {
- - fmt->audio_codec = AV_CODEC_ID_PCM_S16LE;
- + audio_codec = AV_CODEC_ID_PCM_S16LE;
- if (context->ffmpeg_audio_codec != AV_CODEC_ID_NONE &&
- rd->ffcodecdata.audio_mixrate != 48000 && rd->ffcodecdata.audio_channels != 2) {
- BKE_report(reports, RPT_ERROR, "FFMPEG only supports 48khz / stereo audio for DV!");
- goto fail;
- }
- }
-
- if (fmt->video_codec != AV_CODEC_ID_NONE) {
- context->video_stream = alloc_video_stream(
- - context, rd, fmt->video_codec, of, rectx, recty, error, sizeof(error));
- + context, rd, video_codec, of, rectx, recty, error, sizeof(error));
- PRINT("alloc video stream %p\n", context->video_stream);
- if (!context->video_stream) {
- if (error[0]) {
- @@ -1148,8 +1017,7 @@
- }
-
- if (context->ffmpeg_audio_codec != AV_CODEC_ID_NONE) {
- - context->audio_stream = alloc_audio_stream(
- - context, rd, fmt->audio_codec, of, error, sizeof(error));
- + context->audio_stream = alloc_audio_stream(context, rd, audio_codec, of, error, sizeof(error));
- if (!context->audio_stream) {
- if (error[0]) {
- BKE_report(reports, RPT_ERROR, error);
- @@ -1186,7 +1054,6 @@
-
- context->outfile = of;
- av_dump_format(of, 0, name, 1);
- - av_dict_free(&opts);
-
- return 1;
- @@ -1203,7 +1070,6 @@
- context->audio_stream = NULL;
- }
-
- - av_dict_free(&opts);
- avformat_free_context(of);
- return 0;
- }
- @@ -1533,198 +1399,17 @@
- end_ffmpeg_impl(context, false);
- }
-
- -/* properties */
- -
- -void BKE_ffmpeg_property_del(RenderData *rd, void *type, void *prop_)
- -{
- - struct IDProperty *prop = (struct IDProperty *)prop_;
- - IDProperty *group;
- -
- - if (!rd->ffcodecdata.properties) {
- - return;
- - }
- -
- - group = IDP_GetPropertyFromGroup(rd->ffcodecdata.properties, type);
- - if (group && prop) {
- - IDP_FreeFromGroup(group, prop);
- - }
- -}
- -
- -static IDProperty *BKE_ffmpeg_property_add(RenderData *rd,
- - const char *type,
- - const AVOption *o,
- - const AVOption *parent)
- -{
- - AVCodecContext c;
- - IDProperty *group;
- - IDProperty *prop;
- - IDPropertyTemplate val;
- - int idp_type;
- - char name[256];
- -
- - val.i = 0;
- -
- - avcodec_get_context_defaults3(&c, NULL);
- -
- - if (!rd->ffcodecdata.properties) {
- - rd->ffcodecdata.properties = IDP_New(IDP_GROUP, &val, "ffmpeg");
- - }
- -
- - group = IDP_GetPropertyFromGroup(rd->ffcodecdata.properties, type);
- -
- - if (!group) {
- - group = IDP_New(IDP_GROUP, &val, type);
- - IDP_AddToGroup(rd->ffcodecdata.properties, group);
- - }
- -
- - if (parent) {
- - BLI_snprintf(name, sizeof(name), "%s:%s", parent->name, o->name);
- - }
- - else {
- - BLI_strncpy(name, o->name, sizeof(name));
- - }
- -
- - PRINT("ffmpeg_property_add: %s %s\n", type, name);
- -
- - prop = IDP_GetPropertyFromGroup(group, name);
- - if (prop) {
- - return prop;
- - }
- -
- - switch (o->type) {
- - case AV_OPT_TYPE_INT:
- - case AV_OPT_TYPE_INT64:
- - val.i = o->default_val.i64;
- - idp_type = IDP_INT;
- - break;
- - case AV_OPT_TYPE_DOUBLE:
- - case AV_OPT_TYPE_FLOAT:
- - val.f = o->default_val.dbl;
- - idp_type = IDP_FLOAT;
- - break;
- - case AV_OPT_TYPE_STRING:
- - val.string.str =
- - (char
- - *)" ";
- - val.string.len = 80;
- - idp_type = IDP_STRING;
- - break;
- - case AV_OPT_TYPE_CONST:
- - val.i = 1;
- - idp_type = IDP_INT;
- - break;
- - default:
- - return NULL;
- - }
- - prop = IDP_New(idp_type, &val, name);
- - IDP_AddToGroup(group, prop);
- - return prop;
- -}
- -
- -/* not all versions of ffmpeg include that, so here we go ... */
- -
- -int BKE_ffmpeg_property_add_string(RenderData *rd, const char *type, const char *str)
- -{
- - AVCodecContext c;
- - const AVOption *o = NULL;
- - const AVOption *p = NULL;
- - char name_[128];
- - char *name;
- - char *param;
- - IDProperty *prop = NULL;
- -
- - avcodec_get_context_defaults3(&c, NULL);
- -
- - BLI_strncpy(name_, str, sizeof(name_));
- -
- - name = name_;
- - while (*name == ' ') {
- - name++;
- - }
- -
- - param = strchr(name, ':');
- -
- - if (!param) {
- - param = strchr(name, ' ');
- - }
- - if (param) {
- - *param++ = '\0';
- - while (*param == ' ') {
- - param++;
- - }
- - }
- -
- - o = av_opt_find(&c, name, NULL, 0, AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
- - if (!o) {
- - PRINT("Ignoring unknown expert option %s\n", str);
- - return 0;
- - }
- - if (param && o->type == AV_OPT_TYPE_CONST) {
- - return 0;
- - }
- - if (param && o->type != AV_OPT_TYPE_CONST && o->unit) {
- - p = av_opt_find(&c, param, o->unit, 0, AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
- - if (p) {
- - prop = BKE_ffmpeg_property_add(rd, (char *)type, p, o);
- - }
- - else {
- - PRINT("Ignoring unknown expert option %s\n", str);
- - }
- - }
- - else {
- - prop = BKE_ffmpeg_property_add(rd, (char *)type, o, NULL);
- - }
- -
- - if (!prop) {
- - return 0;
- - }
- -
- - if (param && !p) {
- - switch (prop->type) {
- - case IDP_INT:
- - IDP_Int(prop) = atoi(param);
- - break;
- - case IDP_FLOAT:
- - IDP_Float(prop) = atof(param);
- - break;
- - case IDP_STRING:
- - strncpy(IDP_String(prop), param, prop->len);
- - break;
- - }
- - }
- - return 1;
- -}
- -
- -static void ffmpeg_set_expert_options(RenderData *rd)
- -{
- - int codec_id = rd->ffcodecdata.codec;
- -
- - if (rd->ffcodecdata.properties) {
- - IDP_FreePropertyContent(rd->ffcodecdata.properties);
- - }
- -
- - if (codec_id == AV_CODEC_ID_DNXHD) {
- - if (rd->ffcodecdata.flags & FFMPEG_LOSSLESS_OUTPUT) {
- - BKE_ffmpeg_property_add_string(rd, "video", "mbd:rd");
- - }
- - }
- -}
- -
- void BKE_ffmpeg_preset_set(RenderData *rd, int preset)
- {
- - int isntsc = (rd->frs_sec != 25);
- -
- - if (rd->ffcodecdata.properties) {
- - IDP_FreePropertyContent(rd->ffcodecdata.properties);
- - }
- + bool is_ntsc = (rd->frs_sec != 25);
-
- switch (preset) {
- case FFMPEG_PRESET_VCD:
- rd->ffcodecdata.type = FFMPEG_MPEG1;
- rd->ffcodecdata.video_bitrate = 1150;
- rd->xsch = 352;
- - rd->ysch = isntsc ? 240 : 288;
- - rd->ffcodecdata.gop_size = isntsc ? 18 : 15;
- + rd->ysch = is_ntsc ? 240 : 288;
- + rd->ffcodecdata.gop_size = is_ntsc ? 18 : 15;
- rd->ffcodecdata.rc_max_rate = 1150;
- rd->ffcodecdata.rc_min_rate = 1150;
- rd->ffcodecdata.rc_buffer_size = 40 * 8;
- @@ -1736,8 +1421,8 @@
- rd->ffcodecdata.type = FFMPEG_MPEG2;
- rd->ffcodecdata.video_bitrate = 2040;
- rd->xsch = 480;
- - rd->ysch = isntsc ? 480 : 576;
- - rd->ffcodecdata.gop_size = isntsc ? 18 : 15;
- + rd->ysch = is_ntsc ? 480 : 576;
- + rd->ffcodecdata.gop_size = is_ntsc ? 18 : 15;
- rd->ffcodecdata.rc_max_rate = 2516;
- rd->ffcodecdata.rc_min_rate = 0;
- rd->ffcodecdata.rc_buffer_size = 224 * 8;
- @@ -1754,7 +1439,7 @@
- rd->ysch = isntsc ? 480 : 576;
- # endif
-
- - rd->ffcodecdata.gop_size = isntsc ? 18 : 15;
- + rd->ffcodecdata.gop_size = is_ntsc ? 18 : 15;
- rd->ffcodecdata.rc_max_rate = 9000;
- rd->ffcodecdata.rc_min_rate = 0;
- rd->ffcodecdata.rc_buffer_size = 224 * 8;
- @@ -1765,14 +1450,14 @@
- case FFMPEG_PRESET_DV:
- rd->ffcodecdata.type = FFMPEG_DV;
- rd->xsch = 720;
- - rd->ysch = isntsc ? 480 : 576;
- + rd->ysch = is_ntsc ? 480 : 576;
- break;
-
- case FFMPEG_PRESET_H264:
- rd->ffcodecdata.type = FFMPEG_AVI;
- rd->ffcodecdata.codec = AV_CODEC_ID_H264;
- rd->ffcodecdata.video_bitrate = 6000;
- - rd->ffcodecdata.gop_size = isntsc ? 18 : 15;
- + rd->ffcodecdata.gop_size = is_ntsc ? 18 : 15;
- rd->ffcodecdata.rc_max_rate = 9000;
- rd->ffcodecdata.rc_min_rate = 0;
- rd->ffcodecdata.rc_buffer_size = 224 * 8;
- @@ -1793,16 +1478,14 @@
- }
-
- rd->ffcodecdata.video_bitrate = 6000;
- - rd->ffcodecdata.gop_size = isntsc ? 18 : 15;
- + rd->ffcodecdata.gop_size = is_ntsc ? 18 : 15;
- rd->ffcodecdata.rc_max_rate = 9000;
- rd->ffcodecdata.rc_min_rate = 0;
- rd->ffcodecdata.rc_buffer_size = 224 * 8;
- rd->ffcodecdata.mux_packet_size = 2048;
- rd->ffcodecdata.mux_rate = 10080000;
- break;
- }
- -
- - ffmpeg_set_expert_options(rd);
- }
-
- void BKE_ffmpeg_image_type_verify(RenderData *rd, ImageFormatData *imf)
- @@ -1848,11 +1531,6 @@
- }
- }
-
- -void BKE_ffmpeg_codec_settings_verify(RenderData *rd)
- -{
- - ffmpeg_set_expert_options(rd);
- -}
- -
- bool BKE_ffmpeg_alpha_channel_is_supported(const RenderData *rd)
- {
- int codec = rd->ffcodecdata.codec;
- --- blender-3.0.1/source/blender/imbuf/intern/IMB_anim.h
- +++ blender-3.0.1-fixed/source/blender/imbuf/intern/IMB_anim.h
- @@ -124,7 +124,7 @@
- #ifdef WITH_FFMPEG
- AVFormatContext *pFormatCtx;
- AVCodecContext *pCodecCtx;
- - AVCodec *pCodec;
- + const AVCodec *pCodec;
- AVFrame *pFrame;
- int pFrameComplete;
- AVFrame *pFrameRGB;
- --- blender-3.0.1/source/blender/imbuf/intern/anim_movie.c
- +++ blender-3.0.1-fixed/source/blender/imbuf/anim_movie.c
- @@ -511,7 +511,7 @@
- {
- int i, video_stream_index;
-
- - AVCodec *pCodec;
- + const AVCodec *pCodec;
- AVFormatContext *pFormatCtx = NULL;
- AVCodecContext *pCodecCtx;
- AVRational frame_rate;
- --- blender-3.0.1/source/blender/imbuf/intern/indexer.c
- +++ blender-3.0.1-fixed/source/blender/imbuf/intern/indexer.c
- @@ -490,7 +490,7 @@
- AVFormatContext *of;
- AVStream *st;
- AVCodecContext *c;
- - AVCodec *codec;
- + const AVCodec *codec;
- struct SwsContext *sws_ctx;
- AVFrame *frame;
- int cfra;
- @@ -522,12 +522,9 @@
- rv->st = avformat_new_stream(rv->of, NULL);
- rv->st->id = 0;
-
- - rv->c = avcodec_alloc_context3(NULL);
- - rv->c->codec_type = AVMEDIA_TYPE_VIDEO;
- - rv->c->codec_id = AV_CODEC_ID_H264;
- + rv->codec = avcodec_find_encoder(AV_CODEC_ID_H264);
-
- - rv->of->oformat->video_codec = rv->c->codec_id;
- - rv->codec = avcodec_find_encoder(rv->c->codec_id);
- + rv->c = avcodec_alloc_context3(rv->codec);
-
- if (!rv->codec) {
- fprintf(stderr,
- @@ -539,8 +536,6 @@
- return NULL;
- }
-
- - avcodec_get_context_defaults3(rv->c, rv->codec);
- -
- rv->c->width = width;
- rv->c->height = height;
- rv->c->gop_size = 10;
- @@ -791,7 +786,7 @@
-
- AVFormatContext *iFormatCtx;
- AVCodecContext *iCodecCtx;
- - AVCodec *iCodec;
- + const AVCodec *iCodec;
- AVStream *iStream;
- int videoStream;
-
- --- blender-3.0.1/source/blender/imbuf/intern/util.c
- +++ blender-3.0.1-fixed/source/blender/imbuf/util.c
- @@ -267,7 +267,7 @@
- AVFormatContext *pFormatCtx = NULL;
- unsigned int i;
- int videoStream;
- - AVCodec *pCodec;
- + const AVCodec *pCodec;
-
- if (BLI_path_extension_check_n(filepath,
- ".swf",
- --- blender-3.0.1/source/blender/makesdna/DNA_scene_types.h
- +++ blender-3.0.1-fixed/source/blender/makesdna/DNA_scene_types.h
- @@ -157,7 +157,6 @@
- int audio_bitrate;
- int audio_mixrate;
- int audio_channels;
- - char _pad0[4];
- float audio_volume;
- int gop_size;
- /** Only used if FFMPEG_USE_MAX_B_FRAMES flag is set. */
- @@ -172,9 +171,7 @@
- int rc_buffer_size;
- int mux_packet_size;
- int mux_rate;
- - char _pad1[4];
- -
- - IDProperty *properties;
- + void *_pad1;
- } FFMpegCodecData;
-
- /* ************************************************************* */
- --- blender-3.0.1/source/blender/makesrna/intern/rna_scene.c
- +++ blender-3.0.1-fixed/source/blender/makesrna/intern/rna_scene.c
- @@ -1469,18 +1469,6 @@
- else {
- rd->ffcodecdata.flags &= ~FFMPEG_LOSSLESS_OUTPUT;
- }
- -
- - BKE_ffmpeg_codec_settings_verify(rd);
- -}
- -
- -static void rna_FFmpegSettings_codec_settings_update(Main *UNUSED(bmain),
- - Scene *UNUSED(scene_unused),
- - PointerRNA *ptr)
- -{
- - Scene *scene = (Scene *)ptr->owner_id;
- - RenderData *rd = &scene->r;
- -
- - BKE_ffmpeg_codec_settings_verify(rd);
- }
- # endif
-
- @@ -5682,17 +5670,13 @@
- RNA_def_property_enum_items(prop, ffmpeg_format_items);
- RNA_def_property_enum_default(prop, FFMPEG_MKV);
- RNA_def_property_ui_text(prop, "Container", "Output file container");
- - RNA_def_property_update(
- - prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_FFmpegSettings_codec_settings_update");
-
- prop = RNA_def_property(srna, "codec", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_bitflag_sdna(prop, NULL, "codec");
- RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
- RNA_def_property_enum_items(prop, ffmpeg_codec_items);
- RNA_def_property_enum_default(prop, AV_CODEC_ID_H264);
- RNA_def_property_ui_text(prop, "Video Codec", "FFmpeg codec to use for video output");
- - RNA_def_property_update(
- - prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_FFmpegSettings_codec_settings_update");
-
- prop = RNA_def_property(srna, "video_bitrate", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "video_bitrate");
|