From 16fd46fa506424134beb53ec88be3eea1b42a221 Mon Sep 17 00:00:00 2001 From: Ilkka Ollakka <ileoo@videolan.org> Date: Wed, 7 Jul 2021 12:37:58 +0000 Subject: [PATCH] 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. --- modules/codec/avcodec/audio.c | 12 +++++++----- modules/codec/avcodec/encoder.c | 23 +++++++++++++---------- modules/codec/avcodec/subtitle.c | 21 +++++++++++---------- modules/codec/avcodec/video.c | 32 ++++++++++++++++++-------------- modules/demux/avformat/mux.c | 28 ++++++++++++++++------------ 5 files changed, 65 insertions(+), 51 deletions(-) diff --git a/modules/codec/avcodec/audio.c b/modules/codec/avcodec/audio.c index fc3330cc74ce..64127081b5f0 100644 --- a/modules/codec/avcodec/audio.c +++ b/modules/codec/avcodec/audio.c @@ -372,11 +372,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 1afc2b4a148a..5f0acdca3146 100644 --- a/modules/codec/avcodec/encoder.c +++ b/modules/codec/avcodec/encoder.c @@ -1067,14 +1067,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); } @@ -1100,7 +1100,7 @@ static block_t *vlc_av_packet_Wrap(AVPacket *packet, AVCodecContext *context ) block_Init( p_block, &vlc_av_packet_cbs, packet->data, packet->size ); p_block->i_nb_samples = 0; p_block->cbs = &vlc_av_packet_cbs; - b->packet = *packet; + b->packet = packet; p_block->i_length = FROM_AVSCALE(packet->duration, context->time_base); if( unlikely( packet->flags & AV_PKT_FLAG_CORRUPT ) ) @@ -1170,11 +1170,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 ) { - 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) ) @@ -1182,17 +1184,18 @@ 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, p_sys->p_context ); + block_t *p_block = vlc_av_packet_Wrap( av_pkt, 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 a92522e4ed00..4cb920a8f444 100644 --- a/modules/codec/avcodec/subtitle.c +++ b/modules/codec/avcodec/subtitle.c @@ -113,11 +113,7 @@ int InitSubtitleDec(vlc_object_t *obj) } } -#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 /* */ int ret; @@ -217,16 +213,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 = TO_AV_TS(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 = TO_AV_TS(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 9bb9a7748b44..dcca40fa5c2e 100644 --- a/modules/codec/avcodec/video.c +++ b/modules/codec/avcodec/video.c @@ -973,29 +973,33 @@ static int DecodeBlock( decoder_t *p_dec, block_t **pp_block ) if( (p_block && p_block->i_buffer > 0) || b_drain ) { - AVPacket pkt; - av_init_packet( &pkt ); + AVPacket *pkt = av_packet_alloc(); + if(!pkt) + { + b_error = true; + break; + } if( p_block && p_block->i_buffer > 0 ) { - pkt.data = p_block->p_buffer; - pkt.size = p_block->i_buffer; - pkt.pts = p_block->i_pts != VLC_TICK_INVALID ? TO_AV_TS(p_block->i_pts) : AV_NOPTS_VALUE; - pkt.dts = p_block->i_dts != VLC_TICK_INVALID ? TO_AV_TS(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_TICK_INVALID ? TO_AV_TS(p_block->i_pts) : AV_NOPTS_VALUE; + pkt->dts = p_block->i_dts != VLC_TICK_INVALID ? TO_AV_TS(p_block->i_dts) : AV_NOPTS_VALUE; if (p_block->i_flags & BLOCK_FLAG_TYPE_I) - pkt.flags |= AV_PKT_FLAG_KEY; + pkt->flags |= AV_PKT_FLAG_KEY; } else { /* Drain */ - pkt.data = NULL; - pkt.size = 0; + pkt->data = NULL; + pkt->size = 0; b_drain = false; b_drained = 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; @@ -1009,7 +1013,7 @@ static int DecodeBlock( decoder_t *p_dec, block_t **pp_block ) p_block->i_dts = VLC_TICK_INVALID; } - int ret = avcodec_send_packet(p_context, &pkt); + int ret = avcodec_send_packet(p_context, pkt); if( ret != 0 && ret != AVERROR(EAGAIN) ) { if (ret == AVERROR(ENOMEM) || ret == AVERROR(EINVAL)) @@ -1017,7 +1021,7 @@ static int DecodeBlock( decoder_t *p_dec, block_t **pp_block ) msg_Err(p_dec, "avcodec_send_packet critical error"); b_error = true; } - av_packet_unref( &pkt ); + av_packet_free( &pkt ); break; } @@ -1026,8 +1030,8 @@ static int DecodeBlock( decoder_t *p_dec, block_t **pp_block ) p_frame_info->b_display = b_need_output_picture; p_context->reordered_opaque++; - i_used = ret != AVERROR(EAGAIN) ? pkt.size : 0; - av_packet_unref( &pkt ); + i_used = ret != AVERROR(EAGAIN) ? pkt->size : 0; + av_packet_free( &pkt ); if( p_frame_info->b_eos && !b_drained ) { diff --git a/modules/demux/avformat/mux.c b/modules/demux/avformat/mux.c index 74de67a08acb..e1e139549c39 100644 --- a/modules/demux/avformat/mux.c +++ b/modules/demux/avformat/mux.c @@ -377,14 +377,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 ) { @@ -395,26 +397,28 @@ 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 >= VLC_TICK_0 ) - pkt.pts = av_rescale_q( p_data->i_pts - VLC_TICK_0, + pkt->pts = av_rescale_q( p_data->i_pts - VLC_TICK_0, VLC_TIME_BASE_Q, p_stream->time_base ); if( p_data->i_dts >= VLC_TICK_0 ) - pkt.dts = av_rescale_q( p_data->i_dts - VLC_TICK_0, + pkt->dts = av_rescale_q( p_data->i_dts - VLC_TICK_0, VLC_TIME_BASE_Q, p_stream->time_base ); - 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