[FFmpeg-cvslog] avformat/wavarc: demux only data chunk content

Paul B Mahol git at videolan.org
Thu Feb 9 21:49:10 EET 2023


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Thu Feb  9 11:32:19 2023 +0100| [8ed1d6b5e409c2a92a6920b42caff5ea89b66dfb] | committer: Paul B Mahol

avformat/wavarc: demux only data chunk content

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8ed1d6b5e409c2a92a6920b42caff5ea89b66dfb
---

 libavformat/Makefile |  2 +-
 libavformat/wavarc.c | 30 +++++++++++++++++++++++++-----
 2 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/libavformat/Makefile b/libavformat/Makefile
index d68b78ce34..5d219afc06 100644
--- a/libavformat/Makefile
+++ b/libavformat/Makefile
@@ -598,7 +598,7 @@ OBJS-$(CONFIG_VQF_DEMUXER)               += vqf.o
 OBJS-$(CONFIG_W64_DEMUXER)               += wavdec.o w64.o pcm.o
 OBJS-$(CONFIG_W64_MUXER)                 += wavenc.o w64.o
 OBJS-$(CONFIG_WADY_DEMUXER)              += wady.o pcm.o
-OBJS-$(CONFIG_WAVARC_DEMUXER)            += wavarc.o rawdec.o
+OBJS-$(CONFIG_WAVARC_DEMUXER)            += wavarc.o
 OBJS-$(CONFIG_WAV_DEMUXER)               += wavdec.o pcm.o
 OBJS-$(CONFIG_WAV_MUXER)                 += wavenc.o
 OBJS-$(CONFIG_WC3_DEMUXER)               += wc3movie.o
diff --git a/libavformat/wavarc.c b/libavformat/wavarc.c
index 7b38995af9..208b723716 100644
--- a/libavformat/wavarc.c
+++ b/libavformat/wavarc.c
@@ -24,7 +24,10 @@
 #include "avformat.h"
 #include "demux.h"
 #include "internal.h"
-#include "rawdec.h"
+
+typedef struct WavArcContext {
+    int64_t data_end;
+} WavArcContext;
 
 static int wavarc_probe(const AVProbeData *p)
 {
@@ -51,6 +54,7 @@ static int wavarc_probe(const AVProbeData *p)
 
 static int wavarc_read_header(AVFormatContext *s)
 {
+    WavArcContext *w = s->priv_data;
     AVIOContext *pb = s->pb;
     AVCodecParameters *par;
     int filename_len, fmt_len, ret;
@@ -91,7 +95,8 @@ static int wavarc_read_header(AVFormatContext *s)
         if (id != MKTAG('d','a','t','a'))
             avio_skip(pb, avio_rl32(pb));
     } while (id != MKTAG('d','a','t','a') && !avio_feof(pb));
-    avio_skip(pb, 4);
+    w->data_end = avio_rl32(pb);
+    w->data_end += avio_tell(pb);
 
     if (AV_RL32(par->extradata + 16) != MKTAG('R','I','F','F'))
         return AVERROR_INVALIDDATA;
@@ -108,15 +113,30 @@ static int wavarc_read_header(AVFormatContext *s)
     return 0;
 }
 
+static int wavarc_read_packet(AVFormatContext *s, AVPacket *pkt)
+{
+    WavArcContext *w = s->priv_data;
+    AVIOContext *pb = s->pb;
+    int64_t size, left = w->data_end - avio_tell(pb);
+    int ret;
+
+    size = FFMIN(left, 1024);
+    if (size <= 0)
+        return AVERROR_EOF;
+
+    ret = av_get_packet(pb, pkt, size);
+    pkt->stream_index = 0;
+    return ret;
+}
+
 const AVInputFormat ff_wavarc_demuxer = {
     .name           = "wavarc",
     .long_name      = NULL_IF_CONFIG_SMALL("Waveform Archiver"),
+    .priv_data_size = sizeof(WavArcContext),
     .read_probe     = wavarc_probe,
-    .read_packet    = ff_raw_read_partial_packet,
+    .read_packet    = wavarc_read_packet,
     .flags          = AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK | AVFMT_NOTIMESTAMPS,
     .read_header    = wavarc_read_header,
     .extensions     = "wa",
     .raw_codec_id   = AV_CODEC_ID_WAVARC,
-    .priv_data_size = sizeof(FFRawDemuxerContext),
-    .priv_class     = &ff_raw_demuxer_class,
 };



More information about the ffmpeg-cvslog mailing list