diff mbox series

[FFmpeg-devel,v2,6/7] avformat/argo_brp: remove usage of floats

Message ID 20200918120416.7319-7-zane@zanevaniperen.com
State Superseded
Headers show
Series Support variable frame sizes in adpcm_argo
Related show

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

Zane van Iperen Sept. 18, 2020, 12:05 p.m. UTC
Signed-off-by: Zane van Iperen <zane@zanevaniperen.com>
---
 libavformat/argo_brp.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)
diff mbox series

Patch

diff --git a/libavformat/argo_brp.c b/libavformat/argo_brp.c
index a3e9846c74..3a5a0c0497 100644
--- a/libavformat/argo_brp.c
+++ b/libavformat/argo_brp.c
@@ -78,8 +78,8 @@  typedef struct ArgoBRPStreamHeader {
 typedef struct ArgoBRPDemuxContext {
     ArgoBRPFileHeader   fhdr;
     ArgoBRPStreamHeader *streams;
-    /* To know how much of a BASF to give. */
-    int64_t             lastpts;
+    /* Current PTS converted into BASF timebase (samples). */
+    int64_t             currpts;
     int                 hit_eof;
 
     /* BASF-specific fields. */
@@ -88,7 +88,6 @@  typedef struct ArgoBRPDemuxContext {
         ArgoASFChunkHeader  ckhdr;
         uint32_t            blocks_read;
         int64_t             offset;
-        /* ms, not samples. */
         int64_t             lastpts;
     } basf;
 } ArgoBRPDemuxContext;
@@ -352,7 +351,7 @@  static int argo_brp_read_basf(AVFormatContext *s, AVPacket *pkt,
     if (brp->basf.blocks_read >= ckhdr->num_blocks)
         return 0;
 
-    if (!ignorepts && brp->lastpts < brp->basf.lastpts)
+    if (!ignorepts && brp->currpts < brp->basf.lastpts)
         return 0;
 
     if ((ret = avio_tell(s->pb)) < 0)
@@ -377,8 +376,7 @@  static int argo_brp_read_basf(AVFormatContext *s, AVPacket *pkt,
 
     brp->basf.offset      += pkt->size;
     brp->basf.blocks_read += blocks_read;
-    /* Need the ceil() because ((1 * 32 * 1000) / 44100) < 1 */
-    brp->basf.lastpts     += ceilf((blocks_read * ckhdr->num_samples * 1000.0f) / ckhdr->sample_rate);
+    brp->basf.lastpts     += blocks_read * brp->basf.ckhdr.num_samples;
     return 1;
 }
 
@@ -434,7 +432,13 @@  static int argo_brp_read_packet(AVFormatContext *s, AVPacket *pkt)
 
     pkt->stream_index = blk.stream_id;
     pkt->pts          = blk.start_ms;
-    brp->lastpts      = FFMAX(brp->lastpts, blk.start_ms);
+
+    if (brp->basf.index >= 0) {
+        int64_t pts = av_rescale_rnd(blk.start_ms, brp->basf.ckhdr.sample_rate,
+                                     1000, AV_ROUND_UP);
+        brp->currpts = FFMAX(brp->currpts, pts);
+    }
+
     return 0;
 }