From d4bf359633c49fb567de1156e11bc283b9713c2f Mon Sep 17 00:00:00 2001 From: Leigh Scott Date: Mon, 15 Nov 2021 11:12:14 +0000 Subject: [PATCH] Apply upstream ffmpeg fix to f36+ --- ffmpeg45.patch | 354 ++++++++++++++++++++++++++++++++++++++++++------- vlc.spec | 4 +- 2 files changed, 311 insertions(+), 47 deletions(-) diff --git a/ffmpeg45.patch b/ffmpeg45.patch index 8d76211..df4c3c8 100644 --- a/ffmpeg45.patch +++ b/ffmpeg45.patch @@ -1,65 +1,327 @@ -From 21d5a1933275edb7f67d05ea62a762464e07c2cb Mon Sep 17 00:00:00 2001 -From: Alexandre Janniaux -Date: Wed, 8 Apr 2020 15:07:15 +0200 -Subject: [PATCH] avcodec: remove deprecation warning for av*_register_all +From cde283fef6dc1f70fd46fe891642f3e07edbc433 Mon Sep 17 00:00:00 2001 +From: Ilkka Ollakka +Date: Wed, 7 Jul 2021 12:37:58 +0000 +Subject: [PATCH 1/2] avcodec: remove use of av_init_packet as it is deprecated + in new ffmpeg major version +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit -From doc/APIchanges: +av_init_packet is deprecated in new major version of ffmpeg. - 2018-02-06 - 0694d87024 - lavf 58.9.100 - avformat.h - Deprecate use of av_register_input_format(), av_register_output_format(), - av_register_all(), av_iformat_next(), av_oformat_next(). - Add av_demuxer_iterate(), and av_muxer_iterate(). +Also use av_packet_free instead of unref. - 2018-02-06 - 36c85d6e77 - lavc 58.10.100 - avcodec.h - Deprecate use of avcodec_register(), avcodec_register_all(), - av_codec_next(), av_register_codec_parser(), and av_parser_next(). - Add av_codec_iterate() and av_parser_iterate(). +Use av_packet_clone and AVPacket * in vlc_av_packet_t. -They are no-op since those updates. If compiling with a recent release, -just don't call av*_register_all to prevent warnings. +(cherry picked from commit 16fd46fa506424134beb53ec88be3eea1b42a221) +Signed-off-by: Hugo Beauzée-Luyssen --- - modules/codec/avcodec/avcommon.h | 6 ++++++ - 1 file changed, 6 insertions(+) + modules/codec/avcodec/audio.c | 12 +++++++----- + modules/codec/avcodec/encoder.c | 25 ++++++++++++++----------- + modules/codec/avcodec/subtitle.c | 17 +++++++++++------ + modules/codec/avcodec/video.c | 30 +++++++++++++++++------------- + modules/demux/avformat/mux.c | 29 +++++++++++++++++------------ + 5 files changed, 66 insertions(+), 47 deletions(-) -diff --git a/modules/codec/avcodec/avcommon.h b/modules/codec/avcodec/avcommon.h -index 671cde5c81..fa06616433 100644 ---- a/modules/codec/avcodec/avcommon.h -+++ b/modules/codec/avcodec/avcommon.h -@@ -109,6 +109,7 @@ static inline void vlc_init_avutil(vlc_object_t *obj) - - #ifdef HAVE_LIBAVFORMAT_AVFORMAT_H - # include -+# include - static inline void vlc_init_avformat(vlc_object_t *obj) +diff --git a/modules/codec/avcodec/audio.c b/modules/codec/avcodec/audio.c +index eec255ae0b..8c3fa7a217 100644 +--- a/modules/codec/avcodec/audio.c ++++ b/modules/codec/avcodec/audio.c +@@ -363,11 +363,13 @@ static int DecodeBlock( decoder_t *p_dec, block_t **pp_block ) + /* Feed in the loop as buffer could have been full on first iterations */ + if( p_block ) + { +- AVPacket pkt; +- av_init_packet( &pkt ); +- pkt.data = p_block->p_buffer; +- pkt.size = p_block->i_buffer; +- ret = avcodec_send_packet( ctx, &pkt ); ++ AVPacket *pkt = av_packet_alloc(); ++ if( !pkt ) ++ goto end; ++ pkt->data = p_block->p_buffer; ++ pkt->size = p_block->i_buffer; ++ ret = avcodec_send_packet( ctx, pkt ); ++ av_packet_free(&pkt); + if( ret == 0 ) /* Block has been consumed */ + { + /* Only set new pts from input block if it has been used, +diff --git a/modules/codec/avcodec/encoder.c b/modules/codec/avcodec/encoder.c +index b083d171f3..27af11a412 100644 +--- a/modules/codec/avcodec/encoder.c ++++ b/modules/codec/avcodec/encoder.c +@@ -1061,14 +1061,14 @@ error: + typedef struct { - vlc_avcodec_lock(); -@@ -117,7 +118,9 @@ static inline void vlc_init_avformat(vlc_object_t *obj) + block_t self; +- AVPacket packet; ++ AVPacket *packet; + } vlc_av_packet_t; - avformat_network_init(); - -+#if (LIBAVFORMAT_VERSION_MICRO < 100) || (LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(58, 9, 100)) - av_register_all(); -+#endif + static void vlc_av_packet_Release(block_t *block) + { + vlc_av_packet_t *b = (void *) block; - vlc_avcodec_unlock(); +- av_packet_unref(&b->packet); ++ av_packet_free( &b->packet ); + free(b); } -@@ -125,13 +128,16 @@ static inline void vlc_init_avformat(vlc_object_t *obj) - #ifdef HAVE_LIBAVCODEC_AVCODEC_H - # include -+# include - static inline void vlc_init_avcodec(vlc_object_t *obj) +@@ -1089,7 +1089,7 @@ static block_t *vlc_av_packet_Wrap(AVPacket *packet, mtime_t i_length, AVCodecCo + block_Init( p_block, packet->data, packet->size ); + p_block->i_nb_samples = 0; + p_block->pf_release = vlc_av_packet_Release; +- b->packet = *packet; ++ b->packet = packet; + + p_block->i_length = i_length; + p_block->i_pts = packet->pts; +@@ -1138,11 +1138,13 @@ static void check_hurry_up( encoder_sys_t *p_sys, AVFrame *frame, encoder_t *p_e + + static block_t *encode_avframe( encoder_t *p_enc, encoder_sys_t *p_sys, AVFrame *frame ) { - vlc_avcodec_lock(); +- AVPacket av_pkt; +- av_pkt.data = NULL; +- av_pkt.size = 0; ++ AVPacket *av_pkt = av_packet_alloc(); + +- av_init_packet( &av_pkt ); ++ if( !av_pkt ) ++ { ++ av_frame_unref( frame ); ++ return NULL; ++ } + + int ret = avcodec_send_frame( p_sys->p_context, frame ); + if( frame && ret != 0 && ret != AVERROR(EAGAIN) ) +@@ -1150,18 +1152,19 @@ static block_t *encode_avframe( encoder_t *p_enc, encoder_sys_t *p_sys, AVFrame + msg_Warn( p_enc, "cannot send one frame to encoder %d", ret ); + return NULL; + } +- ret = avcodec_receive_packet( p_sys->p_context, &av_pkt ); ++ ret = avcodec_receive_packet( p_sys->p_context, av_pkt ); + if( ret != 0 && ret != AVERROR(EAGAIN) ) + { + msg_Warn( p_enc, "cannot encode one frame" ); ++ av_packet_free( &av_pkt ); + return NULL; + } + +- block_t *p_block = vlc_av_packet_Wrap( &av_pkt, +- av_pkt.duration / p_sys->p_context->time_base.den, p_sys->p_context ); ++ block_t *p_block = vlc_av_packet_Wrap( av_pkt, ++ av_pkt->duration / p_sys->p_context->time_base.den, p_sys->p_context ); + if( unlikely(p_block == NULL) ) + { +- av_packet_unref( &av_pkt ); ++ av_packet_free( &av_pkt ); + return NULL; + } + return p_block; +diff --git a/modules/codec/avcodec/subtitle.c b/modules/codec/avcodec/subtitle.c +index 5cac6339d6..a17ba985e1 100644 +--- a/modules/codec/avcodec/subtitle.c ++++ b/modules/codec/avcodec/subtitle.c +@@ -186,16 +186,21 @@ static subpicture_t *DecodeBlock(decoder_t *dec, block_t **block_ptr) + AVSubtitle subtitle; + memset(&subtitle, 0, sizeof(subtitle)); + +- AVPacket pkt; +- av_init_packet(&pkt); +- pkt.data = block->p_buffer; +- pkt.size = block->i_buffer; +- pkt.pts = block->i_pts; ++ AVPacket *pkt = av_packet_alloc(); ++ if(!pkt) ++ { ++ block_Release(block); ++ return NULL; ++ } ++ pkt->data = block->p_buffer; ++ pkt->size = block->i_buffer; ++ pkt->pts = block->i_pts; + + int has_subtitle = 0; + int used = avcodec_decode_subtitle2(sys->p_context, +- &subtitle, &has_subtitle, &pkt); ++ &subtitle, &has_subtitle, pkt); + ++ av_packet_free(&pkt); + if (used < 0) { + msg_Warn(dec, "cannot decode one subtitle (%zu bytes)", + block->i_buffer); +diff --git a/modules/codec/avcodec/video.c b/modules/codec/avcodec/video.c +index b99eb56e4a..e175cef3a6 100644 +--- a/modules/codec/avcodec/video.c ++++ b/modules/codec/avcodec/video.c +@@ -1015,14 +1015,18 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block, bool *error + + if( b_has_data || b_start_drain ) + { +- AVPacket pkt; +- av_init_packet( &pkt ); ++ AVPacket *pkt = av_packet_alloc(); ++ if(!pkt) ++ { ++ *error = true; ++ break; ++ } + if( b_has_data ) + { +- pkt.data = p_block->p_buffer; +- pkt.size = p_block->i_buffer; +- pkt.pts = p_block->i_pts > VLC_TS_INVALID ? p_block->i_pts : AV_NOPTS_VALUE; +- pkt.dts = p_block->i_dts > VLC_TS_INVALID ? p_block->i_dts : AV_NOPTS_VALUE; ++ pkt->data = p_block->p_buffer; ++ pkt->size = p_block->i_buffer; ++ pkt->pts = p_block->i_pts > VLC_TS_INVALID ? p_block->i_pts : AV_NOPTS_VALUE; ++ pkt->dts = p_block->i_dts > VLC_TS_INVALID ? p_block->i_dts : AV_NOPTS_VALUE; + + /* Make sure we don't reuse the same timestamps twice */ + p_block->i_pts = +@@ -1031,21 +1035,21 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block, bool *error + else /* start drain */ + { + /* Return delayed frames if codec has CODEC_CAP_DELAY */ +- pkt.data = NULL; +- pkt.size = 0; ++ pkt->data = NULL; ++ pkt->size = 0; + p_sys->b_draining = true; + } + + if( !p_sys->palette_sent ) + { +- uint8_t *pal = av_packet_new_side_data(&pkt, AV_PKT_DATA_PALETTE, AVPALETTE_SIZE); ++ uint8_t *pal = av_packet_new_side_data(pkt, AV_PKT_DATA_PALETTE, AVPALETTE_SIZE); + if (pal) { + memcpy(pal, p_dec->fmt_in.video.p_palette->palette, AVPALETTE_SIZE); + p_sys->palette_sent = true; + } + } + +- ret = avcodec_send_packet(p_context, &pkt); ++ ret = avcodec_send_packet(p_context, pkt); + if( ret != 0 && ret != AVERROR(EAGAIN) ) + { + if (ret == AVERROR(ENOMEM) || ret == AVERROR(EINVAL)) +@@ -1053,11 +1057,11 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block, bool *error + msg_Err(p_dec, "avcodec_send_packet critical error"); + *error = true; + } +- av_packet_unref( &pkt ); ++ av_packet_free( &pkt ); + break; + } +- i_used = ret != AVERROR(EAGAIN) ? pkt.size : 0; +- av_packet_unref( &pkt ); ++ i_used = ret != AVERROR(EAGAIN) ? pkt->size : 0; ++ av_packet_unref( pkt ); + } + + AVFrame *frame = av_frame_alloc(); +diff --git a/modules/demux/avformat/mux.c b/modules/demux/avformat/mux.c +index 48878c712b..405a6f6933 100644 +--- a/modules/demux/avformat/mux.c ++++ b/modules/demux/avformat/mux.c +@@ -341,14 +341,16 @@ static int MuxBlock( sout_mux_t *p_mux, sout_input_t *p_input ) + block_t *p_data = block_FifoGet( p_input->p_fifo ); + int i_stream = *((int *)p_input->p_sys); + AVStream *p_stream = p_sys->oc->streams[i_stream]; +- AVPacket pkt; +- +- memset( &pkt, 0, sizeof(AVPacket) ); ++ AVPacket *pkt = av_packet_alloc(); ++ if( !pkt ) ++ { ++ block_Release( p_data ); ++ return VLC_EGENERIC; ++ } - vlc_init_avutil(obj); +- av_init_packet(&pkt); +- pkt.data = p_data->p_buffer; +- pkt.size = p_data->i_buffer; +- pkt.stream_index = i_stream; ++ pkt->data = p_data->p_buffer; ++ pkt->size = p_data->i_buffer; ++ pkt->stream_index = i_stream; -+#if (LIBAVFORMAT_VERSION_MICRO < 100) || (LIBAVCODEC_VERSION_INT < AV_VERSION_INT(58, 10, 100)) - avcodec_register_all(); -+#endif + if( p_data->i_flags & BLOCK_FLAG_TYPE_I ) + { +@@ -359,29 +361,32 @@ static int MuxBlock( sout_mux_t *p_mux, sout_input_t *p_input ) + #endif - vlc_avcodec_unlock(); + p_sys->b_write_keyframe = true; +- pkt.flags |= AV_PKT_FLAG_KEY; ++ pkt->flags |= AV_PKT_FLAG_KEY; + } + + if( p_data->i_pts > 0 ) +- pkt.pts = p_data->i_pts * p_stream->time_base.den / ++ pkt->pts = p_data->i_pts * p_stream->time_base.den / + CLOCK_FREQ / p_stream->time_base.num; + if( p_data->i_dts > 0 ) +- pkt.dts = p_data->i_dts * p_stream->time_base.den / ++ pkt->dts = p_data->i_dts * p_stream->time_base.den / + CLOCK_FREQ / p_stream->time_base.num; + + /* this is another hack to prevent libavformat from triggering the "non monotone timestamps" check in avformat/utils.c */ + p_stream->cur_dts = ( p_data->i_dts * p_stream->time_base.den / + CLOCK_FREQ / p_stream->time_base.num ) - 1; + +- if( av_write_frame( p_sys->oc, &pkt ) < 0 ) ++ if( av_write_frame( p_sys->oc, pkt ) < 0 ) + { + msg_Err( p_mux, "could not write frame (pts: %"PRId64", dts: %"PRId64") " + "(pkt pts: %"PRId64", dts: %"PRId64")", +- p_data->i_pts, p_data->i_dts, pkt.pts, pkt.dts ); ++ p_data->i_pts, p_data->i_dts, pkt->pts, pkt->dts ); + block_Release( p_data ); ++ av_packet_unref( pkt ); + return VLC_EGENERIC; + } + ++ ++ av_packet_unref( pkt ); + block_Release( p_data ); + return VLC_SUCCESS; } -- GitLab + +From 149141346ddb419aa7c34fb59803c1db4035ced7 Mon Sep 17 00:00:00 2001 +From: Ilkka Ollakka +Date: Fri, 18 Jun 2021 10:23:35 +0300 +Subject: [PATCH 2/2] avcodec/subtitle: stop using removed setter for pkt + timebase +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Removed from ffmpeg repo in commit 23bb78d2ea4f0e3a0835744d59708efed50abccc. + +(cherry picked from commit e7190e7a70e9701754c50348f5b6357759440657) +Signed-off-by: Hugo Beauzée-Luyssen +--- + modules/codec/avcodec/subtitle.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/modules/codec/avcodec/subtitle.c b/modules/codec/avcodec/subtitle.c +index a17ba985e1..d3afe4270b 100644 +--- a/modules/codec/avcodec/subtitle.c ++++ b/modules/codec/avcodec/subtitle.c +@@ -90,7 +90,9 @@ int InitSubtitleDec(vlc_object_t *obj) + context->extradata_size = 0; + context->extradata = NULL; + +-#if LIBAVFORMAT_VERSION_MICRO >= 100 ++#if LIBAVFORMAT_VERSION_MAJOR >= 59 ++ context->pkt_timebase=AV_TIME_BASE_Q; ++#elif LIBAVFORMAT_VERSION_MICRO >= 100 + av_codec_set_pkt_timebase(context, AV_TIME_BASE_Q); + #endif + +-- +GitLab + diff --git a/vlc.spec b/vlc.spec index 10a7cfc..dbea93c 100644 --- a/vlc.spec +++ b/vlc.spec @@ -77,7 +77,7 @@ Patch10: recent_srt_fix.patch Patch11: 0001-Revert-configure-ignore-too-new-SRT.patch Patch12: 0001-Revert-access-libdvdread-6.1.2-supports-UTF-8-paths-.patch -Patch13: ffmpeg45.patch +Patch13: https://code.videolan.org/videolan/vlc/-/merge_requests/895.patch#/ffmpeg45.patch BuildRequires: desktop-file-utils BuildRequires: libappstream-glib @@ -356,7 +356,9 @@ sed -i -e 's/luac/luac-5.1/g' configure.ac %if 0%{?rhel} >= 7 %patch12 -p1 %endif +%if 0%{?fedora} > 35 %patch13 -p1 +%endif %{?_with_bootstrap: rm aclocal.m4 m4/lib*.m4 m4/lt*.m4 || :