summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavformat/matroskaenc.c57
1 files changed, 26 insertions, 31 deletions
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 9bbec1c027..ed1a817759 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -2347,57 +2347,45 @@ static int mkv_blockgroup_size(int pkt_size, int track_num_size)
}
#if CONFIG_MATROSKA_MUXER
-static int mkv_strip_wavpack(const uint8_t *src, uint8_t **pdst, int *size)
+static int mkv_reformat_wavpack(MatroskaMuxContext *mkv, AVIOContext *pb,
+ const AVPacket *pkt, int *size)
{
- uint8_t *dst;
- int srclen = *size;
+ const uint8_t *src = pkt->data;
+ int srclen = pkt->size;
int offset = 0;
int ret;
- dst = av_malloc(srclen);
- if (!dst)
- return AVERROR(ENOMEM);
-
while (srclen >= WV_HEADER_SIZE) {
WvHeader header;
ret = ff_wv_parse_header(&header, src);
if (ret < 0)
- goto fail;
+ return ret;
src += WV_HEADER_SIZE;
srclen -= WV_HEADER_SIZE;
- if (srclen < header.blocksize) {
- ret = AVERROR_INVALIDDATA;
- goto fail;
- }
+ if (srclen < header.blocksize)
+ return AVERROR_INVALIDDATA;
- if (header.initial) {
- AV_WL32(dst + offset, header.samples);
- offset += 4;
- }
- AV_WL32(dst + offset, header.flags);
- AV_WL32(dst + offset + 4, header.crc);
- offset += 8;
+ offset += 4 * !!header.initial + 8 + 4 * !(header.initial && header.final);
+ if (pb) {
+ if (header.initial)
+ avio_wl32(pb, header.samples);
+ avio_wl32(pb, header.flags);
+ avio_wl32(pb, header.crc);
- if (!(header.initial && header.final)) {
- AV_WL32(dst + offset, header.blocksize);
- offset += 4;
- }
+ if (!(header.initial && header.final))
+ avio_wl32(pb, header.blocksize);
- memcpy(dst + offset, src, header.blocksize);
+ avio_write(pb, src, header.blocksize);
+ }
src += header.blocksize;
srclen -= header.blocksize;
offset += header.blocksize;
}
-
- *pdst = dst;
*size = offset;
return 0;
-fail:
- av_freep(&dst);
- return ret;
}
#endif
@@ -2436,8 +2424,6 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb,
(AV_RB24(par->extradata) == 1 || AV_RB32(par->extradata) == 1)) {
/* extradata is Annex B, assume the bitstream is too and convert it */
err = ff_hevc_annexb2mp4_buf(pkt->data, &data, &size, 0, NULL);
- } else if (par->codec_id == AV_CODEC_ID_WAVPACK) {
- err = mkv_strip_wavpack(pkt->data, &data, &size);
} else
#endif
if (par->codec_id == AV_CODEC_ID_AV1) {
@@ -3111,8 +3097,17 @@ static int mkv_init(struct AVFormatContext *s)
for (i = 0; i < s->nb_streams; i++) {
AVStream *st = s->streams[i];
+ const AVCodecParameters *const par = st->codecpar;
mkv_track *track = &mkv->tracks[i];
+ switch (par->codec_id) {
+#if CONFIG_MATROSKA_MUXER
+ case AV_CODEC_ID_WAVPACK:
+ track->reformat = mkv_reformat_wavpack;
+ break;
+#endif
+ }
+
if (s->flags & AVFMT_FLAG_BITEXACT) {
track->uid = i + 1;
} else {