diff options
Diffstat (limited to 'libavcodec/svq1dec.c')
-rw-r--r-- | libavcodec/svq1dec.c | 74 |
1 files changed, 34 insertions, 40 deletions
diff --git a/libavcodec/svq1dec.c b/libavcodec/svq1dec.c index 6e096f3f43..9b782752c5 100644 --- a/libavcodec/svq1dec.c +++ b/libavcodec/svq1dec.c @@ -8,20 +8,20 @@ * * SVQ1 Encoder (c) 2004 Mike Melanson <melanson@pcisys.net> * - * This file is part of Libav. + * This file is part of FFmpeg. * - * Libav is free software; you can redistribute it and/or + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * Libav is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with Libav; if not, write to the Free Software + * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -100,12 +100,11 @@ static const uint8_t string_table[256] = { break; \ } \ /* divide block if next bit set */ \ - if (get_bits1(bitbuf) == 0) \ + if (!get_bits1(bitbuf)) \ break; \ /* add child nodes */ \ list[n++] = list[i]; \ - list[n++] = list[i] + \ - (((level & 1) ? pitch : 1) << (level / 2 + 1)); \ + list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level >> 1) + 1));\ } #define SVQ1_ADD_CODEBOOK() \ @@ -167,7 +166,7 @@ static const uint8_t string_table[256] = { 16 * j) << (level + 1); \ } \ mean -= stages * 128; \ - n4 = mean + (mean >> 31) << 16 | (mean & 0xFFFF); + n4 = (mean << 16) + mean; static int svq1_decode_block_intra(GetBitContext *bitbuf, uint8_t *pixels, int pitch) @@ -207,7 +206,7 @@ static int svq1_decode_block_intra(GetBitContext *bitbuf, uint8_t *pixels, av_dlog(NULL, "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n", stages, level); - return -1; /* invalid vector */ + return AVERROR_INVALIDDATA; /* invalid vector */ } mean = get_vlc2(bitbuf, svq1_intra_mean.table, 8, 3); @@ -259,7 +258,7 @@ static int svq1_decode_block_non_intra(GetBitContext *bitbuf, uint8_t *pixels, av_dlog(NULL, "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n", stages, level); - return -1; /* invalid vector */ + return AVERROR_INVALIDDATA; /* invalid vector */ } mean = get_vlc2(bitbuf, svq1_inter_mean.table, 9, 3) - 256; @@ -280,7 +279,7 @@ static int svq1_decode_motion_vector(GetBitContext *bitbuf, svq1_pmv *mv, /* get motion code */ diff = get_vlc2(bitbuf, svq1_motion_component.table, 7, 2); if (diff < 0) - return -1; + return AVERROR_INVALIDDATA; else if (diff) { if (get_bits1(bitbuf)) diff = -diff; @@ -334,8 +333,7 @@ static int svq1_motion_inter_block(MpegEncContext *s, GetBitContext *bitbuf, } result = svq1_decode_motion_vector(bitbuf, &mv, pmv); - - if (result != 0) + if (result) return result; motion[0].x = @@ -379,8 +377,7 @@ static int svq1_motion_inter_4v_block(MpegEncContext *s, GetBitContext *bitbuf, } result = svq1_decode_motion_vector(bitbuf, &mv, pmv); - - if (result != 0) + if (result) return result; /* predict and decode motion vector (1) */ @@ -392,8 +389,7 @@ static int svq1_motion_inter_4v_block(MpegEncContext *s, GetBitContext *bitbuf, pmv[1] = &motion[(x / 8) + 3]; } result = svq1_decode_motion_vector(bitbuf, &motion[0], pmv); - - if (result != 0) + if (result) return result; /* predict and decode motion vector (2) */ @@ -401,8 +397,7 @@ static int svq1_motion_inter_4v_block(MpegEncContext *s, GetBitContext *bitbuf, pmv[2] = &motion[(x / 8) + 1]; result = svq1_decode_motion_vector(bitbuf, &motion[(x / 8) + 2], pmv); - - if (result != 0) + if (result) return result; /* predict and decode motion vector (3) */ @@ -410,8 +405,7 @@ static int svq1_motion_inter_4v_block(MpegEncContext *s, GetBitContext *bitbuf, pmv[3] = &motion[(x / 8) + 3]; result = svq1_decode_motion_vector(bitbuf, pmv[3], pmv); - - if (result != 0) + if (result) return result; /* form predictions */ @@ -468,8 +462,7 @@ static int svq1_decode_delta_block(MpegEncContext *s, GetBitContext *bitbuf, case SVQ1_BLOCK_INTER: result = svq1_motion_inter_block(s, bitbuf, current, previous, pitch, motion, x, y); - - if (result != 0) { + if (result) { av_dlog(s->avctx, "Error in svq1_motion_inter_block %i\n", result); break; } @@ -479,8 +472,7 @@ static int svq1_decode_delta_block(MpegEncContext *s, GetBitContext *bitbuf, case SVQ1_BLOCK_INTER_4V: result = svq1_motion_inter_4v_block(s, bitbuf, current, previous, pitch, motion, x, y); - - if (result != 0) { + if (result) { av_dlog(s->avctx, "Error in svq1_motion_inter_4v_block %i\n", result); break; @@ -519,7 +511,7 @@ static int svq1_decode_frame_header(GetBitContext *bitbuf, MpegEncContext *s) /* frame type */ s->pict_type = get_bits(bitbuf, 2) + 1; if (s->pict_type == 4) - return -1; + return AVERROR_INVALIDDATA; if (s->pict_type == AV_PICTURE_TYPE_I) { /* unknown fields */ @@ -556,7 +548,7 @@ static int svq1_decode_frame_header(GetBitContext *bitbuf, MpegEncContext *s) s->height = get_bits(bitbuf, 12); if (!s->width || !s->height) - return -1; + return AVERROR_INVALIDDATA; } else { /* get width, height from table */ s->width = ff_svq1_frame_size_table[frame_size_code].width; @@ -565,21 +557,21 @@ static int svq1_decode_frame_header(GetBitContext *bitbuf, MpegEncContext *s) } /* unknown fields */ - if (get_bits1(bitbuf) == 1) { + if (get_bits1(bitbuf)) { skip_bits1(bitbuf); /* use packet checksum if (1) */ skip_bits1(bitbuf); /* component checksums after image data if (1) */ if (get_bits(bitbuf, 2) != 0) - return -1; + return AVERROR_INVALIDDATA; } - if (get_bits1(bitbuf) == 1) { + if (get_bits1(bitbuf)) { skip_bits1(bitbuf); skip_bits(bitbuf, 4); skip_bits1(bitbuf); skip_bits(bitbuf, 2); - while (get_bits1(bitbuf) == 1) + while (get_bits1(bitbuf)) skip_bits(bitbuf, 8); } @@ -604,19 +596,21 @@ static int svq1_decode_frame(AVCodecContext *avctx, void *data, s->f_code = get_bits(&s->gb, 22); if ((s->f_code & ~0x70) || !(s->f_code & 0x60)) - return -1; + return AVERROR_INVALIDDATA; /* swap some header bytes (why?) */ if (s->f_code != 0x20) { uint32_t *src = (uint32_t *)(buf + 4); + if (buf_size < 36) + return AVERROR_INVALIDDATA; + for (i = 0; i < 4; i++) src[i] = ((src[i] << 16) | (src[i] >> 16)) ^ src[7 - i]; } result = svq1_decode_frame_header(&s->gb, s); - - if (result != 0) { + if (result) { av_dlog(s->avctx, "Error in svq1_decode_frame_header %i\n", result); return result; } @@ -635,12 +629,12 @@ static int svq1_decode_frame(AVCodecContext *avctx, void *data, avctx->skip_frame >= AVDISCARD_ALL) return buf_size; - if (ff_MPV_frame_start(s, avctx) < 0) - return -1; + if ((result = ff_MPV_frame_start(s, avctx)) < 0) + return result; pmv = av_malloc((FFALIGN(s->width, 16) / 8 + 3) * sizeof(*pmv)); if (!pmv) - return -1; + return AVERROR(ENOMEM); /* decode y, u and v components */ for (i = 0; i < 3; i++) { @@ -670,8 +664,8 @@ static int svq1_decode_frame(AVCodecContext *avctx, void *data, for (x = 0; x < width; x += 16) { result = svq1_decode_block_intra(&s->gb, ¤t[x], linesize); - if (result != 0) { - av_log(s->avctx, AV_LOG_INFO, + if (result) { + av_log(s->avctx, AV_LOG_ERROR, "Error in svq1_decode_block %i (keyframe)\n", result); goto err; @@ -688,7 +682,7 @@ static int svq1_decode_frame(AVCodecContext *avctx, void *data, result = svq1_decode_delta_block(s, &s->gb, ¤t[x], previous, linesize, pmv, x, y); - if (result != 0) { + if (result) { av_dlog(s->avctx, "Error in svq1_decode_delta_block %i\n", result); |