[FFmpeg-devel] [PATCH 06/18] avformat: port AVFormatInternal->packet_buffer to the new packet list API

James Almer jamrial at gmail.com
Wed Nov 18 18:52:35 EET 2020


Signed-off-by: James Almer <jamrial at gmail.com>
---
 libavformat/internal.h |  3 +-
 libavformat/mux.c      | 53 +++++++++++++++++++-----------
 libavformat/mxfenc.c   | 19 +++++++----
 libavformat/options.c  |  6 ++++
 libavformat/utils.c    | 74 ++++++++++++++++++++++++++++++------------
 5 files changed, 107 insertions(+), 48 deletions(-)

diff --git a/libavformat/internal.h b/libavformat/internal.h
index d366bdc452..3182409dfb 100644
--- a/libavformat/internal.h
+++ b/libavformat/internal.h
@@ -74,8 +74,7 @@ struct AVFormatInternal {
      * not decoded, for example to get the codec parameters in MPEG
      * streams.
      */
-    struct PacketListEntry *packet_buffer;
-    struct PacketListEntry *packet_buffer_end;
+    struct AVPacketList *packet_buffer;
 
     /* av_seek_frame() support */
     int64_t data_offset; /**< offset of the first packet */
diff --git a/libavformat/mux.c b/libavformat/mux.c
index cf52de5366..6991f81f9f 100644
--- a/libavformat/mux.c
+++ b/libavformat/mux.c
@@ -816,6 +816,11 @@ int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
     PacketListEntry **next_point, *this_pktl;
     AVStream *st = s->streams[pkt->stream_index];
     int chunked  = s->max_chunk_size || s->max_chunk_duration;
+#if FF_API_PACKET_LIST
+    struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer;
+#else
+    AVPacketList *packet_buffer = s->internal->packet_buffer;
+#endif
 
     this_pktl    = av_malloc(sizeof(PacketListEntry));
     if (!this_pktl) {
@@ -834,7 +839,7 @@ int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
     if (st->internal->last_in_packet_buffer) {
         next_point = &(st->internal->last_in_packet_buffer->next);
     } else {
-        next_point = &s->internal->packet_buffer;
+        next_point = &packet_buffer->head;
     }
 
     if (chunked) {
@@ -858,7 +863,7 @@ int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
         if (chunked && !(pkt->flags & CHUNK_START))
             goto next_non_null;
 
-        if (compare(s, &s->internal->packet_buffer_end->pkt, pkt)) {
+        if (compare(s, &packet_buffer->tail->pkt, pkt)) {
             while (   *next_point
                    && ((chunked && !((*next_point)->pkt.flags&CHUNK_START))
                        || !compare(s, &(*next_point)->pkt, pkt)))
@@ -866,12 +871,12 @@ int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
             if (*next_point)
                 goto next_non_null;
         } else {
-            next_point = &(s->internal->packet_buffer_end->next);
+            next_point = &(packet_buffer->tail->next);
         }
     }
     av_assert1(!*next_point);
 
-    s->internal->packet_buffer_end = this_pktl;
+    packet_buffer->tail = this_pktl;
 next_non_null:
 
     this_pktl->next = *next_point;
@@ -920,6 +925,11 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
     int noninterleaved_count = 0;
     int i, ret;
     int eof = flush;
+#if FF_API_PACKET_LIST
+    struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer;
+#else
+    AVPacketList *packet_buffer = s->internal->packet_buffer;
+#endif
 
     if (pkt) {
         if ((ret = ff_interleave_add_packet(s, pkt, interleave_compare_dts)) < 0)
@@ -940,11 +950,11 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
         flush = 1;
 
     if (s->max_interleave_delta > 0 &&
-        s->internal->packet_buffer &&
+        packet_buffer->head &&
         !flush &&
         s->internal->nb_interleaved_streams == stream_count+noninterleaved_count
     ) {
-        AVPacket *top_pkt = &s->internal->packet_buffer->pkt;
+        AVPacket *top_pkt = &packet_buffer->head->pkt;
         int64_t delta_dts = INT64_MIN;
         int64_t top_dts = av_rescale_q(top_pkt->dts,
                                        s->streams[top_pkt->stream_index]->time_base,
@@ -972,11 +982,11 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
         }
     }
 
-    if (s->internal->packet_buffer &&
+    if (packet_buffer->head &&
         eof &&
         (s->flags & AVFMT_FLAG_SHORTEST) &&
         s->internal->shortest_end == AV_NOPTS_VALUE) {
-        AVPacket *top_pkt = &s->internal->packet_buffer->pkt;
+        AVPacket *top_pkt = &packet_buffer->head->pkt;
 
         s->internal->shortest_end = av_rescale_q(top_pkt->dts,
                                        s->streams[top_pkt->stream_index]->time_base,
@@ -984,8 +994,8 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
     }
 
     if (s->internal->shortest_end != AV_NOPTS_VALUE) {
-        while (s->internal->packet_buffer) {
-            AVPacket *top_pkt = &s->internal->packet_buffer->pkt;
+        while (packet_buffer->head) {
+            AVPacket *top_pkt = &packet_buffer->head->pkt;
             AVStream *st;
             int64_t top_dts = av_rescale_q(top_pkt->dts,
                                         s->streams[top_pkt->stream_index]->time_base,
@@ -994,12 +1004,12 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
             if (s->internal->shortest_end + 1 >= top_dts)
                 break;
 
-            pktl = s->internal->packet_buffer;
+            pktl = packet_buffer->head;
             st   = s->streams[pktl->pkt.stream_index];
 
-            s->internal->packet_buffer = pktl->next;
-            if (!s->internal->packet_buffer)
-                s->internal->packet_buffer_end = NULL;
+            packet_buffer->head = pktl->next;
+            if (!packet_buffer->head)
+                packet_buffer->tail = NULL;
 
             if (st->internal->last_in_packet_buffer == pktl)
                 st->internal->last_in_packet_buffer = NULL;
@@ -1012,13 +1022,13 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
 
     if (stream_count && flush) {
         AVStream *st;
-        pktl = s->internal->packet_buffer;
+        pktl = packet_buffer->head;
         *out = pktl->pkt;
         st   = s->streams[out->stream_index];
 
-        s->internal->packet_buffer = pktl->next;
-        if (!s->internal->packet_buffer)
-            s->internal->packet_buffer_end = NULL;
+        packet_buffer->head = pktl->next;
+        if (!packet_buffer->head)
+            packet_buffer->tail = NULL;
 
         if (st->internal->last_in_packet_buffer == pktl)
             st->internal->last_in_packet_buffer = NULL;
@@ -1033,7 +1043,12 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
 int ff_interleaved_peek(AVFormatContext *s, int stream,
                         AVPacket *pkt, int add_offset)
 {
-    PacketListEntry *pktl = s->internal->packet_buffer;
+#if FF_API_PACKET_LIST
+    struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer;
+#else
+    AVPacketList *packet_buffer = s->internal->packet_buffer;
+#endif
+    PacketListEntry *pktl = packet_buffer->head;
     while (pktl) {
         if (pktl->pkt.stream_index == stream) {
             *pkt = pktl->pkt;
diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
index 8f2649c31f..55a53af5e8 100644
--- a/libavformat/mxfenc.c
+++ b/libavformat/mxfenc.c
@@ -3053,7 +3053,12 @@ static int mxf_interleave_get_packet(AVFormatContext *s, AVPacket *out, AVPacket
         stream_count += !!s->streams[i]->internal->last_in_packet_buffer;
 
     if (stream_count && (s->nb_streams == stream_count || flush)) {
-        PacketListEntry *pktl = s->internal->packet_buffer;
+#if FF_API_PACKET_LIST
+        struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer;
+#else
+        AVPacketList *packet_buffer = s->internal->packet_buffer;
+#endif
+        PacketListEntry *pktl = packet_buffer->head;
         if (s->nb_streams != stream_count) {
             PacketListEntry *last = NULL;
             // find last packet in edit unit
@@ -3077,20 +3082,20 @@ static int mxf_interleave_get_packet(AVFormatContext *s, AVPacket *out, AVPacket
             if (last)
                 last->next = NULL;
             else {
-                s->internal->packet_buffer = NULL;
-                s->internal->packet_buffer_end= NULL;
+                packet_buffer->head = NULL;
+                packet_buffer->tail= NULL;
                 goto out;
             }
-            pktl = s->internal->packet_buffer;
+            pktl = packet_buffer->head;
         }
 
         *out = pktl->pkt;
         av_log(s, AV_LOG_TRACE, "out st:%d dts:%"PRId64"\n", (*out).stream_index, (*out).dts);
-        s->internal->packet_buffer = pktl->next;
+        packet_buffer->head = pktl->next;
         if(s->streams[pktl->pkt.stream_index]->internal->last_in_packet_buffer == pktl)
             s->streams[pktl->pkt.stream_index]->internal->last_in_packet_buffer= NULL;
-        if(!s->internal->packet_buffer)
-            s->internal->packet_buffer_end= NULL;
+        if(!packet_buffer->head)
+            packet_buffer->tail = NULL;
         av_freep(&pktl);
         return 1;
     } else {
diff --git a/libavformat/options.c b/libavformat/options.c
index 59e0389815..9fe1500cee 100644
--- a/libavformat/options.c
+++ b/libavformat/options.c
@@ -220,6 +220,12 @@ AVFormatContext *avformat_alloc_context(void)
         av_free(ic);
         return NULL;
     }
+    internal->packet_buffer = av_packet_list_alloc();
+    if (!internal->packet_buffer) {
+        av_free(internal);
+        av_free(ic);
+        return NULL;
+    }
     avformat_get_context_defaults(ic);
     ic->internal = internal;
     ic->internal->offset = AV_NOPTS_VALUE;
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 20bf723a55..88ce64496d 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -1009,9 +1009,15 @@ static int has_decode_delay_been_guessed(AVStream *st)
 
 static PacketListEntry *get_next_pkt(AVFormatContext *s, AVStream *st, PacketListEntry *pktl)
 {
+#if FF_API_PACKET_LIST
+    struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer;
+#else
+    AVPacketList *packet_buffer = s->internal->packet_buffer;
+#endif
+
     if (pktl->next)
         return pktl->next;
-    if (pktl == s->internal->packet_buffer_end)
+    if (pktl == packet_buffer->tail)
         return s->internal->parse_queue;
     return NULL;
 }
@@ -1092,7 +1098,14 @@ static void update_initial_timestamps(AVFormatContext *s, int stream_index,
                                       int64_t dts, int64_t pts, AVPacket *pkt)
 {
     AVStream *st       = s->streams[stream_index];
-    PacketListEntry *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
+#if FF_API_PACKET_LIST
+    struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer;
+#else
+    AVPacketList *packet_buffer = s->internal->packet_buffer;
+#endif
+    PacketListEntry *pktl = packet_buffer->head ?
+                            packet_buffer->head :
+                            s->internal->parse_queue;
     PacketListEntry *pktl_it;
 
     uint64_t shift;
@@ -1143,7 +1156,14 @@ static void update_initial_timestamps(AVFormatContext *s, int stream_index,
 static void update_initial_durations(AVFormatContext *s, AVStream *st,
                                      int stream_index, int64_t duration)
 {
-    PacketListEntry *pktl = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
+#if FF_API_PACKET_LIST
+    struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer;
+#else
+    AVPacketList *packet_buffer = s->internal->packet_buffer;
+#endif
+    PacketListEntry *pktl = packet_buffer->head ?
+                            packet_buffer->head :
+                            s->internal->parse_queue;
     int64_t cur_dts    = RELATIVE_TS_BASE;
 
     if (st->first_dts != AV_NOPTS_VALUE) {
@@ -1169,7 +1189,9 @@ static void update_initial_durations(AVFormatContext *s, AVStream *st,
             av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in the queue\n", av_ts2str(st->first_dts));
             return;
         }
-        pktl          = s->internal->packet_buffer ? s->internal->packet_buffer : s->internal->parse_queue;
+        pktl          = packet_buffer->head ?
+                        packet_buffer->head :
+                        s->internal->parse_queue;
         st->first_dts = cur_dts;
     } else if (st->cur_dts != RELATIVE_TS_BASE)
         return;
@@ -1204,6 +1226,11 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
     AVRational duration;
     int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 &&
                        st->codecpar->codec_id != AV_CODEC_ID_HEVC;
+#if FF_API_PACKET_LIST
+    struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer;
+#else
+    AVPacketList *packet_buffer = s->internal->packet_buffer;
+#endif
 
     if (s->flags & AVFMT_FLAG_NOFILLIN)
         return;
@@ -1281,7 +1308,7 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
         }
     }
 
-    if (pkt->duration > 0 && (s->internal->packet_buffer || s->internal->parse_queue))
+    if (pkt->duration > 0 && (packet_buffer->head || s->internal->parse_queue))
         update_initial_durations(s, st, pkt->stream_index, pkt->duration);
 
     /* Correct timestamps with byte offset if demuxers only have timestamps
@@ -1715,11 +1742,15 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt)
     int eof = 0;
     int ret;
     AVStream *st;
+#if FF_API_PACKET_LIST
+    struct PacketList *packet_buffer = (struct PacketList *)s->internal->packet_buffer;
+#else
+    AVPacketList *packet_buffer = s->internal->packet_buffer;
+#endif
 
     if (!genpts) {
-        ret = s->internal->packet_buffer
-              ? avpriv_packet_list_get(&s->internal->packet_buffer,
-                                        &s->internal->packet_buffer_end, pkt)
+        ret = packet_buffer->head
+              ? av_packet_list_get(s->internal->packet_buffer, pkt, 0)
               : read_frame_internal(s, pkt);
         if (ret < 0)
             return ret;
@@ -1727,7 +1758,7 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt)
     }
 
     for (;;) {
-        PacketListEntry *pktl = s->internal->packet_buffer;
+        PacketListEntry *pktl = packet_buffer->head;
 
         if (pktl) {
             AVPacket *next_pkt = &pktl->pkt;
@@ -1760,15 +1791,14 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt)
                     // 3. the packets for this stream at the end of the files had valid dts.
                     next_pkt->pts = last_dts + next_pkt->duration;
                 }
-                pktl = s->internal->packet_buffer;
+                pktl = packet_buffer->head;
             }
 
             /* read packet from packet buffer, if there is data */
             st = s->streams[next_pkt->stream_index];
             if (!(next_pkt->pts == AV_NOPTS_VALUE && st->discard < AVDISCARD_ALL &&
                   next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
-                ret = avpriv_packet_list_get(&s->internal->packet_buffer,
-                                               &s->internal->packet_buffer_end, pkt);
+                ret = av_packet_list_get(s->internal->packet_buffer, pkt, 0);
                 goto return_packet;
             }
         }
@@ -1782,8 +1812,7 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt)
                 return ret;
         }
 
-        ret = avpriv_packet_list_put(&s->internal->packet_buffer,
-                                 &s->internal->packet_buffer_end,
+        ret = av_packet_list_put(s->internal->packet_buffer,
                                  pkt, NULL, 0);
         if (ret < 0) {
             av_packet_unref(pkt);
@@ -1813,7 +1842,7 @@ static void flush_packet_queue(AVFormatContext *s)
     if (!s->internal)
         return;
     avpriv_packet_list_free(&s->internal->parse_queue,       &s->internal->parse_queue_end);
-    avpriv_packet_list_free(&s->internal->packet_buffer,     &s->internal->packet_buffer_end);
+    av_packet_list_flush(s->internal->packet_buffer);
     avpriv_packet_list_free(&s->internal->raw_packet_buffer, &s->internal->raw_packet_buffer_end);
 
     s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
@@ -3581,6 +3610,11 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
     int64_t probesize = ic->probesize;
     int eof_reached = 0;
     int *missing_streams = av_opt_ptr(ic->iformat->priv_class, ic->priv_data, "missing_streams");
+#if FF_API_PACKET_LIST
+    struct PacketList *packet_buffer = (struct PacketList *)ic->internal->packet_buffer;
+#else
+    AVPacketList *packet_buffer = ic->internal->packet_buffer;
+#endif
 
     flush_codecs = probesize > 0;
 
@@ -3784,13 +3818,12 @@ FF_ENABLE_DEPRECATION_WARNINGS
         }
 
         if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) {
-            ret = avpriv_packet_list_put(&ic->internal->packet_buffer,
-                                     &ic->internal->packet_buffer_end,
+            ret = av_packet_list_put(ic->internal->packet_buffer,
                                      &pkt1, NULL, 0);
             if (ret < 0)
                 goto unref_then_goto_end;
 
-            pkt = &ic->internal->packet_buffer_end->pkt;
+            pkt = &packet_buffer->tail->pkt;
         } else {
             pkt = &pkt1;
         }
@@ -3933,8 +3966,8 @@ FF_ENABLE_DEPRECATION_WARNINGS
 
             // EOF already reached while reading the stream above.
             // So continue with reoordering DTS with whatever delay we have.
-            if (ic->internal->packet_buffer && !has_decode_delay_been_guessed(st)) {
-                update_dts_from_pts(ic, stream_index, ic->internal->packet_buffer);
+            if (packet_buffer->head && !has_decode_delay_been_guessed(st)) {
+                update_dts_from_pts(ic, stream_index, packet_buffer->head);
             }
         }
     }
@@ -4437,6 +4470,7 @@ void avformat_free_context(AVFormatContext *s)
     av_dict_free(&s->internal->id3v2_meta);
     av_freep(&s->streams);
     flush_packet_queue(s);
+    av_packet_list_free(&s->internal->packet_buffer);
     av_freep(&s->internal);
     av_freep(&s->url);
     av_free(s);
-- 
2.29.2



More information about the ffmpeg-devel mailing list