diff options
Diffstat (limited to 'libavcodec/svq1dec.c')
-rw-r--r-- | libavcodec/svq1dec.c | 80 |
1 files changed, 40 insertions, 40 deletions
diff --git a/libavcodec/svq1dec.c b/libavcodec/svq1dec.c index 4d03bac21d..5f43a970c4 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 */ @@ -33,8 +33,8 @@ */ #include "avcodec.h" -#include "dsputil.h" #include "get_bits.h" +#include "hpeldsp.h" #include "internal.h" #include "mathops.h" #include "svq1.h" @@ -58,7 +58,7 @@ typedef struct svq1_pmv_s { } svq1_pmv; typedef struct SVQ1Context { - DSPContext dsp; + HpelDSPContext hdsp; GetBitContext gb; AVFrame *prev; int width; @@ -111,12 +111,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() \ @@ -152,7 +151,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) @@ -320,7 +319,7 @@ static void svq1_skip_block(uint8_t *current, uint8_t *previous, } } -static int svq1_motion_inter_block(DSPContext *dsp, GetBitContext *bitbuf, +static int svq1_motion_inter_block(HpelDSPContext *hdsp, GetBitContext *bitbuf, uint8_t *current, uint8_t *previous, int pitch, svq1_pmv *motion, int x, int y, int width, int height) @@ -342,8 +341,7 @@ static int svq1_motion_inter_block(DSPContext *dsp, GetBitContext *bitbuf, } result = svq1_decode_motion_vector(bitbuf, &mv, pmv); - - if (result != 0) + if (result) return result; motion[0].x = @@ -359,12 +357,12 @@ static int svq1_motion_inter_block(DSPContext *dsp, GetBitContext *bitbuf, src = &previous[(x + (mv.x >> 1)) + (y + (mv.y >> 1)) * pitch]; dst = current; - dsp->put_pixels_tab[0][(mv.y & 1) << 1 | (mv.x & 1)](dst, src, pitch, 16); + hdsp->put_pixels_tab[0][(mv.y & 1) << 1 | (mv.x & 1)](dst, src, pitch, 16); return 0; } -static int svq1_motion_inter_4v_block(DSPContext *dsp, GetBitContext *bitbuf, +static int svq1_motion_inter_4v_block(HpelDSPContext *hdsp, GetBitContext *bitbuf, uint8_t *current, uint8_t *previous, int pitch, svq1_pmv *motion, int x, int y, int width, int height) @@ -386,8 +384,7 @@ static int svq1_motion_inter_4v_block(DSPContext *dsp, GetBitContext *bitbuf, } result = svq1_decode_motion_vector(bitbuf, &mv, pmv); - - if (result != 0) + if (result) return result; /* predict and decode motion vector (1) */ @@ -399,8 +396,7 @@ static int svq1_motion_inter_4v_block(DSPContext *dsp, 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) */ @@ -408,8 +404,7 @@ static int svq1_motion_inter_4v_block(DSPContext *dsp, 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) */ @@ -417,8 +412,7 @@ static int svq1_motion_inter_4v_block(DSPContext *dsp, 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 */ @@ -433,7 +427,7 @@ static int svq1_motion_inter_4v_block(DSPContext *dsp, GetBitContext *bitbuf, src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1)) * pitch]; dst = current; - dsp->put_pixels_tab[1][((mvy & 1) << 1) | (mvx & 1)](dst, src, pitch, 8); + hdsp->put_pixels_tab[1][((mvy & 1) << 1) | (mvx & 1)](dst, src, pitch, 8); /* select next block */ if (i & 1) @@ -445,7 +439,7 @@ static int svq1_motion_inter_4v_block(DSPContext *dsp, GetBitContext *bitbuf, return 0; } -static int svq1_decode_delta_block(AVCodecContext *avctx, DSPContext *dsp, +static int svq1_decode_delta_block(AVCodecContext *avctx, HpelDSPContext *hdsp, GetBitContext *bitbuf, uint8_t *current, uint8_t *previous, int pitch, svq1_pmv *motion, int x, int y, @@ -473,7 +467,7 @@ static int svq1_decode_delta_block(AVCodecContext *avctx, DSPContext *dsp, break; case SVQ1_BLOCK_INTER: - result = svq1_motion_inter_block(dsp, bitbuf, current, previous, + result = svq1_motion_inter_block(hdsp, bitbuf, current, previous, pitch, motion, x, y, width, height); if (result != 0) { @@ -484,7 +478,7 @@ static int svq1_decode_delta_block(AVCodecContext *avctx, DSPContext *dsp, break; case SVQ1_BLOCK_INTER_4V: - result = svq1_motion_inter_4v_block(dsp, bitbuf, current, previous, + result = svq1_motion_inter_4v_block(hdsp, bitbuf, current, previous, pitch, motion, x, y, width, height); if (result != 0) { @@ -521,6 +515,8 @@ static int svq1_decode_frame_header(AVCodecContext *avctx, AVFrame *frame) SVQ1Context *s = avctx->priv_data; GetBitContext *bitbuf = &s->gb; int frame_size_code; + int width = s->width; + int height = s->height; skip_bits(bitbuf, 8); /* temporal_reference */ @@ -571,20 +567,20 @@ static int svq1_decode_frame_header(AVCodecContext *avctx, AVFrame *frame) if (frame_size_code == 7) { /* load width, height (12 bits each) */ - s->width = get_bits(bitbuf, 12); - s->height = get_bits(bitbuf, 12); + width = get_bits(bitbuf, 12); + height = get_bits(bitbuf, 12); - if (!s->width || !s->height) + if (!width || !height) return AVERROR_INVALIDDATA; } else { /* get width, height from table */ - s->width = ff_svq1_frame_size_table[frame_size_code][0]; - s->height = ff_svq1_frame_size_table[frame_size_code][1]; + width = ff_svq1_frame_size_table[frame_size_code][0]; + height = ff_svq1_frame_size_table[frame_size_code][1]; } } /* 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) */ @@ -592,16 +588,18 @@ static int svq1_decode_frame_header(AVCodecContext *avctx, AVFrame *frame) 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); } + s->width = width; + s->height = height; return 0; } @@ -629,12 +627,14 @@ static int svq1_decode_frame(AVCodecContext *avctx, void *data, if (s->frame_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(avctx, cur); - if (result != 0) { av_dlog(avctx, "Error in svq1_decode_frame_header %i\n", result); return result; @@ -676,8 +676,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(avctx, AV_LOG_INFO, + if (result) { + av_log(avctx, AV_LOG_ERROR, "Error in svq1_decode_block %i (keyframe)\n", result); goto err; @@ -699,7 +699,7 @@ static int svq1_decode_frame(AVCodecContext *avctx, void *data, for (y = 0; y < height; y += 16) { for (x = 0; x < width; x += 16) { - result = svq1_decode_delta_block(avctx, &s->dsp, + result = svq1_decode_delta_block(avctx, &s->hdsp, &s->gb, ¤t[x], previous, linesize, pmv, x, y, width, height); @@ -748,7 +748,7 @@ static av_cold int svq1_decode_init(AVCodecContext *avctx) s->height = avctx->height + 3 & ~3; avctx->pix_fmt = AV_PIX_FMT_YUV410P; - ff_dsputil_init(&s->dsp, avctx); + ff_hpeldsp_init(&s->hdsp, avctx->flags); INIT_VLC_STATIC(&svq1_block_type, 2, 4, &ff_svq1_block_type_vlc[0][1], 2, 1, |