summaryrefslogtreecommitdiff
path: root/libavcodec/svq1dec.c
diff options
context:
space:
mode:
Diffstat (limited to 'libavcodec/svq1dec.c')
-rw-r--r--libavcodec/svq1dec.c74
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, &current[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, &current[x],
previous, linesize,
pmv, x, y);
- if (result != 0) {
+ if (result) {
av_dlog(s->avctx,
"Error in svq1_decode_delta_block %i\n",
result);