From 04ea5491a83e7d123faae5f9aff054838d95bbcb Mon Sep 17 00:00:00 2001 From: Mathias Rauen Date: Sat, 5 Jan 2013 11:30:31 -0500 Subject: [PATCH 1/3] ac3dec: fix non-optimal dithering of zero bit mantissas Use a noise range of -0.707 to 0.707 instead of -0.5 to 0.5 Signed-off-by: Justin Ruggles --- libavcodec/ac3dec.c | 3 ++- tests/fate/ac3.mak | 26 +++++++++++++------------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c index 3c5147229f..82ae61857d 100644 --- a/libavcodec/ac3dec.c +++ b/libavcodec/ac3dec.c @@ -442,8 +442,9 @@ static void ac3_decode_transform_coeffs_ch(AC3DecodeContext *s, int ch_index, ma int mantissa; switch (bap) { case 0: + /* random noise with approximate range of -0.707 to 0.707 */ if (dither) - mantissa = (av_lfg_get(&s->dith_state) & 0x7FFFFF) - 0x400000; + mantissa = (av_lfg_get(&s->dith_state) / 362) - 5932275; else mantissa = 0; break; diff --git a/tests/fate/ac3.mak b/tests/fate/ac3.mak index 46e7a38645..246dd7ce46 100644 --- a/tests/fate/ac3.mak +++ b/tests/fate/ac3.mak @@ -1,46 +1,46 @@ FATE_AC3 += fate-ac3-2.0 fate-ac3-2.0: CMD = pcm -i $(SAMPLES)/ac3/monsters_inc_2.0_192_small.ac3 -fate-ac3-2.0: REF = $(SAMPLES)/ac3/monsters_inc_2.0_192_small.pcm +fate-ac3-2.0: REF = $(SAMPLES)/ac3/monsters_inc_2.0_192_small_v2.pcm FATE_AC3 += fate-ac3-4.0 fate-ac3-4.0: CMD = pcm -i $(SAMPLES)/ac3/millers_crossing_4.0.ac3 -fate-ac3-4.0: REF = $(SAMPLES)/ac3/millers_crossing_4.0.pcm +fate-ac3-4.0: REF = $(SAMPLES)/ac3/millers_crossing_4.0_v2.pcm FATE_AC3 += fate-ac3-4.0-downmix-mono fate-ac3-4.0-downmix-mono: CMD = pcm -request_channels 1 -i $(SAMPLES)/ac3/millers_crossing_4.0.ac3 -fate-ac3-4.0-downmix-mono: REF = $(SAMPLES)/ac3/millers_crossing_4.0_mono.pcm +fate-ac3-4.0-downmix-mono: REF = $(SAMPLES)/ac3/millers_crossing_4.0_mono_v2.pcm FATE_AC3 += fate-ac3-4.0-downmix-stereo fate-ac3-4.0-downmix-stereo: CMD = pcm -request_channels 2 -i $(SAMPLES)/ac3/millers_crossing_4.0.ac3 -fate-ac3-4.0-downmix-stereo: REF = $(SAMPLES)/ac3/millers_crossing_4.0_stereo.pcm +fate-ac3-4.0-downmix-stereo: REF = $(SAMPLES)/ac3/millers_crossing_4.0_stereo_v2.pcm FATE_AC3 += fate-ac3-5.1 fate-ac3-5.1: CMD = pcm -i $(SAMPLES)/ac3/monsters_inc_5.1_448_small.ac3 -fate-ac3-5.1: REF = $(SAMPLES)/ac3/monsters_inc_5.1_448_small.pcm +fate-ac3-5.1: REF = $(SAMPLES)/ac3/monsters_inc_5.1_448_small_v2.pcm FATE_AC3 += fate-ac3-5.1-downmix-mono fate-ac3-5.1-downmix-mono: CMD = pcm -request_channels 1 -i $(SAMPLES)/ac3/monsters_inc_5.1_448_small.ac3 -fate-ac3-5.1-downmix-mono: REF = $(SAMPLES)/ac3/monsters_inc_5.1_448_small_mono.pcm +fate-ac3-5.1-downmix-mono: REF = $(SAMPLES)/ac3/monsters_inc_5.1_448_small_mono_v2.pcm FATE_AC3 += fate-ac3-5.1-downmix-stereo fate-ac3-5.1-downmix-stereo: CMD = pcm -request_channels 2 -i $(SAMPLES)/ac3/monsters_inc_5.1_448_small.ac3 -fate-ac3-5.1-downmix-stereo: REF = $(SAMPLES)/ac3/monsters_inc_5.1_448_small_stereo.pcm +fate-ac3-5.1-downmix-stereo: REF = $(SAMPLES)/ac3/monsters_inc_5.1_448_small_stereo_v2.pcm FATE_EAC3 += fate-eac3-1 fate-eac3-1: CMD = pcm -i $(SAMPLES)/eac3/csi_miami_5.1_256_spx_small.eac3 -fate-eac3-1: REF = $(SAMPLES)/eac3/csi_miami_5.1_256_spx_small.pcm +fate-eac3-1: REF = $(SAMPLES)/eac3/csi_miami_5.1_256_spx_small_v2.pcm FATE_EAC3 += fate-eac3-2 fate-eac3-2: CMD = pcm -i $(SAMPLES)/eac3/csi_miami_stereo_128_spx_small.eac3 -fate-eac3-2: REF = $(SAMPLES)/eac3/csi_miami_stereo_128_spx_small.pcm +fate-eac3-2: REF = $(SAMPLES)/eac3/csi_miami_stereo_128_spx_small_v2.pcm FATE_EAC3 += fate-eac3-3 fate-eac3-3: CMD = pcm -i $(SAMPLES)/eac3/matrix2_commentary1_stereo_192_small.eac3 -fate-eac3-3: REF = $(SAMPLES)/eac3/matrix2_commentary1_stereo_192_small.pcm +fate-eac3-3: REF = $(SAMPLES)/eac3/matrix2_commentary1_stereo_192_small_v2.pcm FATE_EAC3 += fate-eac3-4 fate-eac3-4: CMD = pcm -i $(SAMPLES)/eac3/serenity_english_5.1_1536_small.eac3 -fate-eac3-4: REF = $(SAMPLES)/eac3/serenity_english_5.1_1536_small.pcm +fate-eac3-4: REF = $(SAMPLES)/eac3/serenity_english_5.1_1536_small_v2.pcm $(FATE_AC3) $(FATE_EAC3): CMP = oneoff @@ -50,14 +50,14 @@ FATE_EAC3-$(call DEMDEC, EAC3, EAC3) += $(FATE_EAC3) FATE_AC3-$(call ENCDEC, AC3, AC3) += fate-ac3-encode fate-ac3-encode: CMD = enc_dec_pcm ac3 wav s16le $(REF) -c:a ac3 -b:a 128k fate-ac3-encode: CMP_SHIFT = -1024 -fate-ac3-encode: CMP_TARGET = 399.62 +fate-ac3-encode: CMP_TARGET = 404.53 fate-ac3-encode: SIZE_TOLERANCE = 488 fate-ac3-encode: FUZZ = 3 FATE_EAC3-$(call ENCDEC, EAC3, EAC3) += fate-eac3-encode fate-eac3-encode: CMD = enc_dec_pcm eac3 wav s16le $(REF) -c:a eac3 -b:a 128k fate-eac3-encode: CMP_SHIFT = -1024 -fate-eac3-encode: CMP_TARGET = 514.02 +fate-eac3-encode: CMP_TARGET = 516.94 fate-eac3-encode: SIZE_TOLERANCE = 488 fate-eac3-encode: FUZZ = 3 From a76bc3bc44e3bcd6a0923e65cd669e71e9819388 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Sun, 20 Jan 2013 18:31:57 +0200 Subject: [PATCH 2/3] rtpdec: Check the return value from av_new_packet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavformat/rtpdec.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c index 4379e6f4f1..a8188878eb 100644 --- a/libavformat/rtpdec.c +++ b/libavformat/rtpdec.c @@ -635,7 +635,8 @@ static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt, } else if (st) { /* At this point, the RTP header has been stripped; * This is ASSUMING that there is only 1 CSRC, which isn't wise. */ - av_new_packet(pkt, len); + if ((rv = av_new_packet(pkt, len)) < 0) + return rv; memcpy(pkt->data, buf, len); pkt->stream_index = st->index; } else { From f53490cc0c809975f8238d5a9edbd26f83bd2f84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Sun, 20 Jan 2013 19:00:18 +0200 Subject: [PATCH 3/3] rtpdec/srtp: Handle CSRC fields being present MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is untested in practice, but follows the spec. Signed-off-by: Martin Storsjö --- libavformat/rtpdec.c | 10 +++++++--- libavformat/srtp.c | 15 ++++++++++++++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c index a8188878eb..145d7c82e9 100644 --- a/libavformat/rtpdec.c +++ b/libavformat/rtpdec.c @@ -575,11 +575,12 @@ static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt, { unsigned int ssrc; int payload_type, seq, flags = 0; - int ext; + int ext, csrc; AVStream *st; uint32_t timestamp; int rv = 0; + csrc = buf[0] & 0x0f; ext = buf[0] & 0x10; payload_type = buf[1] & 0x7f; if (buf[1] & 0x80) @@ -613,6 +614,11 @@ static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt, len -= 12; buf += 12; + len -= 4 * csrc; + buf += 4 * csrc; + if (len < 0) + return AVERROR_INVALIDDATA; + /* RFC 3550 Section 5.3.1 RTP Header Extension handling */ if (ext) { if (len < 4) @@ -633,8 +639,6 @@ static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt, s->st, pkt, ×tamp, buf, len, seq, flags); } else if (st) { - /* At this point, the RTP header has been stripped; - * This is ASSUMING that there is only 1 CSRC, which isn't wise. */ if ((rv = av_new_packet(pkt, len)) < 0) return rv; memcpy(pkt->data, buf, len); diff --git a/libavformat/srtp.c b/libavformat/srtp.c index ebc5c98fd7..21dafc2c4c 100644 --- a/libavformat/srtp.c +++ b/libavformat/srtp.c @@ -190,16 +190,23 @@ int ff_srtp_decrypt(struct SRTPContext *s, uint8_t *buf, int *lenptr) if (!(srtcp_index & 0x80000000)) return 0; } else { + int csrc; s->seq_initialized = 1; s->seq_largest = seq_largest; s->roc = roc; + csrc = buf[0] & 0x0f; ext = buf[0] & 0x10; ssrc = AV_RB32(buf + 8); buf += 12; len -= 12; + buf += 4 * csrc; + len -= 4 * csrc; + if (len < 0) + return AVERROR_INVALIDDATA; + if (ext) { if (len < 4) return AVERROR_INVALIDDATA; @@ -244,7 +251,7 @@ int ff_srtp_encrypt(struct SRTPContext *s, const uint8_t *in, int len, buf += 8; len -= 8; } else { - int ext; + int ext, csrc; int seq = AV_RB16(buf + 2); ssrc = AV_RB32(buf + 8); @@ -253,11 +260,17 @@ int ff_srtp_encrypt(struct SRTPContext *s, const uint8_t *in, int len, s->seq_largest = seq; index = seq + (((uint64_t)s->roc) << 16); + csrc = buf[0] & 0x0f; ext = buf[0] & 0x10; buf += 12; len -= 12; + buf += 4 * csrc; + len -= 4 * csrc; + if (len < 0) + return AVERROR_INVALIDDATA; + if (ext) { if (len < 4) return AVERROR_INVALIDDATA;