On 3/19/2021 2:58 AM, Andreas Rheinhardt wrote:
One can simply reuse AVFormatInternal.parse_pkt instead.

Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@gmail.com>
---
  libavformat/internal.h | 12 ++++++++++--
  libavformat/utils.c    | 29 ++++++++++-------------------
  2 files changed, 20 insertions(+), 21 deletions(-)

diff --git a/libavformat/internal.h b/libavformat/internal.h
index 3c6b2921c1..a810d51bba 100644
--- a/libavformat/internal.h
+++ b/libavformat/internal.h
@@ -90,9 +90,18 @@ struct AVFormatInternal {
      /**
       * Packets split by the parser get queued here.
       */
-    AVPacket *parse_pkt;
      struct PacketList *parse_queue;
      struct PacketList *parse_queue_end;
+    /**
+     * The generic code uses this as a temporary packet
+     * to parse packets; it may also be used for other means
+     * for short periods that are guaranteed not to overlap
+     * with calls to av_read_frame() (or ff_read_packet())
+     * or with each other.
+     * Every user has to ensure that this packet is blank
+     * after using it.
+     */
+    AVPacket *parse_pkt;
/**
       * Used to hold temporary packets.
@@ -190,7 +199,6 @@ struct AVStreamInternal {
       * supported) */
      struct {
          AVBSFContext *bsf;
-        AVPacket     *pkt;
          int inited;
      } extract_extradata;
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 0c167d0cb9..3542e40afd 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -3498,13 +3498,9 @@ static int extract_extradata_init(AVStream *st)
      if (!ret)
          goto finish;
- sti->extract_extradata.pkt = av_packet_alloc();
-    if (!sti->extract_extradata.pkt)
-        return AVERROR(ENOMEM);
-
      ret = av_bsf_alloc(f, &sti->extract_extradata.bsf);
      if (ret < 0)
-        goto fail;
+        return ret;
ret = avcodec_parameters_copy(sti->extract_extradata.bsf->par_in,
                                    st->codecpar);
@@ -3523,14 +3519,12 @@ finish:
      return 0;
  fail:
      av_bsf_free(&sti->extract_extradata.bsf);
-    av_packet_free(&sti->extract_extradata.pkt);
      return ret;
  }
-static int extract_extradata(AVStream *st, const AVPacket *pkt)
+static int extract_extradata(AVStream *st, AVPacket *tmp, const AVPacket *pkt)

Make the caller pass the AVFormatContext pointer and set pkt_ref to ic->internal->parse_pkt instead of sti->extract_extradata.pkt. It's more in line with how we use internal fields as temporary storage in most functions, and will reduce the size of this patch.

  {
      AVStreamInternal *sti = st->internal;
-    AVPacket *pkt_ref;
      int ret;
if (!sti->extract_extradata.inited) {
@@ -3542,27 +3536,26 @@ static int extract_extradata(AVStream *st, const 
AVPacket *pkt)
      if (sti->extract_extradata.inited && !sti->extract_extradata.bsf)
          return 0;
- pkt_ref = sti->extract_extradata.pkt;
-    ret = av_packet_ref(pkt_ref, pkt);
+    ret = av_packet_ref(tmp, pkt);
      if (ret < 0)
          return ret;
- ret = av_bsf_send_packet(sti->extract_extradata.bsf, pkt_ref);
+    ret = av_bsf_send_packet(sti->extract_extradata.bsf, tmp);
      if (ret < 0) {
-        av_packet_unref(pkt_ref);
+        av_packet_unref(tmp);
          return ret;
      }
while (ret >= 0 && !sti->avctx->extradata) {
-        ret = av_bsf_receive_packet(sti->extract_extradata.bsf, pkt_ref);
+        ret = av_bsf_receive_packet(sti->extract_extradata.bsf, tmp);
          if (ret < 0) {
              if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
                  return ret;
              continue;
          }
- for (int i = 0; i < pkt_ref->side_data_elems; i++) {
-            AVPacketSideData *side_data = &pkt_ref->side_data[i];
+        for (int i = 0; i < tmp->side_data_elems; i++) {
+            AVPacketSideData *side_data = &tmp->side_data[i];
              if (side_data->type == AV_PKT_DATA_NEW_EXTRADATA) {
                  sti->avctx->extradata      = side_data->data;
                  sti->avctx->extradata_size = side_data->size;
@@ -3571,7 +3564,7 @@ static int extract_extradata(AVStream *st, const AVPacket 
*pkt)
                  break;
              }
          }
-        av_packet_unref(pkt_ref);
+        av_packet_unref(tmp);
      }
return 0;
@@ -3923,7 +3916,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
                  st->internal->info->frame_delay_evidence = 1;
          }
          if (!st->internal->avctx->extradata) {
-            ret = extract_extradata(st, pkt);
+            ret = extract_extradata(st, ic->internal->parse_pkt, pkt);
              if (ret < 0)
                  goto unref_then_goto_end;
          }
@@ -4189,7 +4182,6 @@ find_stream_info_err:
          avcodec_close(ic->streams[i]->internal->avctx);
          av_freep(&ic->streams[i]->internal->info);
          av_bsf_free(&ic->streams[i]->internal->extract_extradata.bsf);
-        av_packet_free(&ic->streams[i]->internal->extract_extradata.pkt);
      }
      if (ic->pb)
          av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes 
read:%"PRId64" seeks:%d frames:%d\n",
@@ -4391,7 +4383,6 @@ static void free_stream(AVStream **pst)
          av_freep(&st->internal->probe_data.buf);
av_bsf_free(&st->internal->extract_extradata.bsf);
-        av_packet_free(&st->internal->extract_extradata.pkt);
if (st->internal->info)
              av_freep(&st->internal->info->duration_error);


_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to