--- HandBrake-1.1.2.orig/gtk/configure.ac 2018-09-04 14:35:01.000000000 -0500 +++ HandBrake-1.1.2/gtk/configure.ac 2018-11-07 16:19:55.149573439 -0500 @@ -170,7 +170,7 @@ GHB_CFLAGS="$HBINC $GHB_CFLAGS" -HB_LIBS="-lhandbrake -lavresample -lavformat -lavcodec -lavfilter -lavutil -ldvdnav -ldvdread -lmp3lame -lvorbis -lvorbisenc -logg -lsamplerate -lx264 -lswscale -ltheoraenc -ltheoradec -lvpx -lz -lbz2 -lbluray -lass -lfontconfig -lfreetype -lxml2 -ljansson -lopus" +HB_LIBS="-lhandbrake -lavformat -lavfilter -lavcodec -lavutil -lswresample -lpostproc -ldvdnav -ldvdread -lmp3lame -lvorbis -lvorbisenc -logg -lsamplerate -lx264 -lswscale -ltheoraenc -ltheoradec -lvpx -lz -lbz2 -lbluray -lass -lfontconfig -lfreetype -lxml2 -ljansson -lopus" case $host in *-*-mingw*) --- HandBrake-1.1.2.orig/libhb/decavcodec.c 2018-09-04 14:35:01.000000000 -0500 +++ HandBrake-1.1.2/libhb/decavcodec.c 2018-11-07 16:27:29.862414400 -0500 @@ -390,13 +390,12 @@ //if (!(pv->qsv.decode && pv->job != NULL && (pv->job->vcodec & HB_VCODEC_QSV_MASK))) #endif { - hb_avcodec_close(pv->context); + hb_avcodec_free_context(&pv->context); } } if ( pv->context ) { - av_freep( &pv->context->extradata ); - av_freep( &pv->context ); + hb_avcodec_free_context(&pv->context); } hb_audio_resample_free(pv->resample); @@ -821,9 +820,7 @@ if ( parser != NULL ) av_parser_close( parser ); - hb_avcodec_close( context ); - av_freep( &context->extradata ); - av_freep( &context ); + hb_avcodec_free_context(&context); return result; } @@ -1294,8 +1291,12 @@ { int result; - av_buffersrc_add_frame(pv->video_filters.input, pv->frame); - result = av_buffersink_get_frame(pv->video_filters.output, pv->frame); + result = av_buffersrc_add_frame(pv->video_filters.input, pv->frame); + if (result < 0) { + hb_error("filter_video: failed to add frame"); + } else { + result = av_buffersink_get_frame(pv->video_filters.output, pv->frame); + } while (result >= 0) { hb_buffer_t * buf = copy_frame(pv); @@ -2101,9 +2102,7 @@ if ( pv->title->opaque_priv == NULL ) { pv->video_codec_opened = 0; - hb_avcodec_close( pv->context ); - av_freep( &pv->context->extradata ); - av_freep( &pv->context ); + hb_avcodec_free_context(&pv->context); if ( pv->parser ) { av_parser_close(pv->parser); @@ -2239,7 +2238,8 @@ av_packet_unref(&avp); return; } - out = hb_audio_resample(pv->resample, pv->frame->extended_data, + out = hb_audio_resample(pv->resample, + (const uint8_t **)pv->frame->extended_data, pv->frame->nb_samples); if (out != NULL && pv->drop_samples > 0) { --- HandBrake-1.1.2.orig/libhb/decpgssub.c 2018-09-04 14:35:01.000000000 -0500 +++ HandBrake-1.1.2/libhb/decpgssub.c 2018-11-07 16:33:05.320629765 -0500 @@ -502,7 +502,7 @@ { hb_work_private_t * pv = w->private_data; avcodec_flush_buffers( pv->context ); - avcodec_close( pv->context ); + avcodec_free_context( &pv->context ); } hb_work_object_t hb_decpgssub = --- HandBrake-1.1.2.orig/libhb/encavcodec.c 2018-09-04 14:35:01.000000000 -0500 +++ HandBrake-1.1.2/libhb/encavcodec.c 2018-11-07 16:35:51.169822169 -0500 @@ -399,12 +399,13 @@ return; } hb_chapter_queue_close(&pv->chapter_queue); - if( pv->context && pv->context->codec ) + if( pv->context ) { hb_deep_log( 2, "encavcodec: closing libavcodec" ); - avcodec_flush_buffers( pv->context ); - hb_avcodec_close( pv->context ); - av_free( pv->context ); + if( pv->context->codec ) { + avcodec_flush_buffers( pv->context ); + } + hb_avcodec_free_context(&pv->context); } if( pv->file ) { --- HandBrake-1.1.2.orig/libhb/encavcodecaudio.c 2018-09-04 14:35:01.000000000 -0500 +++ HandBrake-1.1.2/libhb/encavcodecaudio.c 2018-11-07 18:16:43.503730591 -0500 @@ -23,7 +23,7 @@ uint8_t * input_buf; hb_list_t * list; - AVAudioResampleContext *avresample; + SwrContext * swresample; int64_t last_pts; }; @@ -231,40 +231,40 @@ if (context->sample_fmt != AV_SAMPLE_FMT_FLT) { pv->output_buf = malloc(pv->max_output_bytes); - pv->avresample = avresample_alloc_context(); - if (pv->avresample == NULL) + pv->swresample = swr_alloc(); + if (pv->swresample == NULL) { - hb_error("encavcodecaInit: avresample_alloc_context() failed"); + hb_error("encavcodecaInit: swr_alloc() failed"); return 1; } - av_opt_set_int(pv->avresample, "in_sample_fmt", + av_opt_set_int(pv->swresample, "in_sample_fmt", AV_SAMPLE_FMT_FLT, 0); - av_opt_set_int(pv->avresample, "out_sample_fmt", + av_opt_set_int(pv->swresample, "out_sample_fmt", context->sample_fmt, 0); - av_opt_set_int(pv->avresample, "in_channel_layout", + av_opt_set_int(pv->swresample, "in_channel_layout", context->channel_layout, 0); - av_opt_set_int(pv->avresample, "out_channel_layout", + av_opt_set_int(pv->swresample, "out_channel_layout", context->channel_layout, 0); if (hb_audio_dither_is_supported(audio->config.out.codec)) { // dithering needs the sample rate - av_opt_set_int(pv->avresample, "in_sample_rate", + av_opt_set_int(pv->swresample, "in_sample_rate", context->sample_rate, 0); - av_opt_set_int(pv->avresample, "out_sample_rate", + av_opt_set_int(pv->swresample, "out_sample_rate", context->sample_rate, 0); - av_opt_set_int(pv->avresample, "dither_method", + av_opt_set_int(pv->swresample, "dither_method", audio->config.out.dither_method, 0); } - if (avresample_open(pv->avresample)) + if (swr_init(pv->swresample)) { - hb_error("encavcodecaInit: avresample_open() failed"); - avresample_free(&pv->avresample); + hb_error("encavcodecaInit: swr_init() failed"); + swr_free(&pv->swresample); return 1; } } else { - pv->avresample = NULL; + pv->swresample = NULL; pv->output_buf = pv->input_buf; } @@ -308,10 +308,10 @@ { Finalize(w); hb_deep_log(2, "encavcodecaudio: closing libavcodec"); - if (pv->context->codec != NULL) + if (pv->context->codec != NULL) { avcodec_flush_buffers(pv->context); - hb_avcodec_close(pv->context); - av_free( pv->context ); + } + hb_avcodec_free_context(&pv->context); } if (pv->output_buf != NULL) @@ -329,9 +329,9 @@ hb_list_empty(&pv->list); } - if (pv->avresample != NULL) + if (pv->swresample != NULL) { - avresample_free(&pv->avresample); + swr_free(&pv->swresample); } free(pv); @@ -404,31 +404,28 @@ pv->input_samples * sizeof(float), &pts, &pos); // Prepare input frame - int out_linesize, out_size; + int out_size; AVFrame frame = { .nb_samples = pv->samples_per_frame, }; - out_size = av_samples_get_buffer_size(&out_linesize, + out_size = av_samples_get_buffer_size(NULL, pv->context->channels, pv->samples_per_frame, pv->context->sample_fmt, 1); avcodec_fill_audio_frame(&frame, pv->context->channels, pv->context->sample_fmt, pv->output_buf, out_size, 1); - if (pv->avresample != NULL) + if (pv->swresample != NULL) { - int in_linesize, out_samples; + int out_samples; - av_samples_get_buffer_size(&in_linesize, pv->context->channels, - frame.nb_samples, AV_SAMPLE_FMT_FLT, 1); - out_samples = avresample_convert(pv->avresample, - frame.extended_data, out_linesize, - frame.nb_samples, &pv->input_buf, - in_linesize, frame.nb_samples); + out_samples = swr_convert(pv->swresample, + frame.extended_data, frame.nb_samples, + (const uint8_t **)&pv->input_buf, frame.nb_samples); if (out_samples != pv->samples_per_frame) { // we're not doing sample rate conversion, // so this shouldn't happen - hb_log("encavcodecaWork: avresample_convert() failed"); + hb_log("encavcodecaWork: swr_convert() failed"); continue; } } --- HandBrake-1.1.2.orig/libhb/hb.c 2018-09-04 14:35:01.000000000 -0500 +++ HandBrake-1.1.2/libhb/hb.c 2018-11-07 16:45:12.564522006 -0500 @@ -102,14 +102,6 @@ av_lockmgr_register(ff_lockmgr_cb); av_register_all(); avfilter_register_all(); -#ifdef _WIN64 - // avresample's assembly optimizations can cause crashes under Win x86_64 - // (see http://bugzilla.libav.org/show_bug.cgi?id=496) - // disable AVX and FMA4 as a workaround - hb_deep_log(2, "hb_avcodec_init: Windows x86_64, disabling AVX and FMA4"); - int cpu_flags = av_get_cpu_flags() & ~AV_CPU_FLAG_AVX & ~AV_CPU_FLAG_FMA4; - av_set_cpu_flags_mask(cpu_flags); -#endif } int hb_avcodec_open(AVCodecContext *avctx, AVCodec *codec, @@ -140,11 +132,9 @@ return ret; } -int hb_avcodec_close(AVCodecContext *avctx) +void hb_avcodec_free_context(AVCodecContext **avctx) { - int ret; - ret = avcodec_close(avctx); - return ret; + avcodec_free_context(avctx); } --- HandBrake-1.1.2.orig/libhb/hbffmpeg.h 2018-09-04 14:35:01.000000000 -0500 +++ HandBrake-1.1.2/libhb/hbffmpeg.h 2018-11-07 16:47:00.726314186 -0500 @@ -17,14 +17,14 @@ #include "libavutil/downmix_info.h" #include "libavutil/display.h" #include "libswscale/swscale.h" -#include "libavresample/avresample.h" +#include "libswresample/swresample.h" #include "common.h" #define HB_FFMPEG_THREADS_AUTO (-1) // let hb_avcodec_open() decide thread_count void hb_avcodec_init(void); int hb_avcodec_open(AVCodecContext *, AVCodec *, AVDictionary **, int); -int hb_avcodec_close(AVCodecContext *); +void hb_avcodec_free_context(AVCodecContext **avctx); const char* const* hb_av_preset_get_names(int encoder); uint64_t hb_ff_mixdown_xlat(int hb_mixdown, int *downmix_mode); --- HandBrake-1.1.2.orig/libhb/module.defs 2018-09-04 14:35:01.000000000 -0500 +++ HandBrake-1.1.2/libhb/module.defs 2018-11-07 16:51:42.516948168 -0500 @@ -130,7 +130,7 @@ LIBHB.lib = $(LIBHB.build/)hb.lib LIBHB.dll.libs = $(foreach n, \ - ass avcodec avformat avfilter avutil avresample dvdnav dvdread \ + ass avformat avfilter avcodec avutil swresample postproc dvdnav dvdread \ freetype mp3lame samplerate swscale vpx theora vorbis vorbisenc ogg \ x264 xml2 bluray jansson harfbuzz opus, \ $(CONTRIB.build/)lib/lib$(n).a ) @@ -186,7 +186,7 @@ endif LIBHB.GCC.args.extra.dylib++ += -Wl,--out-implib,$(LIBHB.lib) -LIBHB.GCC.l += ws2_32 uuid ole32 +LIBHB.GCC.l += bcrypt ws2_32 uuid ole32 ifeq ($(HAS.dlfcn),1) LIBHB.GCC.l += dl endif --- HandBrake-1.1.2.orig/libhb/muxavformat.c 2018-09-04 14:35:01.000000000 -0500 +++ HandBrake-1.1.2/libhb/muxavformat.c 2018-11-07 16:54:05.220517000 -0500 @@ -800,7 +800,7 @@ } else { - track->st->codecpar->codec_id = AV_CODEC_ID_SSA; + track->st->codecpar->codec_id = AV_CODEC_ID_ASS; need_fonts = 1; if (subtitle->extradata_size) @@ -1197,10 +1197,12 @@ { pkt.flags |= AV_PKT_FLAG_KEY; } +#ifdef AV_PKT_FLAG_DISPOSABLE if (!(buf->s.flags & HB_FLAG_FRAMETYPE_REF)) { pkt.flags |= AV_PKT_FLAG_DISPOSABLE; } +#endif } else if (buf->s.frametype & HB_FRAME_MASK_KEY) { @@ -1313,7 +1315,7 @@ free(styleatom); } } - if (track->st->codecpar->codec_id == AV_CODEC_ID_SSA && + if (track->st->codecpar->codec_id == AV_CODEC_ID_ASS && job->mux == HB_MUX_AV_MKV) { // avformat requires the this additional information --- HandBrake-1.1.2.orig/libhb/stream.c 2018-09-04 14:35:01.000000000 -0500 +++ HandBrake-1.1.2/libhb/stream.c 2018-11-07 16:56:19.404469782 -0500 @@ -5315,7 +5315,7 @@ "subtitle colors likely to be wrong" ); break; case AV_CODEC_ID_TEXT: - case AV_CODEC_ID_SRT: + case AV_CODEC_ID_SUBRIP: subtitle->format = TEXTSUB; subtitle->source = UTF8SUB; subtitle->config.dest = PASSTHRUSUB; @@ -5327,7 +5327,7 @@ subtitle->config.dest = PASSTHRUSUB; subtitle->codec = WORK_DECTX3GSUB; break; - case AV_CODEC_ID_SSA: + case AV_CODEC_ID_ASS: subtitle->format = TEXTSUB; subtitle->source = SSASUB; subtitle->config.dest = PASSTHRUSUB; @@ -5852,7 +5852,7 @@ * either field. This is not a problem because the VOB decoder can extract this * information from the packet payload itself. * - * SSA subtitles (AV_CODEC_ID_SSA) do not have their duration stored in + * SSA subtitles (AV_CODEC_ID_ASS) do not have their duration stored in * either field. This is not a problem because the SSA decoder can extract this * information from the packet payload itself. */ @@ -5888,7 +5888,7 @@ break; } if ( ffmpeg_pkt_codec == AV_CODEC_ID_TEXT || - ffmpeg_pkt_codec == AV_CODEC_ID_SRT || + ffmpeg_pkt_codec == AV_CODEC_ID_SUBRIP || ffmpeg_pkt_codec == AV_CODEC_ID_MOV_TEXT ) { int64_t ffmpeg_pkt_duration = stream->ffmpeg_pkt.duration; int64_t buf_duration = av_to_hb_pts( ffmpeg_pkt_duration, tsconv, 0 ); --- HandBrake-1.1.2.orig/macosx/HandBrake.xcodeproj/project.pbxproj 2018-09-04 14:35:01.000000000 -0500 +++ HandBrake-1.1.2/macosx/HandBrake.xcodeproj/project.pbxproj 2018-11-07 18:29:58.654562496 -0500 @@ -7,11 +7,14 @@ objects = { /* Begin PBXBuildFile section */ + 1C0695AC20BD193D001543DA /* libpostproc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C0695AA20BD193D001543DA /* libpostproc.a */; }; + 1C0695AD20BD193D001543DA /* libpostproc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C0695AA20BD193D001543DA /* libpostproc.a */; }; + 1C0695AE20BD193D001543DA /* libswresample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C0695AB20BD193D001543DA /* libswresample.a */; }; + 1C0695AF20BD193D001543DA /* libswresample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C0695AB20BD193D001543DA /* libswresample.a */; }; 1C6D76551CD7733300F5B943 /* libharfbuzz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C15C82B1CD7722500368223 /* libharfbuzz.a */; }; 1C6D76561CD7733400F5B943 /* libharfbuzz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C15C82B1CD7722500368223 /* libharfbuzz.a */; }; 1C7776A2202300DD001C31EB /* HBRenamePresetController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C7776A0202300DC001C31EB /* HBRenamePresetController.m */; }; 1C7776A5202301D5001C31EB /* HBRenamePresetController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1C7776A3202301D5001C31EB /* HBRenamePresetController.xib */; }; - 226268E11572CC7300477B4E /* libavresample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226268DF1572CC7300477B4E /* libavresample.a */; }; 22DD2C4B177B95DA00EF50D3 /* libvpx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22DD2C49177B94DB00EF50D3 /* libvpx.a */; }; 273F202314ADB8650021BE6D /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 273F202214ADB8650021BE6D /* IOKit.framework */; }; 273F202614ADB8A40021BE6D /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 273F202514ADB8A40021BE6D /* libz.dylib */; }; @@ -124,7 +127,6 @@ A91CE2B41C7DABBC0068F46F /* libavcodec.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D6C72914B102DA00B785E4 /* libavcodec.a */; }; A91CE2B51C7DABBC0068F46F /* libavfilter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A9E165511C523016003EF30E /* libavfilter.a */; }; A91CE2B61C7DABBC0068F46F /* libavformat.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D6C72A14B102DA00B785E4 /* libavformat.a */; }; - A91CE2B71C7DABBC0068F46F /* libavresample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226268DF1572CC7300477B4E /* libavresample.a */; }; A91CE2B81C7DABBC0068F46F /* libavutil.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D6C72B14B102DA00B785E4 /* libavutil.a */; }; A91CE2B91C7DABBC0068F46F /* libbluray.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D6C72C14B102DA00B785E4 /* libbluray.a */; }; A91CE2BA1C7DABBC0068F46F /* libdvdnav.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D6C72E14B102DA00B785E4 /* libdvdnav.a */; }; @@ -317,11 +319,12 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 1C0695AA20BD193D001543DA /* libpostproc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libpostproc.a; path = "external/contrib/lib/libpostproc.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 1C0695AB20BD193D001543DA /* libswresample.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libswresample.a; path = "external/contrib/lib/libswresample.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 1C15C82B1CD7722500368223 /* libharfbuzz.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libharfbuzz.a; path = external/contrib/lib/libharfbuzz.a; sourceTree = BUILT_PRODUCTS_DIR; }; 1C7776A0202300DC001C31EB /* HBRenamePresetController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HBRenamePresetController.m; sourceTree = ""; }; 1C7776A1202300DC001C31EB /* HBRenamePresetController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HBRenamePresetController.h; sourceTree = ""; }; 1C7776A4202301D5001C31EB /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/HBRenamePresetController.xib; sourceTree = ""; }; - 226268DF1572CC7300477B4E /* libavresample.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libavresample.a; path = external/contrib/lib/libavresample.a; sourceTree = BUILT_PRODUCTS_DIR; }; 22CC9E74191EBEA500C69D81 /* libx265.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libx265.a; path = external/contrib/lib/libx265.a; sourceTree = BUILT_PRODUCTS_DIR; }; 22DD2C49177B94DB00EF50D3 /* libvpx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvpx.a; path = external/contrib/lib/libvpx.a; sourceTree = BUILT_PRODUCTS_DIR; }; 271BA4C014B119F800BC1D2C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; name = Info.plist; path = external/macosx/Info.plist; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -630,7 +633,6 @@ 27D6C74414B102DA00B785E4 /* libass.a in Frameworks */, 27D6C74614B102DA00B785E4 /* libavcodec.a in Frameworks */, 27D6C74814B102DA00B785E4 /* libavformat.a in Frameworks */, - 226268E11572CC7300477B4E /* libavresample.a in Frameworks */, 27D6C74A14B102DA00B785E4 /* libavutil.a in Frameworks */, 27D6C74C14B102DA00B785E4 /* libbluray.a in Frameworks */, 27D6C75014B102DA00B785E4 /* libdvdnav.a in Frameworks */, @@ -638,11 +640,13 @@ 27D6C75814B102DA00B785E4 /* libfreetype.a in Frameworks */, 27D6C75A14B102DA00B785E4 /* libfribidi.a in Frameworks */, 27D6C75F14B102DA00B785E4 /* libmp3lame.a in Frameworks */, + 1C0695AC20BD193D001543DA /* libpostproc.a in Frameworks */, 27D6C76514B102DA00B785E4 /* libogg.a in Frameworks */, 27D6C76714B102DA00B785E4 /* libsamplerate.a in Frameworks */, 27D6C76914B102DA00B785E4 /* libswscale.a in Frameworks */, 27D6C76B14B102DA00B785E4 /* libtheora.a in Frameworks */, 27D6C76D14B102DA00B785E4 /* libvorbis.a in Frameworks */, + 1C0695AE20BD193D001543DA /* libswresample.a in Frameworks */, 27D6C76F14B102DA00B785E4 /* libvorbisenc.a in Frameworks */, 6F0D69A91AD0683100A39DCA /* Foundation.framework in Frameworks */, 22DD2C4B177B95DA00EF50D3 /* libvpx.a in Frameworks */, @@ -678,6 +682,7 @@ A91CE2B21C7DAB550068F46F /* AudioToolbox.framework in Frameworks */, A91CE2D41C7DABE40068F46F /* libiconv.tbd in Frameworks */, A91CE2D21C7DABDA0068F46F /* libz.tbd in Frameworks */, + 1C0695AF20BD193D001543DA /* libswresample.a in Frameworks */, A91CE2D01C7DABCE0068F46F /* libbz2.tbd in Frameworks */, A900E6BD1D7B1B5A00CB6C0A /* libopus.a in Frameworks */, A91CE2CE1C7DABBC0068F46F /* libvorbisfile.a in Frameworks */, @@ -685,7 +690,6 @@ A91CE2B41C7DABBC0068F46F /* libavcodec.a in Frameworks */, A91CE2B51C7DABBC0068F46F /* libavfilter.a in Frameworks */, A91CE2B61C7DABBC0068F46F /* libavformat.a in Frameworks */, - A91CE2B71C7DABBC0068F46F /* libavresample.a in Frameworks */, A91CE2B81C7DABBC0068F46F /* libavutil.a in Frameworks */, A91CE2B91C7DABBC0068F46F /* libbluray.a in Frameworks */, A91CE2BA1C7DABBC0068F46F /* libdvdnav.a in Frameworks */, @@ -697,6 +701,7 @@ A91CE2C01C7DABBC0068F46F /* libmp3lame.a in Frameworks */, A91CE2C11C7DABBC0068F46F /* libogg.a in Frameworks */, A91CE2C21C7DABBC0068F46F /* libsamplerate.a in Frameworks */, + 1C0695AD20BD193D001543DA /* libpostproc.a in Frameworks */, A91CE2C31C7DABBC0068F46F /* libswscale.a in Frameworks */, A91CE2C41C7DABBC0068F46F /* libtheora.a in Frameworks */, A91CE2C51C7DABBC0068F46F /* libvorbis.a in Frameworks */, @@ -723,11 +728,12 @@ 271BA4C714B1236D00BC1D2C /* Static Libraries */ = { isa = PBXGroup; children = ( + 1C0695AA20BD193D001543DA /* libpostproc.a */, + 1C0695AB20BD193D001543DA /* libswresample.a */, 27D6C72414B1019100B785E4 /* libhandbrake.a */, 27D6C72814B102DA00B785E4 /* libass.a */, 27D6C72914B102DA00B785E4 /* libavcodec.a */, 27D6C72A14B102DA00B785E4 /* libavformat.a */, - 226268DF1572CC7300477B4E /* libavresample.a */, 27D6C72B14B102DA00B785E4 /* libavutil.a */, 27D6C72C14B102DA00B785E4 /* libbluray.a */, 27D6C72E14B102DA00B785E4 /* libdvdnav.a */, --- HandBrake-1.1.2.orig/test/module.defs 2018-09-04 14:35:01.000000000 -0500 +++ HandBrake-1.1.2/test/module.defs 2018-11-07 17:03:22.815388083 -0500 @@ -14,7 +14,7 @@ TEST.libs = $(LIBHB.a) TEST.GCC.l = \ - ass avresample avformat avcodec avfilter avutil mp3lame dvdnav \ + ass avformat avfilter avcodec avutil swresample postproc mp3lame dvdnav \ dvdread fribidi \ samplerate swscale vpx theoraenc theoradec vorbis vorbisenc ogg x264 \ bluray freetype xml2 bz2 z jansson harfbuzz opus @@ -89,7 +89,7 @@ else TEST.GCC.l += pthreadGC2 endif - TEST.GCC.l += iconv ws2_32 regex uuid ole32 + TEST.GCC.l += bcrypt iconv ws2_32 regex uuid ole32 TEST.GCC.D += PTW32_STATIC_LIB TEST.GCC.args.extra.exe++ += -static endif # (1-mingw,$(BUILD.cross)-$(BUILD.system)) --- HandBrake-1.1.2.orig/libhb/audio_resample.c 2018-09-04 14:35:01.000000000 -0500 +++ HandBrake-1.1.2/libhb/audio_resample.c 2018-11-07 17:49:17.441246400 -0500 @@ -21,8 +21,8 @@ goto fail; } - // avresample context, initialized in hb_audio_resample_update() - resample->avresample = NULL; + // swresample context, initialized in hb_audio_resample_update() + resample->swresample = NULL; // we don't support planar output yet if (av_sample_fmt_is_planar(sample_fmt)) @@ -55,8 +55,15 @@ resample->out.channels = av_get_channel_layout_nb_channels(channel_layout); resample->out.channel_layout = channel_layout; resample->out.matrix_encoding = matrix_encoding; - resample->out.normalize_mix_level = normalize_mix; resample->out.sample_fmt = sample_fmt; + if (normalize_mix) + { + resample->out.maxval = 1.0; + } + else + { + resample->out.maxval = 1000; + } resample->out.sample_size = av_get_bytes_per_sample(sample_fmt); // set default input characteristics @@ -105,7 +112,7 @@ // Dolby Surround is Stereo when it comes to remixing channel_layout = AV_CH_LAYOUT_STEREO; } - // avresample can't remap a single-channel layout to + // swresample can't remap a single-channel layout to // another single-channel layout if (resample->out.channel_layout == AV_CH_LAYOUT_MONO && is_mono(channel_layout)) @@ -161,50 +168,46 @@ resample->resample.surround_mix_level != resample->in.surround_mix_level)); if (resample_changed || (resample->resample_needed && - resample->avresample == NULL)) + resample->swresample == NULL)) { - if (resample->avresample == NULL) + if (resample->swresample == NULL) { - resample->avresample = avresample_alloc_context(); - if (resample->avresample == NULL) + resample->swresample = swr_alloc(); + if (resample->swresample == NULL) { - hb_error("hb_audio_resample_update: avresample_alloc_context() failed"); + hb_error("hb_audio_resample_update: swr_alloc() failed"); return 1; } - av_opt_set_int(resample->avresample, "out_sample_fmt", + av_opt_set_int(resample->swresample, "out_sample_fmt", resample->out.sample_fmt, 0); - av_opt_set_int(resample->avresample, "out_channel_layout", + av_opt_set_int(resample->swresample, "out_channel_layout", resample->out.channel_layout, 0); - av_opt_set_int(resample->avresample, "matrix_encoding", + av_opt_set_int(resample->swresample, "matrix_encoding", resample->out.matrix_encoding, 0); - av_opt_set_int(resample->avresample, "normalize_mix_level", - resample->out.normalize_mix_level, 0); - } - else if (resample_changed) - { - avresample_close(resample->avresample); + av_opt_set_double(resample->swresample, "rematrix_maxval", + resample->out.maxval, 0); } - av_opt_set_int(resample->avresample, "in_sample_fmt", + av_opt_set_int(resample->swresample, "in_sample_fmt", resample->in.sample_fmt, 0); - av_opt_set_int(resample->avresample, "in_channel_layout", + av_opt_set_int(resample->swresample, "in_channel_layout", resample->in.channel_layout, 0); - av_opt_set_double(resample->avresample, "lfe_mix_level", + av_opt_set_double(resample->swresample, "lfe_mix_level", resample->in.lfe_mix_level, 0); - av_opt_set_double(resample->avresample, "center_mix_level", + av_opt_set_double(resample->swresample, "center_mix_level", resample->in.center_mix_level, 0); - av_opt_set_double(resample->avresample, "surround_mix_level", + av_opt_set_double(resample->swresample, "surround_mix_level", resample->in.surround_mix_level, 0); - if ((ret = avresample_open(resample->avresample))) + if ((ret = swr_init(resample->swresample))) { char err_desc[64]; av_strerror(ret, err_desc, 63); - hb_error("hb_audio_resample_update: avresample_open() failed (%s)", + hb_error("hb_audio_resample_update: swr_init() failed (%s)", err_desc); - // avresample won't open, start over - avresample_free(&resample->avresample); + // swresample won't open, start over + swr_free(&resample->swresample); return ret; } @@ -224,25 +227,25 @@ { if (resample != NULL) { - if (resample->avresample != NULL) + if (resample->swresample != NULL) { - avresample_free(&resample->avresample); + swr_free(&resample->swresample); } free(resample); } } hb_buffer_t* hb_audio_resample(hb_audio_resample_t *resample, - uint8_t **samples, int nsamples) + const uint8_t **samples, int nsamples) { if (resample == NULL) { hb_error("hb_audio_resample: resample is NULL"); return NULL; } - if (resample->resample_needed && resample->avresample == NULL) + if (resample->resample_needed && resample->swresample == NULL) { - hb_error("hb_audio_resample: resample needed but libavresample context " + hb_error("hb_audio_resample: resample needed but libswresample context " "is NULL"); return NULL; } @@ -252,24 +255,18 @@ if (resample->resample_needed) { - int in_linesize, out_linesize; - // set in/out linesize and out_size - av_samples_get_buffer_size(&in_linesize, - resample->resample.channels, nsamples, - resample->resample.sample_fmt, 0); - out_size = av_samples_get_buffer_size(&out_linesize, + out_size = av_samples_get_buffer_size(NULL, resample->out.channels, nsamples, resample->out.sample_fmt, 0); out = hb_buffer_init(out_size); - out_samples = avresample_convert(resample->avresample, - &out->data, out_linesize, nsamples, - samples, in_linesize, nsamples); + out_samples = swr_convert(resample->swresample, &out->data, nsamples, + samples, nsamples); if (out_samples <= 0) { if (out_samples < 0) - hb_log("hb_audio_resample: avresample_convert() failed"); + hb_log("hb_audio_resample: swr_convert() failed"); // don't send empty buffers downstream (EOF) hb_buffer_close(&out); return NULL; --- HandBrake-1.1.2.orig/libhb/audio_resample.h 2018-09-04 14:35:01.000000000 -0500 +++ HandBrake-1.1.2/libhb/audio_resample.h 2018-11-07 18:01:39.397808925 -0500 @@ -7,11 +7,11 @@ * For full terms see the file COPYING file or visit http://www.gnu.org/licenses/gpl-2.0.html */ -/* Implements a libavresample wrapper for convenience. +/* Implements a libswresample wrapper for convenience. * * Supports sample_fmt and channel_layout conversion. * - * sample_rate conversion will come later (libavresample doesn't support + * sample_rate conversion will come later (libswresample doesn't support * sample_rate conversion with float samples yet). */ #ifndef AUDIO_RESAMPLE_H @@ -20,7 +20,7 @@ #include #include #include "libavutil/channel_layout.h" -#include "libavresample/avresample.h" +#include "libswresample/swresample.h" /* Default mix level for center and surround channels */ #define HB_MIXLEV_DEFAULT ((double)M_SQRT1_2) @@ -33,7 +33,7 @@ int dual_mono_right_only; int resample_needed; - AVAudioResampleContext *avresample; + SwrContext *swresample; struct { @@ -58,10 +58,10 @@ { int channels; int sample_size; - int normalize_mix_level; uint64_t channel_layout; enum AVSampleFormat sample_fmt; enum AVMatrixEncoding matrix_encoding; + double maxval; } out; } hb_audio_resample_t; @@ -108,6 +108,6 @@ * resampling is only done when necessary. */ hb_buffer_t* hb_audio_resample(hb_audio_resample_t *resample, - uint8_t **samples, int nsamples); + const uint8_t **samples, int nsamples); #endif /* AUDIO_RESAMPLE_H */ --- HandBrake-1.1.2.orig/libhb/common.c 2018-09-04 14:35:01.000000000 -0500 +++ HandBrake-1.1.2/libhb/common.c 2018-11-07 18:06:08.535679790 -0500 @@ -177,12 +177,12 @@ hb_dither_t *hb_audio_dithers_last_item = NULL; hb_dither_internal_t hb_audio_dithers[] = { - { { "default", "auto", AV_RESAMPLE_DITHER_NONE - 1, }, NULL, 1, }, - { { "none", "none", AV_RESAMPLE_DITHER_NONE, }, NULL, 1, }, - { { "rectangular", "rectangular", AV_RESAMPLE_DITHER_RECTANGULAR, }, NULL, 1, }, - { { "triangular", "triangular", AV_RESAMPLE_DITHER_TRIANGULAR, }, NULL, 1, }, - { { "triangular with high pass", "triangular_hp", AV_RESAMPLE_DITHER_TRIANGULAR_HP, }, NULL, 1, }, - { { "triangular with noise shaping", "triangular_ns", AV_RESAMPLE_DITHER_TRIANGULAR_NS, }, NULL, 1, }, + { { "default", "auto", SWR_DITHER_NONE - 1, }, NULL, 1, }, + { { "none", "none", SWR_DITHER_NONE, }, NULL, 1, }, + { { "rectangular", "rectangular", SWR_DITHER_RECTANGULAR, }, NULL, 1, }, + { { "triangular", "triangular", SWR_DITHER_TRIANGULAR, }, NULL, 1, }, + { { "triangular with high pass", "triangular_hp", SWR_DITHER_TRIANGULAR_HIGHPASS, }, NULL, 1, }, + { { "lipshitz noise shaping", "lipshitz_ns", SWR_DITHER_NS_LIPSHITZ, }, NULL, 1, }, }; int hb_audio_dithers_count = sizeof(hb_audio_dithers) / sizeof(hb_audio_dithers[0]); @@ -1675,22 +1675,13 @@ * input could be s16 (possibly already dithered) converted to flt, so * let's use a "low-risk" dither algorithm (standard triangular). */ - return AV_RESAMPLE_DITHER_TRIANGULAR; + return SWR_DITHER_TRIANGULAR; } int hb_audio_dither_is_supported(uint32_t codec) { - // encoder's input sample format must be s16(p) - switch (codec) - { - case HB_ACODEC_FFFLAC: - case HB_ACODEC_FDK_AAC: - case HB_ACODEC_FDK_HAAC: - return 1; - - default: - return 0; - } + // Since dithering is performed by swresample, all codecs are supported + return 1; } int hb_audio_dither_get_from_name(const char *name) @@ -1857,7 +1848,7 @@ // regular stereo (not Dolby) case HB_AMIXDOWN_LEFT: case HB_AMIXDOWN_RIGHT: - return (layout == AV_CH_LAYOUT_STEREO); + return (layout & AV_CH_LAYOUT_STEREO); // mono remix always supported // HB_AMIXDOWN_NONE always supported (for Passthru) --- HandBrake-1.1.2.orig/libhb/declpcm.c 2018-09-04 14:35:01.000000000 -0500 +++ HandBrake-1.1.2/libhb/declpcm.c 2018-11-07 18:10:28.433967052 -0500 @@ -338,7 +338,8 @@ hb_log("declpcm: hb_audio_resample_update() failed"); return NULL; } - out = hb_audio_resample(pv->resample, &pv->data, pv->nsamples); + out = hb_audio_resample(pv->resample, (const uint8_t **)&pv->data, + pv->nsamples); if (out != NULL) {