[vlc-commits] [Git][videolan/vlc][3.0.x] 7 commits: avcodec: remove use of av_init_packet as it is deprecated in new ffmpeg major version

Jean-Baptiste Kempf (@jbk) gitlab at videolan.org
Sat Nov 27 17:24:56 UTC 2021



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 <hugo at beauzee.fr>

- - - - -
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 <hugo at beauzee.fr>

- - - - -
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 <hugo at beauzee.fr>

- - - - -
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 <hugo at beauzee.fr>

- - - - -
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 <hugo at beauzee.fr>

- - - - -
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 <hugo at beauzee.fr>

- - - - -
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 <hugo at beauzee.fr>

- - - - -


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.




More information about the vlc-commits mailing list