mkvmerge versions 6.2 to 40.0 had a bug that made it not propagate the WavPack extradata (containing the WavPack version) during remuxing from a Matroska file; currently our demuxer would treat every WavPack block encountered as invalid data (unless the WavPack stream is to be discarded (i.e. the streams discard is >= AVDISCARD_ALL)) and try to resync to the next level 1 element. Luckily, the WavPack version is currently not really important; so we fix this problem by assuming a version. David Bryant, the creator of WavPack, recommended using version 0x410 (the most recent version) for this. And this is what this commit does. A FATE-test for this has been added.
Showing the changes to libavformat (1 of 3 files). Show all
Unified · Split
| @@ -2613,6 +2613,14 @@ static int matroska_parse_tracks(AVFormatContext *s) · 2612 unmodified lines | |||
| 2613 | ret = matroska_parse_flac(s, track, &extradata_offset); | 2613 | ret = matroska_parse_flac(s, track, &extradata_offset); |
| 2614 | if (ret < 0) | 2614 | if (ret < 0) |
| 2615 | return ret; | 2615 | return ret; |
| 2616 | } else if (codec_id == AV_CODEC_ID_WAVPACK && track->codec_priv.size < 2) { | ||
| 2617 | av_log(matroska->ctx, AV_LOG_INFO, "Assuming WavPack version 4.10 " | ||
| 2618 | "in absence of valid CodecPrivate.\n"); | ||
| 2619 | extradata_size = 2; | ||
| 2620 | extradata = av_mallocz(2 + AV_INPUT_BUFFER_PADDING_SIZE); | ||
| 2621 | if (!extradata) | ||
| 2622 | return AVERROR(ENOMEM); | ||
| 2623 | AV_WL16(extradata, 0x410); | ||
| 2616 | } else if (codec_id == AV_CODEC_ID_PRORES && track->codec_priv.size == 4) { | 2624 | } else if (codec_id == AV_CODEC_ID_PRORES && track->codec_priv.size == 4) { |
| 2617 | fourcc = AV_RL32(track->codec_priv.data); | 2625 | fourcc = AV_RL32(track->codec_priv.data); |
| 2618 | } else if (codec_id == AV_CODEC_ID_VP9 && track->codec_priv.size) { | 2626 | } else if (codec_id == AV_CODEC_ID_VP9 && track->codec_priv.size) { |
| @@ -3165,9 +3173,10 @@ static int matroska_parse_wavpack(MatroskaTrack *track, uint8_t *src, · 546 unmodified lines | |||
| 3165 | uint16_t ver; | 3173 | uint16_t ver; |
| 3166 | int ret, offset = 0; | 3174 | int ret, offset = 0; |
| 3167 | 3175 | ||
| 3168 | if (srclen < 12 || track->stream->codecpar->extradata_size < 2) | 3176 | if (srclen < 12) |
| 3169 | return AVERROR_INVALIDDATA; | 3177 | return AVERROR_INVALIDDATA; |
| 3170 | 3178 | ||
| 3179 | av_assert1(track->stream->codecpar->extradata_size >= 2); | ||
| 3171 | ver = AV_RL16(track->stream->codecpar->extradata); | 3180 | ver = AV_RL16(track->stream->codecpar->extradata); |
| 3172 | 3181 | ||
| 3173 | samples = AV_RL32(src); | 3182 | samples = AV_RL32(src); |