Commit acc0c019 authored by Michael Niedermayer's avatar Michael Niedermayer

Merge commit 'f53490cc'

* commit 'f53490cc':
  rtpdec/srtp: Handle CSRC fields being present
  rtpdec: Check the return value from av_new_packet
  ac3dec: fix non-optimal dithering of zero bit mantissas

Conflicts:
	libavcodec/ac3dec.c
	libavformat/rtpdec.c
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents fbdb0313 f53490cc
...@@ -442,6 +442,7 @@ static void ac3_decode_transform_coeffs_ch(AC3DecodeContext *s, int ch_index, ma ...@@ -442,6 +442,7 @@ static void ac3_decode_transform_coeffs_ch(AC3DecodeContext *s, int ch_index, ma
int mantissa; int mantissa;
switch (bap) { switch (bap) {
case 0: case 0:
/* random noise with approximate range of -0.707 to 0.707 */
if (dither) if (dither)
mantissa = (((av_lfg_get(&s->dith_state)>>8)*181)>>8) - 5931008; mantissa = (((av_lfg_get(&s->dith_state)>>8)*181)>>8) - 5931008;
else else
......
...@@ -575,12 +575,12 @@ static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt, ...@@ -575,12 +575,12 @@ static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt,
{ {
unsigned int ssrc; unsigned int ssrc;
int payload_type, seq, flags = 0; int payload_type, seq, flags = 0;
int ext; int ext, csrc;
AVStream *st; AVStream *st;
uint32_t timestamp; uint32_t timestamp;
int rv = 0; int rv = 0;
int h;
csrc = buf[0] & 0x0f;
ext = buf[0] & 0x10; ext = buf[0] & 0x10;
payload_type = buf[1] & 0x7f; payload_type = buf[1] & 0x7f;
if (buf[1] & 0x80) if (buf[1] & 0x80)
...@@ -610,14 +610,15 @@ static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt, ...@@ -610,14 +610,15 @@ static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt,
len -= padding; len -= padding;
} }
h = buf[0] & 0x0F;
buf += 4*h;
len -= 4*h;
s->seq = seq; s->seq = seq;
len -= 12; len -= 12;
buf += 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 */ /* RFC 3550 Section 5.3.1 RTP Header Extension handling */
if (ext) { if (ext) {
if (len < 4) if (len < 4)
...@@ -638,10 +639,8 @@ static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt, ...@@ -638,10 +639,8 @@ static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt,
s->st, pkt, &timestamp, buf, len, seq, s->st, pkt, &timestamp, buf, len, seq,
flags); flags);
} else if (st) { } else if (st) {
/* At this point, the RTP header has been stripped; if ((rv = av_new_packet(pkt, len)) < 0)
* This is ASSUMING that there is only 1 CSRC, which isn't wise. */ return rv;
if (av_new_packet(pkt, len) < 0)
return AVERROR(ENOMEM);
memcpy(pkt->data, buf, len); memcpy(pkt->data, buf, len);
pkt->stream_index = st->index; pkt->stream_index = st->index;
} else { } else {
......
...@@ -190,16 +190,23 @@ int ff_srtp_decrypt(struct SRTPContext *s, uint8_t *buf, int *lenptr) ...@@ -190,16 +190,23 @@ int ff_srtp_decrypt(struct SRTPContext *s, uint8_t *buf, int *lenptr)
if (!(srtcp_index & 0x80000000)) if (!(srtcp_index & 0x80000000))
return 0; return 0;
} else { } else {
int csrc;
s->seq_initialized = 1; s->seq_initialized = 1;
s->seq_largest = seq_largest; s->seq_largest = seq_largest;
s->roc = roc; s->roc = roc;
csrc = buf[0] & 0x0f;
ext = buf[0] & 0x10; ext = buf[0] & 0x10;
ssrc = AV_RB32(buf + 8); ssrc = AV_RB32(buf + 8);
buf += 12; buf += 12;
len -= 12; len -= 12;
buf += 4 * csrc;
len -= 4 * csrc;
if (len < 0)
return AVERROR_INVALIDDATA;
if (ext) { if (ext) {
if (len < 4) if (len < 4)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
...@@ -244,7 +251,7 @@ int ff_srtp_encrypt(struct SRTPContext *s, const uint8_t *in, int len, ...@@ -244,7 +251,7 @@ int ff_srtp_encrypt(struct SRTPContext *s, const uint8_t *in, int len,
buf += 8; buf += 8;
len -= 8; len -= 8;
} else { } else {
int ext; int ext, csrc;
int seq = AV_RB16(buf + 2); int seq = AV_RB16(buf + 2);
ssrc = AV_RB32(buf + 8); ssrc = AV_RB32(buf + 8);
...@@ -253,11 +260,17 @@ int ff_srtp_encrypt(struct SRTPContext *s, const uint8_t *in, int len, ...@@ -253,11 +260,17 @@ int ff_srtp_encrypt(struct SRTPContext *s, const uint8_t *in, int len,
s->seq_largest = seq; s->seq_largest = seq;
index = seq + (((uint64_t)s->roc) << 16); index = seq + (((uint64_t)s->roc) << 16);
csrc = buf[0] & 0x0f;
ext = buf[0] & 0x10; ext = buf[0] & 0x10;
buf += 12; buf += 12;
len -= 12; len -= 12;
buf += 4 * csrc;
len -= 4 * csrc;
if (len < 0)
return AVERROR_INVALIDDATA;
if (ext) { if (ext) {
if (len < 4) if (len < 4)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment