From 9ab0874ea8b6774c6f5470dba2b5b4615a610d0d Mon Sep 17 00:00:00 2001 From: Luca Barbato Date: Mon, 22 Oct 2012 19:11:05 +0200 Subject: [PATCH 1/6] mp3: properly forward mp_decode_frame errors The function can return either a parsing error or a memory management error. --- libavcodec/mpegaudiodec.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/libavcodec/mpegaudiodec.c b/libavcodec/mpegaudiodec.c index 169254f5d7..52abcb2906 100644 --- a/libavcodec/mpegaudiodec.c +++ b/libavcodec/mpegaudiodec.c @@ -1636,7 +1636,7 @@ static int decode_frame(AVCodecContext * avctx, void *data, int *got_frame_ptr, int buf_size = avpkt->size; MPADecodeContext *s = avctx->priv_data; uint32_t header; - int out_size; + int ret; if (buf_size < HEADER_SIZE) return AVERROR_INVALIDDATA; @@ -1665,21 +1665,22 @@ static int decode_frame(AVCodecContext * avctx, void *data, int *got_frame_ptr, buf_size= s->frame_size; } - out_size = mp_decode_frame(s, NULL, buf, buf_size); - if (out_size >= 0) { + ret = mp_decode_frame(s, NULL, buf, buf_size); + if (ret >= 0) { *got_frame_ptr = 1; *(AVFrame *)data = s->frame; avctx->sample_rate = s->sample_rate; //FIXME maybe move the other codec info stuff from above here too } else { av_log(avctx, AV_LOG_ERROR, "Error while decoding MPEG audio frame.\n"); - /* Only return an error if the bad frame makes up the whole packet. - If there is more data in the packet, just consume the bad frame - instead of returning an error, which would discard the whole - packet. */ + /* Only return an error if the bad frame makes up the whole packet or + * the error is related to buffer management. + * If there is more data in the packet, just consume the bad frame + * instead of returning an error, which would discard the whole + * packet. */ *got_frame_ptr = 0; - if (buf_size == avpkt->size) - return out_size; + if (buf_size == avpkt->size || ret != AVERROR_INVALIDDATA) + return ret; } s->frame_size = 0; return buf_size; @@ -1704,7 +1705,7 @@ static int decode_frame_adu(AVCodecContext *avctx, void *data, int buf_size = avpkt->size; MPADecodeContext *s = avctx->priv_data; uint32_t header; - int len, out_size; + int len, ret; len = buf_size; @@ -1735,10 +1736,10 @@ static int decode_frame_adu(AVCodecContext *avctx, void *data, s->frame_size = len; - out_size = mp_decode_frame(s, NULL, buf, buf_size); - if (out_size < 0) { + ret = mp_decode_frame(s, NULL, buf, buf_size); + if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "Error while decoding MPEG audio frame.\n"); - return AVERROR_INVALIDDATA; + return ret; } *got_frame_ptr = 1; @@ -1943,7 +1944,10 @@ static int decode_frame_mp3on4(AVCodecContext *avctx, void *data, } ch += m->nb_channels; - out_size += mp_decode_frame(m, outptr, buf, fsize); + if ((ret = mp_decode_frame(m, outptr, buf, fsize)) < 0) + return ret; + + out_size += ret; buf += fsize; len -= fsize; From aa91fe80913ff8e84d2264f65b87af57519ce0ff Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Tue, 23 Oct 2012 13:03:10 +0200 Subject: [PATCH 2/6] dxtory: Replace AV_WN16A(AV_RN16A()) combination by AV_COPY16 --- libavcodec/dxtory.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavcodec/dxtory.c b/libavcodec/dxtory.c index f741078092..da43c47003 100644 --- a/libavcodec/dxtory.c +++ b/libavcodec/dxtory.c @@ -70,8 +70,8 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, V = pic->data[2]; for (h = 0; h < avctx->height; h += 2) { for (w = 0; w < avctx->width; w += 2) { - AV_WN16A(Y1 + w, AV_RN16A(src)); - AV_WN16A(Y2 + w, AV_RN16A(src + 2)); + AV_COPY16(Y1 + w, src); + AV_COPY16(Y2 + w, src + 2); U[w >> 1] = src[4] + 0x80; V[w >> 1] = src[5] + 0x80; src += 6; From af6dd6de08d91e12efb0c805bb9eca4d48d73a86 Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Tue, 23 Oct 2012 13:27:05 +0200 Subject: [PATCH 3/6] intreadwrite: Add AV_COPYxxU macros for copying to/from unaligned addresses --- libavutil/intreadwrite.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/libavutil/intreadwrite.h b/libavutil/intreadwrite.h index 01eb27804a..f77fd60f38 100644 --- a/libavutil/intreadwrite.h +++ b/libavutil/intreadwrite.h @@ -462,6 +462,33 @@ union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias; # define AV_WN64A(p, v) AV_WNA(64, p, v) #endif +/* + * The AV_COPYxxU macros are suitable for copying data to/from unaligned + * memory locations. + */ + +#define AV_COPYU(n, d, s) AV_WN##n(d, AV_RN##n(s)); + +#ifndef AV_COPY16U +# define AV_COPY16U(d, s) AV_COPYU(16, d, s) +#endif + +#ifndef AV_COPY32U +# define AV_COPY32U(d, s) AV_COPYU(32, d, s) +#endif + +#ifndef AV_COPY64U +# define AV_COPY64U(d, s) AV_COPYU(64, d, s) +#endif + +#ifndef AV_COPY128U +# define AV_COPY128U(d, s) \ + do { \ + AV_COPY64U(d, s); \ + AV_COPY64U((char *)(d) + 8, (const char *)(s) + 8); \ + } while(0) +#endif + /* Parameters for AV_COPY*, AV_SWAP*, AV_ZERO* must be * naturally aligned. They may be implemented using MMX, * so emms_c() must be called before using any float code From 330b864cda9518a3b4eb7772affe49fec0af6dd0 Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Tue, 23 Oct 2012 14:37:16 +0200 Subject: [PATCH 4/6] dsputil: Replace AV_WNxx(AV_RNxx()) combinations by AV_COPYxxU --- libavcodec/dsputil.h | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/libavcodec/dsputil.h b/libavcodec/dsputil.h index 7fdbf6f4d0..e38f7a744c 100644 --- a/libavcodec/dsputil.h +++ b/libavcodec/dsputil.h @@ -662,7 +662,7 @@ static inline void copy_block2(uint8_t *dst, const uint8_t *src, int dstStride, int i; for(i=0; i Date: Tue, 23 Oct 2012 18:30:36 +0200 Subject: [PATCH 5/6] prepare 9_beta2 release --- RELEASE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASE b/RELEASE index 437fe58a9e..aecf8016c7 100644 --- a/RELEASE +++ b/RELEASE @@ -1 +1 @@ -9_beta1 +9_beta2 From ceb754d041f5f6327fd9195a5f43575af9516daa Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Mon, 22 Oct 2012 19:02:20 +0200 Subject: [PATCH 6/6] lzo: Use AV_COPY*U macros where appropriate --- libavutil/lzo.c | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/libavutil/lzo.c b/libavutil/lzo.c index 0d1ec55e91..101d4f462e 100644 --- a/libavutil/lzo.c +++ b/libavutil/lzo.c @@ -23,6 +23,7 @@ #include "avutil.h" #include "common.h" +#include "intreadwrite.h" #include "lzo.h" /// Define if we may write up to 12 bytes beyond the output buffer. @@ -71,19 +72,6 @@ static inline int get_len(LZOContext *c, int x, int mask) return cnt; } -//#define UNALIGNED_LOADSTORE -#define BUILTIN_MEMCPY -#ifdef UNALIGNED_LOADSTORE -#define COPY2(d, s) *(uint16_t *)(d) = *(uint16_t *)(s); -#define COPY4(d, s) *(uint32_t *)(d) = *(uint32_t *)(s); -#elif defined(BUILTIN_MEMCPY) -#define COPY2(d, s) memcpy(d, s, 2); -#define COPY4(d, s) memcpy(d, s, 4); -#else -#define COPY2(d, s) (d)[0] = (s)[0]; (d)[1] = (s)[1]; -#define COPY4(d, s) (d)[0] = (s)[0]; (d)[1] = (s)[1]; (d)[2] = (s)[2]; (d)[3] = (s)[3]; -#endif - /** * @brief Copies bytes from input to output buffer with checking. * @param cnt number of bytes to copy, must be >= 0 @@ -101,7 +89,7 @@ static inline void copy(LZOContext *c, int cnt) c->error |= AV_LZO_OUTPUT_FULL; } #if defined(INBUF_PADDED) && defined(OUTBUF_PADDED) - COPY4(dst, src); + AV_COPY32U(dst, src); src += 4; dst += 4; cnt -= 4; @@ -145,16 +133,16 @@ static inline void memcpy_backptr(uint8_t *dst, int back, int cnt) memset(dst, *src, cnt); } else { #ifdef OUTBUF_PADDED - COPY2(dst, src); - COPY2(dst + 2, src + 2); + AV_COPY16U(dst, src); + AV_COPY16U(dst + 2, src + 2); src += 4; dst += 4; cnt -= 4; if (cnt > 0) { - COPY2(dst, src); - COPY2(dst + 2, src + 2); - COPY2(dst + 4, src + 4); - COPY2(dst + 6, src + 6); + AV_COPY16U(dst, src); + AV_COPY16U(dst + 2, src + 2); + AV_COPY16U(dst + 4, src + 4); + AV_COPY16U(dst + 6, src + 6); src += 8; dst += 8; cnt -= 8;