diff mbox series

[FFmpeg-devel,20/25] fftools/ffmpeg_mux: stop using filter_in_rescale_delta_last for streamcopy

Message ID 20230413141223.17245-20-anton@khirnov.net
State Accepted
Commit 3f11582ca3d40fd98d00ad52b84348add4aa3b31
Headers show
Series [FFmpeg-devel,01/25] fftools/ffmpeg_mux_init: move new_output_stream() lower in the file | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Anton Khirnov April 13, 2023, 2:12 p.m. UTC
That field was added to store timestamp conversion state for audio
decoding code. Later it started being used by streamcopy as well, but
that use is wrong because, for a given input stream, both decoding and
an arbitrary number of streamcopies may be performed simultaneously.
They would then all overwrite the same state variable.

Store this state in MuxStream instead.

This is the last use of InputStream in of_streamcopy(), so the ist
parameter can now be removed.
---
 fftools/ffmpeg.c     | 2 +-
 fftools/ffmpeg.h     | 3 +--
 fftools/ffmpeg_mux.c | 6 +++---
 fftools/ffmpeg_mux.h | 3 +++
 4 files changed, 8 insertions(+), 6 deletions(-)
diff mbox series

Patch

diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index 92cc98b089..67c504470a 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -1768,7 +1768,7 @@  static int process_input_packet(InputStream *ist, const AVPacket *pkt, int no_eo
             continue;
         }
 
-        of_streamcopy(ist, ost, pkt, ist->dts);
+        of_streamcopy(ost, pkt, ist->dts);
     }
 
     return !eof_reached;
diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index 46b4614ec4..6ad3245166 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -876,8 +876,7 @@  void of_output_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int eof)
 /**
  * @param dts predicted packet dts in AV_TIME_BASE_Q
  */
-void of_streamcopy(InputStream *ist, OutputStream *ost,
-                   const AVPacket *pkt, int64_t dts);
+void of_streamcopy(OutputStream *ost, const AVPacket *pkt, int64_t dts);
 
 int64_t of_filesize(OutputFile *of);
 
diff --git a/fftools/ffmpeg_mux.c b/fftools/ffmpeg_mux.c
index db6ad9d589..8c710c2eac 100644
--- a/fftools/ffmpeg_mux.c
+++ b/fftools/ffmpeg_mux.c
@@ -378,10 +378,10 @@  fail:
 
 }
 
-void of_streamcopy(InputStream *ist, OutputStream *ost,
-                   const AVPacket *pkt, int64_t dts)
+void of_streamcopy(OutputStream *ost, const AVPacket *pkt, int64_t dts)
 {
     OutputFile *of = output_files[ost->file_index];
+    MuxStream  *ms = ms_from_ost(ost);
     int64_t start_time = (of->start_time == AV_NOPTS_VALUE) ? 0 : of->start_time;
     int64_t ost_tb_start_time = av_rescale_q(start_time, AV_TIME_BASE_Q, ost->mux_timebase);
     AVPacket *opkt = ost->pkt;
@@ -430,7 +430,7 @@  void of_streamcopy(InputStream *ist, OutputStream *ost,
             duration = ost->par_in->frame_size;
         opkt->dts = av_rescale_delta(pkt->time_base, pkt->dts,
                                     (AVRational){1, ost->par_in->sample_rate}, duration,
-                                    &ist->filter_in_rescale_delta_last, opkt->time_base);
+                                    &ms->ts_rescale_delta_last, opkt->time_base);
         /* dts will be set immediately afterwards to what pts is now */
         opkt->pts = opkt->dts - ost_tb_start_time;
     } else
diff --git a/fftools/ffmpeg_mux.h b/fftools/ffmpeg_mux.h
index 3fab74b2ed..e8c4ea4847 100644
--- a/fftools/ffmpeg_mux.h
+++ b/fftools/ffmpeg_mux.h
@@ -64,6 +64,9 @@  typedef struct MuxStream {
      * used for making up missing dts values */
     int64_t last_mux_dts;
 
+    // audio streamcopy - state for av_rescale_delta()
+    int64_t ts_rescale_delta_last;
+
     // combined size of all the packets sent to the muxer
     uint64_t data_size_mux;
 } MuxStream;