Jean-Baptiste Kempf pushed to branch 3.0.x at VideoLAN / VLC
Commits: 37427cab by Ilkka Ollakka at 2021-11-27T17:04:03+00:00 avcodec: remove use of av_init_packet as it is deprecated in new ffmpeg major version av_init_packet is deprecated in new major version of ffmpeg. Also use av_packet_free instead of unref. Use av_packet_clone and AVPacket * in vlc_av_packet_t. (cherry picked from commit 16fd46fa506424134beb53ec88be3eea1b42a221) Signed-off-by: Hugo Beauzée-Luyssen <[email protected]> - - - - - 2da10968 by Ilkka Ollakka at 2021-11-27T17:04:03+00:00 avcodec/subtitle: stop using removed setter for pkt timebase Removed from ffmpeg repo in commit 23bb78d2ea4f0e3a0835744d59708efed50abccc. (cherry picked from commit e7190e7a70e9701754c50348f5b6357759440657) Signed-off-by: Hugo Beauzée-Luyssen <[email protected]> - - - - - 0094e5b4 by Alexandre Janniaux at 2021-11-27T17:04:03+00:00 avcodec: remove deprecation warning for av*_register_all >From doc/APIchanges: 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(). 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(). 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 21d5a1933275edb7f67d05ea62a762464e07c2cb) Signed-off-by: Hugo Beauzée-Luyssen <[email protected]> - - - - - a77f45d0 by Rémi Denis-Courmont at 2021-11-27T17:04:03+00:00 avcodec: fix flawed logic Cannot find any codec. Regression from 21d5a1933275edb7f67d05ea62a762464e07c2cb. (cherry picked from commit 067dcd0a1974b00a92e900b0e5c976349ad13859) Signed-off-by: Hugo Beauzée-Luyssen <[email protected]> - - - - - 869e2119 by Hugo Beauzée-Luyssen at 2021-11-27T17:04:03+00:00 avcodec: encoder: Fix leak on error (cherry picked from commit b04e2c5d9f2cc55d64a84161fcdd24b35e9092b4) Signed-off-by: Hugo Beauzée-Luyssen <[email protected]> - - - - - 84ff84a8 by Hugo Beauzée-Luyssen at 2021-11-27T17:04:03+00:00 avcodec: encoder: Don't unref frame twice The frame is unref'ed in the callsite (cherry picked from commit ecdd9957744b04d3270774eb7c19920698641b70) Signed-off-by: Hugo Beauzée-Luyssen <[email protected]> - - - - - 1d2c7f2b by Hugo Beauzée-Luyssen at 2021-11-27T17:04:03+00:00 muxer: avformat: Add missing av_packet_free (cherry picked from commit c2549ced70d5a6c56fd2411519b185b4a04c36d2) Signed-off-by: Hugo Beauzée-Luyssen <[email protected]> - - - - - 6 changed files: - modules/codec/avcodec/audio.c - modules/codec/avcodec/avcommon.h - modules/codec/avcodec/encoder.c - modules/codec/avcodec/subtitle.c - modules/codec/avcodec/video.c - modules/demux/avformat/mux.c Changes: ===================================== 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, ===================================== modules/codec/avcodec/avcommon.h ===================================== @@ -97,6 +97,7 @@ static inline void vlc_init_avutil(vlc_object_t *obj) #ifdef HAVE_LIBAVFORMAT_AVFORMAT_H # include <libavformat/avformat.h> +# include <libavformat/version.h> static inline void vlc_init_avformat(vlc_object_t *obj) { vlc_avcodec_lock(); @@ -105,7 +106,9 @@ static inline void vlc_init_avformat(vlc_object_t *obj) avformat_network_init(); +#if (LIBAVFORMAT_VERSION_MICRO < 100) || (LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(58, 9, 100)) av_register_all(); +#endif vlc_avcodec_unlock(); } @@ -113,13 +116,16 @@ static inline void vlc_init_avformat(vlc_object_t *obj) #ifdef HAVE_LIBAVCODEC_AVCODEC_H # include <libavcodec/avcodec.h> +# include <libavcodec/version.h> static inline void vlc_init_avcodec(vlc_object_t *obj) { vlc_avcodec_lock(); vlc_init_avutil(obj); +#if (LIBAVFORMAT_VERSION_MICRO < 100) || (LIBAVCODEC_VERSION_INT < AV_VERSION_INT(58, 10, 100)) avcodec_register_all(); +#endif vlc_avcodec_unlock(); } ===================================== modules/codec/avcodec/encoder.c ===================================== @@ -1061,14 +1061,14 @@ error: typedef struct { block_t self; - AVPacket packet; + AVPacket *packet; } vlc_av_packet_t; static void vlc_av_packet_Release(block_t *block) { vlc_av_packet_t *b = (void *) block; - av_packet_unref(&b->packet); + av_packet_free( &b->packet ); free(b); } @@ -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,30 +1138,31 @@ 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 ) { - 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 ) + return NULL; int ret = avcodec_send_frame( p_sys->p_context, frame ); if( frame && ret != 0 && ret != AVERROR(EAGAIN) ) { msg_Warn( p_enc, "cannot send one frame to encoder %d", ret ); + av_packet_free( &av_pkt ); 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; ===================================== 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 @@ -186,16 +188,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); ===================================== 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_free( &pkt ); } AVFrame *frame = av_frame_alloc(); ===================================== 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; + } - 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( 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 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_free( &pkt ); return VLC_EGENERIC; } + + av_packet_free( &pkt ); block_Release( p_data ); return VLC_SUCCESS; } View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/73439b6b5839ec045462a1d98e37192328225bca...1d2c7f2b00dda88db6a646132e206fb07f4675ab -- View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/73439b6b5839ec045462a1d98e37192328225bca...1d2c7f2b00dda88db6a646132e206fb07f4675ab You're receiving this email because of your account on code.videolan.org.
_______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
