annotate indeo3.c @ 5875:5a61e8e2f65c libavcodec

Remove libvorbis Vorbis decoding support. Our native decoder is complete and has no known bugs, any remaining issues will hopefully be uncovered now.
author diego
date Sun, 04 Nov 2007 12:55:32 +0000
parents f99e40a7155b
children d912f75d3b5d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1 /*
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
2 * Intel Indeo 3 (IV31, IV32, etc.) video decoder for ffmpeg
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
3 * written, produced, and directed by Alan Smithee
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
15 * Lesser General Public License for more details.
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
16 *
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
20 */
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
21
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
22 #include <stdio.h>
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
23 #include <stdlib.h>
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
24 #include <string.h>
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
25 #include <unistd.h>
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
26
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
27 #include "avcodec.h"
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
28 #include "dsputil.h"
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
29 #include "mpegvideo.h"
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
30
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
31 #include "indeo3data.h"
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
32
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
33 typedef struct
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
34 {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
35 unsigned char *Ybuf;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
36 unsigned char *Ubuf;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
37 unsigned char *Vbuf;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
38 unsigned char *the_buf;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
39 unsigned int the_buf_size;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
40 unsigned short y_w, y_h;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
41 unsigned short uv_w, uv_h;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
42 } YUVBufs;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
43
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
44 typedef struct Indeo3DecodeContext {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
45 AVCodecContext *avctx;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
46 int width, height;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
47 AVFrame frame;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
48
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
49 YUVBufs iv_frame[2];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
50 YUVBufs *cur_frame;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
51 YUVBufs *ref_frame;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
52
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
53 unsigned char *ModPred;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
54 unsigned short *corrector_type;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
55 } Indeo3DecodeContext;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
56
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
57 static int corrector_type_0[24] = {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
58 195, 159, 133, 115, 101, 93, 87, 77,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
59 195, 159, 133, 115, 101, 93, 87, 77,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
60 128, 79, 79, 79, 79, 79, 79, 79
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
61 };
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
62
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
63 static int corrector_type_2[8] = { 9, 7, 6, 8, 5, 4, 3, 2 };
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
64
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
65 static void build_modpred(Indeo3DecodeContext *s)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
66 {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
67 int i, j;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
68
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
69 s->ModPred = (unsigned char *) av_malloc (8 * 128);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
70
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
71 for (i=0; i < 128; ++i) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
72 s->ModPred[i+0*128] = (i > 126) ? 254 : 2*((i + 1) - ((i + 1) % 2));
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
73 s->ModPred[i+1*128] = (i == 7) ? 20 : ((i == 119 || i == 120)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
74 ? 236 : 2*((i + 2) - ((i + 1) % 3)));
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
75 s->ModPred[i+2*128] = (i > 125) ? 248 : 2*((i + 2) - ((i + 2) % 4));
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
76 s->ModPred[i+3*128] = 2*((i + 1) - ((i - 3) % 5));
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
77 s->ModPred[i+4*128] = (i == 8) ? 20 : 2*((i + 1) - ((i - 3) % 6));
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
78 s->ModPred[i+5*128] = 2*((i + 4) - ((i + 3) % 7));
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
79 s->ModPred[i+6*128] = (i > 123) ? 240 : 2*((i + 4) - ((i + 4) % 8));
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
80 s->ModPred[i+7*128] = 2*((i + 5) - ((i + 4) % 9));
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
81 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
82
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
83 s->corrector_type = (unsigned short *) av_malloc (24 * 256 * sizeof(unsigned short));
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
84
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
85 for (i=0; i < 24; ++i) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
86 for (j=0; j < 256; ++j) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
87 s->corrector_type[i*256+j] = (j < corrector_type_0[i])
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
88 ? 1 : ((j < 248 || (i == 16 && j == 248))
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
89 ? 0 : corrector_type_2[j - 248]);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
90 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
91 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
92 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
93
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
94 static void iv_Decode_Chunk(Indeo3DecodeContext *s, unsigned char *cur,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
95 unsigned char *ref, int width, int height, unsigned char *buf1,
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
96 long fflags2, unsigned char *hdr,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
97 unsigned char *buf2, int min_width_160);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
98
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
99 /* ---------------------------------------------------------------------- */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
100 static void iv_alloc_frames(Indeo3DecodeContext *s)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
101 {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
102 int luma_width, luma_height, luma_pixels, chroma_width, chroma_height,
2288
3d4a1f8e6a27 * fixing a few of gcc 'clean-code' warnings
kabi
parents: 2244
diff changeset
103 chroma_pixels, i;
3d4a1f8e6a27 * fixing a few of gcc 'clean-code' warnings
kabi
parents: 2244
diff changeset
104 unsigned int bufsize;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
105
1481
0cfed95c7707 fixes levis.avi
michaelni
parents: 1454
diff changeset
106 luma_width = (s->width + 3) & (~3);
0cfed95c7707 fixes levis.avi
michaelni
parents: 1454
diff changeset
107 luma_height = (s->height + 3) & (~3);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
108
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
109 s->iv_frame[0].y_w = s->iv_frame[0].y_h =
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
110 s->iv_frame[0].the_buf_size = 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
111 s->iv_frame[1].y_w = s->iv_frame[1].y_h =
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
112 s->iv_frame[1].the_buf_size = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
113 s->iv_frame[1].the_buf = NULL;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
114
1481
0cfed95c7707 fixes levis.avi
michaelni
parents: 1454
diff changeset
115 chroma_width = ((luma_width >> 2) + 3) & (~3);
0cfed95c7707 fixes levis.avi
michaelni
parents: 1454
diff changeset
116 chroma_height = ((luma_height>> 2) + 3) & (~3);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
117 luma_pixels = luma_width * luma_height;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
118 chroma_pixels = chroma_width * chroma_height;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
119
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
120 bufsize = luma_pixels * 2 + luma_width * 3 +
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
121 (chroma_pixels + chroma_width) * 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
122
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
123 if((s->iv_frame[0].the_buf =
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
124 (s->iv_frame[0].the_buf_size == 0 ? av_malloc(bufsize) :
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
125 av_realloc(s->iv_frame[0].the_buf, bufsize))) == NULL)
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
126 return;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
127 s->iv_frame[0].y_w = s->iv_frame[1].y_w = luma_width;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
128 s->iv_frame[0].y_h = s->iv_frame[1].y_h = luma_height;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
129 s->iv_frame[0].uv_w = s->iv_frame[1].uv_w = chroma_width;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
130 s->iv_frame[0].uv_h = s->iv_frame[1].uv_h = chroma_height;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
131 s->iv_frame[0].the_buf_size = bufsize;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
132
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
133 s->iv_frame[0].Ybuf = s->iv_frame[0].the_buf + luma_width;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
134 i = luma_pixels + luma_width * 2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
135 s->iv_frame[1].Ybuf = s->iv_frame[0].the_buf + i;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
136 i += (luma_pixels + luma_width);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
137 s->iv_frame[0].Ubuf = s->iv_frame[0].the_buf + i;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
138 i += (chroma_pixels + chroma_width);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
139 s->iv_frame[1].Ubuf = s->iv_frame[0].the_buf + i;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
140 i += (chroma_pixels + chroma_width);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
141 s->iv_frame[0].Vbuf = s->iv_frame[0].the_buf + i;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
142 i += (chroma_pixels + chroma_width);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
143 s->iv_frame[1].Vbuf = s->iv_frame[0].the_buf + i;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
144
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
145 for(i = 1; i <= luma_width; i++)
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
146 s->iv_frame[0].Ybuf[-i] = s->iv_frame[1].Ybuf[-i] =
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
147 s->iv_frame[0].Ubuf[-i] = 0x80;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
148
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
149 for(i = 1; i <= chroma_width; i++) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
150 s->iv_frame[1].Ubuf[-i] = 0x80;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
151 s->iv_frame[0].Vbuf[-i] = 0x80;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
152 s->iv_frame[1].Vbuf[-i] = 0x80;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
153 s->iv_frame[1].Vbuf[chroma_pixels+i-1] = 0x80;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
154 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
155 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
156
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
157 /* ---------------------------------------------------------------------- */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
158 static void iv_free_func(Indeo3DecodeContext *s)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
159 {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
160 int i;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
161
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
162 for(i = 0 ; i < 2 ; i++) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
163 if(s->iv_frame[i].the_buf != NULL)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
164 av_free(s->iv_frame[i].the_buf);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
165 s->iv_frame[i].Ybuf = s->iv_frame[i].Ubuf =
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
166 s->iv_frame[i].Vbuf = NULL;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
167 s->iv_frame[i].the_buf = NULL;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
168 s->iv_frame[i].the_buf_size = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
169 s->iv_frame[i].y_w = s->iv_frame[i].y_h = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
170 s->iv_frame[i].uv_w = s->iv_frame[i].uv_h = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
171 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
172
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
173 av_free(s->ModPred);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
174 av_free(s->corrector_type);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
175 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
176
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
177 /* ---------------------------------------------------------------------- */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
178 static unsigned long iv_decode_frame(Indeo3DecodeContext *s,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
179 unsigned char *buf, int buf_size)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
180 {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
181 unsigned int hdr_width, hdr_height,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
182 chroma_width, chroma_height;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
183 unsigned long fflags1, fflags2, fflags3, offs1, offs2, offs3, offs;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
184 unsigned char *hdr_pos, *buf_pos;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
185
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
186 buf_pos = buf;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
187 buf_pos += 18;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
188
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
189 fflags1 = le2me_16(*(uint16_t *)buf_pos);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
190 buf_pos += 2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
191 fflags3 = le2me_32(*(uint32_t *)buf_pos);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
192 buf_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
193 fflags2 = *buf_pos++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
194 buf_pos += 3;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
195 hdr_height = le2me_16(*(uint16_t *)buf_pos);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
196 buf_pos += 2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
197 hdr_width = le2me_16(*(uint16_t *)buf_pos);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
198
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2288
diff changeset
199 if(avcodec_check_dimensions(NULL, hdr_width, hdr_height))
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2288
diff changeset
200 return -1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
201
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
202 buf_pos += 2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
203 chroma_height = ((hdr_height >> 2) + 3) & 0x7ffc;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
204 chroma_width = ((hdr_width >> 2) + 3) & 0x7ffc;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
205 offs1 = le2me_32(*(uint32_t *)buf_pos);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
206 buf_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
207 offs2 = le2me_32(*(uint32_t *)buf_pos);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
208 buf_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
209 offs3 = le2me_32(*(uint32_t *)buf_pos);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
210 buf_pos += 8;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
211 hdr_pos = buf_pos;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
212 if(fflags3 == 0x80) return 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
213
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
214 if(fflags1 & 0x200) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
215 s->cur_frame = s->iv_frame + 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
216 s->ref_frame = s->iv_frame;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
217 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
218 s->cur_frame = s->iv_frame;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
219 s->ref_frame = s->iv_frame + 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
220 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
221
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
222 buf_pos = buf + 16 + offs1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
223 offs = le2me_32(*(uint32_t *)buf_pos);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
224 buf_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
225
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
226 iv_Decode_Chunk(s, s->cur_frame->Ybuf, s->ref_frame->Ybuf, hdr_width,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
227 hdr_height, buf_pos + offs * 2, fflags2, hdr_pos, buf_pos,
4591
16c24b902f43 use FFMIN
aurel
parents: 3947
diff changeset
228 FFMIN(hdr_width, 160));
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
229
2244
4a0cfd63f078 greyscale decoding (option to skip u,v planes) support
alex
parents: 2028
diff changeset
230 if (!(s->avctx->flags & CODEC_FLAG_GRAY))
4a0cfd63f078 greyscale decoding (option to skip u,v planes) support
alex
parents: 2028
diff changeset
231 {
4a0cfd63f078 greyscale decoding (option to skip u,v planes) support
alex
parents: 2028
diff changeset
232
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
233 buf_pos = buf + 16 + offs2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
234 offs = le2me_32(*(uint32_t *)buf_pos);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
235 buf_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
236
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
237 iv_Decode_Chunk(s, s->cur_frame->Vbuf, s->ref_frame->Vbuf, chroma_width,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
238 chroma_height, buf_pos + offs * 2, fflags2, hdr_pos, buf_pos,
4591
16c24b902f43 use FFMIN
aurel
parents: 3947
diff changeset
239 FFMIN(chroma_width, 40));
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
240
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
241 buf_pos = buf + 16 + offs3;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
242 offs = le2me_32(*(uint32_t *)buf_pos);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
243 buf_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
244
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
245 iv_Decode_Chunk(s, s->cur_frame->Ubuf, s->ref_frame->Ubuf, chroma_width,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
246 chroma_height, buf_pos + offs * 2, fflags2, hdr_pos, buf_pos,
4591
16c24b902f43 use FFMIN
aurel
parents: 3947
diff changeset
247 FFMIN(chroma_width, 40));
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
248
2244
4a0cfd63f078 greyscale decoding (option to skip u,v planes) support
alex
parents: 2028
diff changeset
249 }
4a0cfd63f078 greyscale decoding (option to skip u,v planes) support
alex
parents: 2028
diff changeset
250
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
251 return 8;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
252 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
253
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
254 typedef struct {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
255 long xpos;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
256 long ypos;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
257 long width;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
258 long height;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
259 long split_flag;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
260 long split_direction;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
261 long usl7;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
262 } ustr_t;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
263
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
264 /* ---------------------------------------------------------------------- */
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
265
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
266 #define LV1_CHECK(buf1,rle_v3,lv1,lp2) \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
267 if((lv1 & 0x80) != 0) { \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
268 if(rle_v3 != 0) \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
269 rle_v3 = 0; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
270 else { \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
271 rle_v3 = 1; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
272 buf1 -= 2; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
273 } \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
274 } \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
275 lp2 = 4;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
276
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
277
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
278 #define RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
279 if(rle_v3 == 0) { \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
280 rle_v2 = *buf1; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
281 rle_v1 = 1; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
282 if(rle_v2 > 32) { \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
283 rle_v2 -= 32; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
284 rle_v1 = 0; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
285 } \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
286 rle_v3 = 1; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
287 } \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
288 buf1--;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
289
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
290
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
291 #define LP2_CHECK(buf1,rle_v3,lp2) \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
292 if(lp2 == 0 && rle_v3 != 0) \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
293 rle_v3 = 0; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
294 else { \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
295 buf1--; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
296 rle_v3 = 1; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
297 }
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
298
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
299
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
300 #define RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
301 rle_v2--; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
302 if(rle_v2 == 0) { \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
303 rle_v3 = 0; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
304 buf1 += 2; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
305 } \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
306 lp2 = 4;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
307
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
308 static void iv_Decode_Chunk(Indeo3DecodeContext *s,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
309 unsigned char *cur, unsigned char *ref, int width, int height,
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
310 unsigned char *buf1, long fflags2, unsigned char *hdr,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
311 unsigned char *buf2, int min_width_160)
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
312 {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
313 unsigned char bit_buf;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
314 unsigned long bit_pos, lv, lv1, lv2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
315 long *width_tbl, width_tbl_arr[10];
2528
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
316 signed char *ref_vectors;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
317 unsigned char *cur_frm_pos, *ref_frm_pos, *cp, *cp2;
1454
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
318 uint32_t *cur_lp, *ref_lp;
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
319 const uint32_t *correction_lp[2], *correctionloworder_lp[2], *correctionhighorder_lp[2];
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
320 unsigned short *correction_type_sp[2];
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
321 ustr_t strip_tbl[20], *strip;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
322 int i, j, k, lp1, lp2, flag1, cmd, blks_width, blks_height, region_160_width,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
323 rle_v1, rle_v2, rle_v3;
2528
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
324 unsigned short res;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
325
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
326 bit_buf = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
327 ref_vectors = NULL;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
328
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
329 width_tbl = width_tbl_arr + 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
330 i = (width < 0 ? width + 3 : width)/4;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
331 for(j = -1; j < 8; j++)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
332 width_tbl[j] = i * j;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
333
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
334 strip = strip_tbl;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
335
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
336 for(region_160_width = 0; region_160_width < (width - min_width_160); region_160_width += min_width_160);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
337
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
338 strip->ypos = strip->xpos = 0;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
339 for(strip->width = min_width_160; width > strip->width; strip->width *= 2);
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
340 strip->height = height;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
341 strip->split_direction = 0;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
342 strip->split_flag = 0;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
343 strip->usl7 = 0;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
344
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
345 bit_pos = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
346
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
347 rle_v1 = rle_v2 = rle_v3 = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
348
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
349 while(strip >= strip_tbl) {
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
350 if(bit_pos <= 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
351 bit_pos = 8;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
352 bit_buf = *buf1++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
353 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
354
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
355 bit_pos -= 2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
356 cmd = (bit_buf >> bit_pos) & 0x03;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
357
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
358 if(cmd == 0) {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
359 strip++;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
360 memcpy(strip, strip-1, sizeof(ustr_t));
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
361 strip->split_flag = 1;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
362 strip->split_direction = 0;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
363 strip->height = (strip->height > 8 ? ((strip->height+8)>>4)<<3 : 4);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
364 continue;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
365 } else if(cmd == 1) {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
366 strip++;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
367 memcpy(strip, strip-1, sizeof(ustr_t));
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
368 strip->split_flag = 1;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
369 strip->split_direction = 1;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
370 strip->width = (strip->width > 8 ? ((strip->width+8)>>4)<<3 : 4);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
371 continue;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
372 } else if(cmd == 2) {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
373 if(strip->usl7 == 0) {
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
374 strip->usl7 = 1;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
375 ref_vectors = NULL;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
376 continue;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
377 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
378 } else if(cmd == 3) {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
379 if(strip->usl7 == 0) {
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
380 strip->usl7 = 1;
3776
1843a85123b7 fix some signedness warnings
mru
parents: 3036
diff changeset
381 ref_vectors = (signed char*)buf2 + (*buf1 * 2);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
382 buf1++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
383 continue;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
384 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
385 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
386
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
387 cur_frm_pos = cur + width * strip->ypos + strip->xpos;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
388
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
389 if((blks_width = strip->width) < 0)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
390 blks_width += 3;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
391 blks_width >>= 2;
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
392 blks_height = strip->height;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
393
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
394 if(ref_vectors != NULL) {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
395 ref_frm_pos = ref + (ref_vectors[0] + strip->ypos) * width +
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
396 ref_vectors[1] + strip->xpos;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
397 } else
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
398 ref_frm_pos = cur_frm_pos - width_tbl[4];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
399
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
400 if(cmd == 2) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
401 if(bit_pos <= 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
402 bit_pos = 8;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
403 bit_buf = *buf1++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
404 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
405
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
406 bit_pos -= 2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
407 cmd = (bit_buf >> bit_pos) & 0x03;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
408
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
409 if(cmd == 0 || ref_vectors != NULL) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
410 for(lp1 = 0; lp1 < blks_width; lp1++) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
411 for(i = 0, j = 0; i < blks_height; i++, j += width_tbl[1])
1454
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
412 ((uint32_t *)cur_frm_pos)[j] = ((uint32_t *)ref_frm_pos)[j];
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
413 cur_frm_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
414 ref_frm_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
415 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
416 } else if(cmd != 1)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
417 return;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
418 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
419 k = *buf1 >> 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
420 j = *buf1 & 0x0f;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
421 buf1++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
422 lv = j + fflags2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
423
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
424 if((lv - 8) <= 7 && (k == 0 || k == 3 || k == 10)) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
425 cp2 = s->ModPred + ((lv - 8) << 7);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
426 cp = ref_frm_pos;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
427 for(i = 0; i < blks_width << 2; i++) {
1454
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
428 int v = *cp >> 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
429 *(cp++) = cp2[v];
1454
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
430 }
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
431 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
432
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
433 if(k == 1 || k == 4) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
434 lv = (hdr[j] & 0xf) + fflags2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
435 correction_type_sp[0] = s->corrector_type + (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
436 correction_lp[0] = correction + (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
437 lv = (hdr[j] >> 4) + fflags2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
438 correction_lp[1] = correction + (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
439 correction_type_sp[1] = s->corrector_type + (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
440 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
441 correctionloworder_lp[0] = correctionloworder_lp[1] = correctionloworder + (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
442 correctionhighorder_lp[0] = correctionhighorder_lp[1] = correctionhighorder + (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
443 correction_type_sp[0] = correction_type_sp[1] = s->corrector_type + (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
444 correction_lp[0] = correction_lp[1] = correction + (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
445 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
446
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
447 switch(k) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
448 case 1:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
449 case 0: /********** CASE 0 **********/
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
450 for( ; blks_height > 0; blks_height -= 4) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
451 for(lp1 = 0; lp1 < blks_width; lp1++) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
452 for(lp2 = 0; lp2 < 4; ) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
453 k = *buf1++;
1454
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
454 cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2];
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
455 ref_lp = ((uint32_t *)ref_frm_pos) + width_tbl[lp2];
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
456
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
457 switch(correction_type_sp[0][k]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
458 case 0:
2528
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
459 *cur_lp = le2me_32(((le2me_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
460 lp2++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
461 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
462 case 1:
2549
89ca1169b24c indeo3 for bigendian patch by (demo-n <demo-n users.sourceforge net)
michael
parents: 2528
diff changeset
463 res = ((le2me_16(((unsigned short *)(ref_lp))[0]) >> 1) + correction_lp[lp2 & 0x01][*buf1]) << 1;
2528
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
464 ((unsigned short *)cur_lp)[0] = le2me_16(res);
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
465 res = ((le2me_16(((unsigned short *)(ref_lp))[1]) >> 1) + correction_lp[lp2 & 0x01][k]) << 1;
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
466 ((unsigned short *)cur_lp)[1] = le2me_16(res);
2549
89ca1169b24c indeo3 for bigendian patch by (demo-n <demo-n users.sourceforge net)
michael
parents: 2528
diff changeset
467 buf1++;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
468 lp2++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
469 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
470 case 2:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
471 if(lp2 == 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
472 for(i = 0, j = 0; i < 2; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
473 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
474 lp2 += 2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
475 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
476 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
477 case 3:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
478 if(lp2 < 2) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
479 for(i = 0, j = 0; i < (3 - lp2); i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
480 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
481 lp2 = 3;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
482 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
483 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
484 case 8:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
485 if(lp2 == 0) {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
486 RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
487
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
488 if(rle_v1 == 1 || ref_vectors != NULL) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
489 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
490 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
491 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
492
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
493 RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
494 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
495 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
496 rle_v1 = 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
497 rle_v2 = *buf1 - 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
498 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
499 case 5:
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
500 LP2_CHECK(buf1,rle_v3,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
501 case 4:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
502 for(i = 0, j = 0; i < (4 - lp2); i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
503 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
504 lp2 = 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
505 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
506
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
507 case 7:
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
508 if(rle_v3 != 0)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
509 rle_v3 = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
510 else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
511 buf1--;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
512 rle_v3 = 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
513 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
514 case 6:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
515 if(ref_vectors != NULL) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
516 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
517 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
518 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
519 lp2 = 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
520 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
521
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
522 case 9:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
523 lv1 = *buf1++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
524 lv = (lv1 & 0x7F) << 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
525 lv += (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
526 lv += (lv << 16);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
527 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
528 cur_lp[j] = lv;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
529
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
530 LV1_CHECK(buf1,rle_v3,lv1,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
531 break;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
532 default:
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
533 return;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
534 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
535 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
536
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
537 cur_frm_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
538 ref_frm_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
539 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
540
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
541 cur_frm_pos += ((width - blks_width) * 4);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
542 ref_frm_pos += ((width - blks_width) * 4);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
543 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
544 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
545
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
546 case 4:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
547 case 3: /********** CASE 3 **********/
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
548 if(ref_vectors != NULL)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
549 return;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
550 flag1 = 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
551
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
552 for( ; blks_height > 0; blks_height -= 8) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
553 for(lp1 = 0; lp1 < blks_width; lp1++) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
554 for(lp2 = 0; lp2 < 4; ) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
555 k = *buf1++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
556
1454
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
557 cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2 * 2];
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
558 ref_lp = ((uint32_t *)cur_frm_pos) + width_tbl[(lp2 * 2) - 1];
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
559
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
560 switch(correction_type_sp[lp2 & 0x01][k]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
561 case 0:
2528
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
562 cur_lp[width_tbl[1]] = le2me_32(((le2me_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1);
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
563 if(lp2 > 0 || flag1 == 0 || strip->ypos != 0)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
564 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
565 else
2528
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
566 cur_lp[0] = le2me_32(((le2me_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
567 lp2++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
568 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
569
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
570 case 1:
2549
89ca1169b24c indeo3 for bigendian patch by (demo-n <demo-n users.sourceforge net)
michael
parents: 2528
diff changeset
571 res = ((le2me_16(((unsigned short *)ref_lp)[0]) >> 1) + correction_lp[lp2 & 0x01][*buf1]) << 1;
2528
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
572 ((unsigned short *)cur_lp)[width_tbl[2]] = le2me_16(res);
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
573 res = ((le2me_16(((unsigned short *)ref_lp)[1]) >> 1) + correction_lp[lp2 & 0x01][k]) << 1;
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
574 ((unsigned short *)cur_lp)[width_tbl[2]+1] = le2me_16(res);
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
575
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
576 if(lp2 > 0 || flag1 == 0 || strip->ypos != 0)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
577 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
578 else
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
579 cur_lp[0] = cur_lp[width_tbl[1]];
2549
89ca1169b24c indeo3 for bigendian patch by (demo-n <demo-n users.sourceforge net)
michael
parents: 2528
diff changeset
580 buf1++;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
581 lp2++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
582 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
583
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
584 case 2:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
585 if(lp2 == 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
586 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
587 cur_lp[j] = *ref_lp;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
588 lp2 += 2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
589 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
590 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
591
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
592 case 3:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
593 if(lp2 < 2) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
594 for(i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
595 cur_lp[j] = *ref_lp;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
596 lp2 = 3;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
597 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
598 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
599
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
600 case 6:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
601 lp2 = 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
602 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
603
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
604 case 7:
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
605 if(rle_v3 != 0)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
606 rle_v3 = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
607 else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
608 buf1--;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
609 rle_v3 = 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
610 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
611 lp2 = 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
612 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
613
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
614 case 8:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
615 if(lp2 == 0) {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
616 RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
617
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
618 if(rle_v1 == 1) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
619 for(i = 0, j = 0; i < 8; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
620 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
621 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
622
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
623 RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
624 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
625 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
626 rle_v2 = (*buf1) - 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
627 rle_v1 = 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
628 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
629 case 5:
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
630 LP2_CHECK(buf1,rle_v3,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
631 case 4:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
632 for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
633 cur_lp[j] = *ref_lp;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
634 lp2 = 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
635 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
636
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
637 case 9:
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1481
diff changeset
638 av_log(s->avctx, AV_LOG_ERROR, "UNTESTED.\n");
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
639 lv1 = *buf1++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
640 lv = (lv1 & 0x7F) << 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
641 lv += (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
642 lv += (lv << 16);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
643
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
644 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
645 cur_lp[j] = lv;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
646
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
647 LV1_CHECK(buf1,rle_v3,lv1,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
648 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
649
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
650 default:
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
651 return;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
652 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
653 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
654
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
655 cur_frm_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
656 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
657
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
658 cur_frm_pos += (((width * 2) - blks_width) * 4);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
659 flag1 = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
660 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
661 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
662
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
663 case 10: /********** CASE 10 **********/
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
664 if(ref_vectors == NULL) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
665 flag1 = 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
666
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
667 for( ; blks_height > 0; blks_height -= 8) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
668 for(lp1 = 0; lp1 < blks_width; lp1 += 2) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
669 for(lp2 = 0; lp2 < 4; ) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
670 k = *buf1++;
1454
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
671 cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2 * 2];
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
672 ref_lp = ((uint32_t *)cur_frm_pos) + width_tbl[(lp2 * 2) - 1];
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
673 lv1 = ref_lp[0];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
674 lv2 = ref_lp[1];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
675 if(lp2 == 0 && flag1 != 0) {
2528
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
676 #ifdef WORDS_BIGENDIAN
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
677 lv1 = lv1 & 0xFF00FF00;
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
678 lv1 = (lv1 >> 8) | lv1;
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
679 lv2 = lv2 & 0xFF00FF00;
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
680 lv2 = (lv2 >> 8) | lv2;
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
681 #else
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
682 lv1 = lv1 & 0x00FF00FF;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
683 lv1 = (lv1 << 8) | lv1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
684 lv2 = lv2 & 0x00FF00FF;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
685 lv2 = (lv2 << 8) | lv2;
2528
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
686 #endif
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
687 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
688
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
689 switch(correction_type_sp[lp2 & 0x01][k]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
690 case 0:
2528
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
691 cur_lp[width_tbl[1]] = le2me_32(((le2me_32(lv1) >> 1) + correctionloworder_lp[lp2 & 0x01][k]) << 1);
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
692 cur_lp[width_tbl[1]+1] = le2me_32(((le2me_32(lv2) >> 1) + correctionhighorder_lp[lp2 & 0x01][k]) << 1);
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
693 if(lp2 > 0 || strip->ypos != 0 || flag1 == 0) {
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
694 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
695 cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
696 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
697 cur_lp[0] = cur_lp[width_tbl[1]];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
698 cur_lp[1] = cur_lp[width_tbl[1]+1];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
699 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
700 lp2++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
701 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
702
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
703 case 1:
2549
89ca1169b24c indeo3 for bigendian patch by (demo-n <demo-n users.sourceforge net)
michael
parents: 2528
diff changeset
704 cur_lp[width_tbl[1]] = le2me_32(((le2me_32(lv1) >> 1) + correctionloworder_lp[lp2 & 0x01][*buf1]) << 1);
2528
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
705 cur_lp[width_tbl[1]+1] = le2me_32(((le2me_32(lv2) >> 1) + correctionloworder_lp[lp2 & 0x01][k]) << 1);
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
706 if(lp2 > 0 || strip->ypos != 0 || flag1 == 0) {
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
707 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
708 cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
709 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
710 cur_lp[0] = cur_lp[width_tbl[1]];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
711 cur_lp[1] = cur_lp[width_tbl[1]+1];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
712 }
2549
89ca1169b24c indeo3 for bigendian patch by (demo-n <demo-n users.sourceforge net)
michael
parents: 2528
diff changeset
713 buf1++;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
714 lp2++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
715 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
716
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
717 case 2:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
718 if(lp2 == 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
719 if(flag1 != 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
720 for(i = 0, j = width_tbl[1]; i < 3; i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
721 cur_lp[j] = lv1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
722 cur_lp[j+1] = lv2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
723 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
724 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
725 cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
726 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
727 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
728 cur_lp[j] = lv1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
729 cur_lp[j+1] = lv2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
730 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
731 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
732 lp2 += 2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
733 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
734 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
735
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
736 case 3:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
737 if(lp2 < 2) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
738 if(lp2 == 0 && flag1 != 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
739 for(i = 0, j = width_tbl[1]; i < 5; i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
740 cur_lp[j] = lv1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
741 cur_lp[j+1] = lv2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
742 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
743 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
744 cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
745 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
746 for(i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
747 cur_lp[j] = lv1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
748 cur_lp[j+1] = lv2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
749 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
750 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
751 lp2 = 3;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
752 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
753 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
754
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
755 case 8:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
756 if(lp2 == 0) {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
757 RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
758 if(rle_v1 == 1) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
759 if(flag1 != 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
760 for(i = 0, j = width_tbl[1]; i < 7; i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
761 cur_lp[j] = lv1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
762 cur_lp[j+1] = lv2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
763 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
764 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
765 cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
766 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
767 for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
768 cur_lp[j] = lv1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
769 cur_lp[j+1] = lv2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
770 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
771 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
772 }
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
773 RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
774 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
775 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
776 rle_v1 = 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
777 rle_v2 = (*buf1) - 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
778 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
779 case 5:
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
780 LP2_CHECK(buf1,rle_v3,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
781 case 4:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
782 if(lp2 == 0 && flag1 != 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
783 for(i = 0, j = width_tbl[1]; i < 7; i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
784 cur_lp[j] = lv1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
785 cur_lp[j+1] = lv2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
786 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
787 cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
788 cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
789 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
790 for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
791 cur_lp[j] = lv1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
792 cur_lp[j+1] = lv2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
793 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
794 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
795 lp2 = 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
796 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
797
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
798 case 6:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
799 lp2 = 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
800 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
801
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
802 case 7:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
803 if(lp2 == 0) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
804 if(rle_v3 != 0)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
805 rle_v3 = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
806 else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
807 buf1--;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
808 rle_v3 = 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
809 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
810 lp2 = 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
811 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
812 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
813
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
814 case 9:
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1481
diff changeset
815 av_log(s->avctx, AV_LOG_ERROR, "UNTESTED.\n");
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
816 lv1 = *buf1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
817 lv = (lv1 & 0x7F) << 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
818 lv += (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
819 lv += (lv << 16);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
820 for(i = 0, j = 0; i < 8; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
821 cur_lp[j] = lv;
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
822 LV1_CHECK(buf1,rle_v3,lv1,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
823 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
824
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
825 default:
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
826 return;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
827 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
828 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
829
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
830 cur_frm_pos += 8;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
831 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
832
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
833 cur_frm_pos += (((width * 2) - blks_width) * 4);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
834 flag1 = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
835 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
836 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
837 for( ; blks_height > 0; blks_height -= 8) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
838 for(lp1 = 0; lp1 < blks_width; lp1 += 2) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
839 for(lp2 = 0; lp2 < 4; ) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
840 k = *buf1++;
1454
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
841 cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2 * 2];
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
842 ref_lp = ((uint32_t *)ref_frm_pos) + width_tbl[lp2 * 2];
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
843
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
844 switch(correction_type_sp[lp2 & 0x01][k]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
845 case 0:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
846 lv1 = correctionloworder_lp[lp2 & 0x01][k];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
847 lv2 = correctionhighorder_lp[lp2 & 0x01][k];
2528
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
848 cur_lp[0] = le2me_32(((le2me_32(ref_lp[0]) >> 1) + lv1) << 1);
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
849 cur_lp[1] = le2me_32(((le2me_32(ref_lp[1]) >> 1) + lv2) << 1);
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
850 cur_lp[width_tbl[1]] = le2me_32(((le2me_32(ref_lp[width_tbl[1]]) >> 1) + lv1) << 1);
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
851 cur_lp[width_tbl[1]+1] = le2me_32(((le2me_32(ref_lp[width_tbl[1]+1]) >> 1) + lv2) << 1);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
852 lp2++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
853 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
854
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
855 case 1:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
856 lv1 = correctionloworder_lp[lp2 & 0x01][*buf1++];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
857 lv2 = correctionloworder_lp[lp2 & 0x01][k];
2528
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
858 cur_lp[0] = le2me_32(((le2me_32(ref_lp[0]) >> 1) + lv1) << 1);
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
859 cur_lp[1] = le2me_32(((le2me_32(ref_lp[1]) >> 1) + lv2) << 1);
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
860 cur_lp[width_tbl[1]] = le2me_32(((le2me_32(ref_lp[width_tbl[1]]) >> 1) + lv1) << 1);
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
861 cur_lp[width_tbl[1]+1] = le2me_32(((le2me_32(ref_lp[width_tbl[1]+1]) >> 1) + lv2) << 1);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
862 lp2++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
863 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
864
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
865 case 2:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
866 if(lp2 == 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
867 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
868 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
869 cur_lp[j+1] = ref_lp[j+1];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
870 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
871 lp2 += 2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
872 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
873 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
874
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
875 case 3:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
876 if(lp2 < 2) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
877 for(i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
878 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
879 cur_lp[j+1] = ref_lp[j+1];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
880 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
881 lp2 = 3;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
882 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
883 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
884
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
885 case 8:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
886 if(lp2 == 0) {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
887 RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
888 for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) {
1454
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
889 ((uint32_t *)cur_frm_pos)[j] = ((uint32_t *)ref_frm_pos)[j];
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
890 ((uint32_t *)cur_frm_pos)[j+1] = ((uint32_t *)ref_frm_pos)[j+1];
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
891 }
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
892 RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
893 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
894 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
895 rle_v1 = 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
896 rle_v2 = (*buf1) - 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
897 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
898 case 5:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
899 case 7:
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
900 LP2_CHECK(buf1,rle_v3,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
901 case 6:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
902 case 4:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
903 for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
904 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
905 cur_lp[j+1] = ref_lp[j+1];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
906 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
907 lp2 = 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
908 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
909
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
910 case 9:
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1481
diff changeset
911 av_log(s->avctx, AV_LOG_ERROR, "UNTESTED.\n");
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
912 lv1 = *buf1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
913 lv = (lv1 & 0x7F) << 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
914 lv += (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
915 lv += (lv << 16);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
916 for(i = 0, j = 0; i < 8; i++, j += width_tbl[1])
1454
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
917 ((uint32_t *)cur_frm_pos)[j] = ((uint32_t *)cur_frm_pos)[j+1] = lv;
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
918 LV1_CHECK(buf1,rle_v3,lv1,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
919 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
920
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
921 default:
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
922 return;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
923 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
924 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
925
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
926 cur_frm_pos += 8;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
927 ref_frm_pos += 8;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
928 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
929
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
930 cur_frm_pos += (((width * 2) - blks_width) * 4);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
931 ref_frm_pos += (((width * 2) - blks_width) * 4);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
932 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
933 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
934 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
935
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
936 case 11: /********** CASE 11 **********/
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
937 if(ref_vectors == NULL)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
938 return;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
939
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
940 for( ; blks_height > 0; blks_height -= 8) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
941 for(lp1 = 0; lp1 < blks_width; lp1++) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
942 for(lp2 = 0; lp2 < 4; ) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
943 k = *buf1++;
1454
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
944 cur_lp = ((uint32_t *)cur_frm_pos) + width_tbl[lp2 * 2];
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
945 ref_lp = ((uint32_t *)ref_frm_pos) + width_tbl[lp2 * 2];
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
946
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
947 switch(correction_type_sp[lp2 & 0x01][k]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
948 case 0:
2528
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
949 cur_lp[0] = le2me_32(((le2me_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1);
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
950 cur_lp[width_tbl[1]] = le2me_32(((le2me_32(ref_lp[width_tbl[1]]) >> 1) + correction_lp[lp2 & 0x01][k]) << 1);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
951 lp2++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
952 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
953
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
954 case 1:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
955 lv1 = (unsigned short)(correction_lp[lp2 & 0x01][*buf1++]);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
956 lv2 = (unsigned short)(correction_lp[lp2 & 0x01][k]);
2528
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
957 res = (unsigned short)(((le2me_16(((unsigned short *)ref_lp)[0]) >> 1) + lv1) << 1);
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
958 ((unsigned short *)cur_lp)[0] = le2me_16(res);
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
959 res = (unsigned short)(((le2me_16(((unsigned short *)ref_lp)[1]) >> 1) + lv2) << 1);
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
960 ((unsigned short *)cur_lp)[1] = le2me_16(res);
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
961 res = (unsigned short)(((le2me_16(((unsigned short *)ref_lp)[width_tbl[2]]) >> 1) + lv1) << 1);
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
962 ((unsigned short *)cur_lp)[width_tbl[2]] = le2me_16(res);
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
963 res = (unsigned short)(((le2me_16(((unsigned short *)ref_lp)[width_tbl[2]+1]) >> 1) + lv2) << 1);
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
964 ((unsigned short *)cur_lp)[width_tbl[2]+1] = le2me_16(res);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
965 lp2++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
966 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
967
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
968 case 2:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
969 if(lp2 == 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
970 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
971 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
972 lp2 += 2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
973 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
974 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
975
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
976 case 3:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
977 if(lp2 < 2) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
978 for(i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
979 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
980 lp2 = 3;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
981 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
982 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
983
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
984 case 8:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
985 if(lp2 == 0) {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
986 RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
987
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
988 for(i = 0, j = 0; i < 8; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
989 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
990
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
991 RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
992 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
993 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
994 rle_v1 = 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
995 rle_v2 = (*buf1) - 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
996 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
997 case 5:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
998 case 7:
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
999 LP2_CHECK(buf1,rle_v3,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1000 case 4:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1001 case 6:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1002 for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1003 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1004 lp2 = 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1005 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1006
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1007 case 9:
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1481
diff changeset
1008 av_log(s->avctx, AV_LOG_ERROR, "UNTESTED.\n");
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1009 lv1 = *buf1++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1010 lv = (lv1 & 0x7F) << 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1011 lv += (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1012 lv += (lv << 16);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1013 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1014 cur_lp[j] = lv;
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1015 LV1_CHECK(buf1,rle_v3,lv1,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1016 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1017
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
1018 default:
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1019 return;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1020 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1021 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1022
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1023 cur_frm_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1024 ref_frm_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1025 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1026
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1027 cur_frm_pos += (((width * 2) - blks_width) * 4);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1028 ref_frm_pos += (((width * 2) - blks_width) * 4);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1029 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1030 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1031
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
1032 default:
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1033 return;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1034 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1035 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1036
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
1037 if(strip < strip_tbl)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1038 return;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1039
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1040 for( ; strip >= strip_tbl; strip--) {
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1041 if(strip->split_flag != 0) {
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1042 strip->split_flag = 0;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1043 strip->usl7 = (strip-1)->usl7;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1044
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1045 if(strip->split_direction) {
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1046 strip->xpos += strip->width;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1047 strip->width = (strip-1)->width - strip->width;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1048 if(region_160_width <= strip->xpos && width < strip->width + strip->xpos)
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1049 strip->width = width - strip->xpos;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1050 } else {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1051 strip->ypos += strip->height;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1052 strip->height = (strip-1)->height - strip->height;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1053 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1054 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1055 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1056 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1057 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1058 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1059
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1060 static int indeo3_decode_init(AVCodecContext *avctx)
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1061 {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1062 Indeo3DecodeContext *s = avctx->priv_data;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1063
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1064 s->avctx = avctx;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1065 s->width = avctx->width;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1066 s->height = avctx->height;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1067 avctx->pix_fmt = PIX_FMT_YUV410P;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1068
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1069 build_modpred(s);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1070 iv_alloc_frames(s);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1071
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1072 return 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1073 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1074
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1075 static int indeo3_decode_frame(AVCodecContext *avctx,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1076 void *data, int *data_size,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1077 unsigned char *buf, int buf_size)
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1078 {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1079 Indeo3DecodeContext *s=avctx->priv_data;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1080 unsigned char *src, *dest;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1081 int y;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1082
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1083 iv_decode_frame(s, buf, buf_size);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1084
1228
d63e0185a90f release buffer cleanup
michaelni
parents: 1198
diff changeset
1085 if(s->frame.data[0])
d63e0185a90f release buffer cleanup
michaelni
parents: 1198
diff changeset
1086 avctx->release_buffer(avctx, &s->frame);
d63e0185a90f release buffer cleanup
michaelni
parents: 1198
diff changeset
1087
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1088 s->frame.reference = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1089 if(avctx->get_buffer(avctx, &s->frame) < 0) {
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1481
diff changeset
1090 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1091 return -1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1092 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1093
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1094 src = s->cur_frame->Ybuf;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1095 dest = s->frame.data[0];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1096 for (y = 0; y < s->height; y++) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1097 memcpy(dest, src, s->cur_frame->y_w);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1098 src += s->cur_frame->y_w;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1099 dest += s->frame.linesize[0];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1100 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1101
2244
4a0cfd63f078 greyscale decoding (option to skip u,v planes) support
alex
parents: 2028
diff changeset
1102 if (!(s->avctx->flags & CODEC_FLAG_GRAY))
4a0cfd63f078 greyscale decoding (option to skip u,v planes) support
alex
parents: 2028
diff changeset
1103 {
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1104 src = s->cur_frame->Ubuf;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1105 dest = s->frame.data[1];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1106 for (y = 0; y < s->height / 4; y++) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1107 memcpy(dest, src, s->cur_frame->uv_w);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1108 src += s->cur_frame->uv_w;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1109 dest += s->frame.linesize[1];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1110 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1111
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1112 src = s->cur_frame->Vbuf;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1113 dest = s->frame.data[2];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1114 for (y = 0; y < s->height / 4; y++) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1115 memcpy(dest, src, s->cur_frame->uv_w);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1116 src += s->cur_frame->uv_w;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1117 dest += s->frame.linesize[2];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1118 }
2244
4a0cfd63f078 greyscale decoding (option to skip u,v planes) support
alex
parents: 2028
diff changeset
1119 }
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1120
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1121 *data_size=sizeof(AVFrame);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1122 *(AVFrame*)data= s->frame;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1123
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1124 return buf_size;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1125 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1126
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1127 static int indeo3_decode_end(AVCodecContext *avctx)
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1128 {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1129 Indeo3DecodeContext *s = avctx->priv_data;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1130
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1131 iv_free_func(s);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1132
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1133 return 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1134 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1135
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1136 AVCodec indeo3_decoder = {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1137 "indeo3",
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1138 CODEC_TYPE_VIDEO,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1139 CODEC_ID_INDEO3,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1140 sizeof(Indeo3DecodeContext),
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1141 indeo3_decode_init,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1142 NULL,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1143 indeo3_decode_end,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1144 indeo3_decode_frame,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1145 0,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1146 NULL
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1147 };