# HG changeset patch # User benoit # Date 1222785835 0 # Node ID fbe8fabdbc63e0d6eeddc326888e76c4ced46722 # Parent eb16a37644a58a26669e8157e9f3fcee8e53ed60 Move iv_decode_frame function to remove a forward declaration. diff -r eb16a37644a5 -r fbe8fabdbc63 indeo3.c --- a/indeo3.c Tue Sep 30 14:41:11 2008 +0000 +++ b/indeo3.c Tue Sep 30 14:43:55 2008 +0000 @@ -96,11 +96,6 @@ return 0; } -static void iv_Decode_Chunk(Indeo3DecodeContext *s, uint8_t *cur, - uint8_t *ref, int width, int height, const uint8_t *buf1, - long fflags2, const uint8_t *hdr, - const uint8_t *buf2, int min_width_160); - static av_cold int iv_alloc_frames(Indeo3DecodeContext *s) { int luma_width, luma_height, luma_pixels, chroma_width, chroma_height, @@ -158,73 +153,6 @@ av_free(s->corrector_type); } -static unsigned long iv_decode_frame(Indeo3DecodeContext *s, - const uint8_t *buf, int buf_size) -{ - unsigned int hdr_width, hdr_height, - chroma_width, chroma_height; - unsigned long fflags1, fflags2, fflags3, offs1, offs2, offs3, offs; - const uint8_t *hdr_pos, *buf_pos; - - buf_pos = buf; - buf_pos += 18; - - fflags1 = bytestream_get_le16(&buf_pos); - fflags3 = bytestream_get_le32(&buf_pos); - fflags2 = *buf_pos++; - buf_pos += 3; - hdr_height = bytestream_get_le16(&buf_pos); - hdr_width = bytestream_get_le16(&buf_pos); - - if(avcodec_check_dimensions(NULL, hdr_width, hdr_height)) - return -1; - - chroma_height = ((hdr_height >> 2) + 3) & 0x7ffc; - chroma_width = ((hdr_width >> 2) + 3) & 0x7ffc; - offs1 = bytestream_get_le32(&buf_pos); - offs2 = bytestream_get_le32(&buf_pos); - offs3 = bytestream_get_le32(&buf_pos); - buf_pos += 4; - hdr_pos = buf_pos; - if(fflags3 == 0x80) return 4; - - if(fflags1 & 0x200) { - s->cur_frame = s->iv_frame + 1; - s->ref_frame = s->iv_frame; - } else { - s->cur_frame = s->iv_frame; - s->ref_frame = s->iv_frame + 1; - } - - buf_pos = buf + 16 + offs1; - offs = bytestream_get_le32(&buf_pos); - - iv_Decode_Chunk(s, s->cur_frame->Ybuf, s->ref_frame->Ybuf, hdr_width, - hdr_height, buf_pos + offs * 2, fflags2, hdr_pos, buf_pos, - FFMIN(hdr_width, 160)); - - if (!(s->avctx->flags & CODEC_FLAG_GRAY)) - { - - buf_pos = buf + 16 + offs2; - offs = bytestream_get_le32(&buf_pos); - - iv_Decode_Chunk(s, s->cur_frame->Vbuf, s->ref_frame->Vbuf, chroma_width, - chroma_height, buf_pos + offs * 2, fflags2, hdr_pos, buf_pos, - FFMIN(chroma_width, 40)); - - buf_pos = buf + 16 + offs3; - offs = bytestream_get_le32(&buf_pos); - - iv_Decode_Chunk(s, s->cur_frame->Ubuf, s->ref_frame->Ubuf, chroma_width, - chroma_height, buf_pos + offs * 2, fflags2, hdr_pos, buf_pos, - FFMIN(chroma_width, 40)); - - } - - return 8; -} - typedef struct { long xpos; long ypos; @@ -1048,6 +976,73 @@ return ret; } +static unsigned long iv_decode_frame(Indeo3DecodeContext *s, + const uint8_t *buf, int buf_size) +{ + unsigned int hdr_width, hdr_height, + chroma_width, chroma_height; + unsigned long fflags1, fflags2, fflags3, offs1, offs2, offs3, offs; + const uint8_t *hdr_pos, *buf_pos; + + buf_pos = buf; + buf_pos += 18; + + fflags1 = bytestream_get_le16(&buf_pos); + fflags3 = bytestream_get_le32(&buf_pos); + fflags2 = *buf_pos++; + buf_pos += 3; + hdr_height = bytestream_get_le16(&buf_pos); + hdr_width = bytestream_get_le16(&buf_pos); + + if(avcodec_check_dimensions(NULL, hdr_width, hdr_height)) + return -1; + + chroma_height = ((hdr_height >> 2) + 3) & 0x7ffc; + chroma_width = ((hdr_width >> 2) + 3) & 0x7ffc; + offs1 = bytestream_get_le32(&buf_pos); + offs2 = bytestream_get_le32(&buf_pos); + offs3 = bytestream_get_le32(&buf_pos); + buf_pos += 4; + hdr_pos = buf_pos; + if(fflags3 == 0x80) return 4; + + if(fflags1 & 0x200) { + s->cur_frame = s->iv_frame + 1; + s->ref_frame = s->iv_frame; + } else { + s->cur_frame = s->iv_frame; + s->ref_frame = s->iv_frame + 1; + } + + buf_pos = buf + 16 + offs1; + offs = bytestream_get_le32(&buf_pos); + + iv_Decode_Chunk(s, s->cur_frame->Ybuf, s->ref_frame->Ybuf, hdr_width, + hdr_height, buf_pos + offs * 2, fflags2, hdr_pos, buf_pos, + FFMIN(hdr_width, 160)); + + if (!(s->avctx->flags & CODEC_FLAG_GRAY)) + { + + buf_pos = buf + 16 + offs2; + offs = bytestream_get_le32(&buf_pos); + + iv_Decode_Chunk(s, s->cur_frame->Vbuf, s->ref_frame->Vbuf, chroma_width, + chroma_height, buf_pos + offs * 2, fflags2, hdr_pos, buf_pos, + FFMIN(chroma_width, 40)); + + buf_pos = buf + 16 + offs3; + offs = bytestream_get_le32(&buf_pos); + + iv_Decode_Chunk(s, s->cur_frame->Ubuf, s->ref_frame->Ubuf, chroma_width, + chroma_height, buf_pos + offs * 2, fflags2, hdr_pos, buf_pos, + FFMIN(chroma_width, 40)); + + } + + return 8; +} + static int indeo3_decode_frame(AVCodecContext *avctx, void *data, int *data_size, const uint8_t *buf, int buf_size)