annotate indeo3.c @ 7855:9a135b6a1dc7 libavcodec

Correct order of parsing for pulse scalefactor band and offset to match the specification. Patch by Alex Converse (alex converse gmail com)
author superdump
date Sat, 13 Sep 2008 18:47:43 +0000
parents e943e1409077
children 518521276932
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"
6239
e270eccc622f Use bytestream.
michael
parents: 6218
diff changeset
29 #include "bytestream.h"
1190
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
6210
d912f75d3b5d Two tables that should be const
reimar
parents: 4962
diff changeset
57 static const int corrector_type_0[24] = {
1190
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
6210
d912f75d3b5d Two tables that should be const
reimar
parents: 4962
diff changeset
63 static const int corrector_type_2[8] = { 9, 7, 6, 8, 5, 4, 3, 2 };
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
64
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6450
diff changeset
65 static av_cold 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,
6240
michael
parents: 6239
diff changeset
95 unsigned char *ref, int width, int height, const unsigned char *buf1,
michael
parents: 6239
diff changeset
96 long fflags2, const unsigned char *hdr,
michael
parents: 6239
diff changeset
97 const unsigned char *buf2, int min_width_160);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
98
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
99 /* ---------------------------------------------------------------------- */
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6450
diff changeset
100 static av_cold 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 /* ---------------------------------------------------------------------- */
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6450
diff changeset
158 static av_cold 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,
6218
michael
parents: 6210
diff changeset
179 const 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;
6218
michael
parents: 6210
diff changeset
184 const unsigned char *hdr_pos, *buf_pos;
1190
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
6239
e270eccc622f Use bytestream.
michael
parents: 6218
diff changeset
189 fflags1 = bytestream_get_le16(&buf_pos);
e270eccc622f Use bytestream.
michael
parents: 6218
diff changeset
190 fflags3 = bytestream_get_le32(&buf_pos);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
191 fflags2 = *buf_pos++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
192 buf_pos += 3;
6239
e270eccc622f Use bytestream.
michael
parents: 6218
diff changeset
193 hdr_height = bytestream_get_le16(&buf_pos);
e270eccc622f Use bytestream.
michael
parents: 6218
diff changeset
194 hdr_width = bytestream_get_le16(&buf_pos);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
195
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2288
diff changeset
196 if(avcodec_check_dimensions(NULL, hdr_width, hdr_height))
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2288
diff changeset
197 return -1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
198
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
199 chroma_height = ((hdr_height >> 2) + 3) & 0x7ffc;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
200 chroma_width = ((hdr_width >> 2) + 3) & 0x7ffc;
6239
e270eccc622f Use bytestream.
michael
parents: 6218
diff changeset
201 offs1 = bytestream_get_le32(&buf_pos);
e270eccc622f Use bytestream.
michael
parents: 6218
diff changeset
202 offs2 = bytestream_get_le32(&buf_pos);
e270eccc622f Use bytestream.
michael
parents: 6218
diff changeset
203 offs3 = bytestream_get_le32(&buf_pos);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
204 buf_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
205 hdr_pos = buf_pos;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
206 if(fflags3 == 0x80) return 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
207
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
208 if(fflags1 & 0x200) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
209 s->cur_frame = s->iv_frame + 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
210 s->ref_frame = s->iv_frame;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
211 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
212 s->cur_frame = s->iv_frame;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
213 s->ref_frame = s->iv_frame + 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
214 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
215
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
216 buf_pos = buf + 16 + offs1;
6239
e270eccc622f Use bytestream.
michael
parents: 6218
diff changeset
217 offs = bytestream_get_le32(&buf_pos);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
218
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
219 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
220 hdr_height, buf_pos + offs * 2, fflags2, hdr_pos, buf_pos,
4591
16c24b902f43 use FFMIN
aurel
parents: 3947
diff changeset
221 FFMIN(hdr_width, 160));
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
222
2244
4a0cfd63f078 greyscale decoding (option to skip u,v planes) support
alex
parents: 2028
diff changeset
223 if (!(s->avctx->flags & CODEC_FLAG_GRAY))
4a0cfd63f078 greyscale decoding (option to skip u,v planes) support
alex
parents: 2028
diff changeset
224 {
4a0cfd63f078 greyscale decoding (option to skip u,v planes) support
alex
parents: 2028
diff changeset
225
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
226 buf_pos = buf + 16 + offs2;
6239
e270eccc622f Use bytestream.
michael
parents: 6218
diff changeset
227 offs = bytestream_get_le32(&buf_pos);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
228
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
229 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
230 chroma_height, buf_pos + offs * 2, fflags2, hdr_pos, buf_pos,
4591
16c24b902f43 use FFMIN
aurel
parents: 3947
diff changeset
231 FFMIN(chroma_width, 40));
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
232
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
233 buf_pos = buf + 16 + offs3;
6239
e270eccc622f Use bytestream.
michael
parents: 6218
diff changeset
234 offs = bytestream_get_le32(&buf_pos);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
235
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
236 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
237 chroma_height, buf_pos + offs * 2, fflags2, hdr_pos, buf_pos,
4591
16c24b902f43 use FFMIN
aurel
parents: 3947
diff changeset
238 FFMIN(chroma_width, 40));
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
239
2244
4a0cfd63f078 greyscale decoding (option to skip u,v planes) support
alex
parents: 2028
diff changeset
240 }
4a0cfd63f078 greyscale decoding (option to skip u,v planes) support
alex
parents: 2028
diff changeset
241
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
242 return 8;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
243 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
244
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
245 typedef struct {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
246 long xpos;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
247 long ypos;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
248 long width;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
249 long height;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
250 long split_flag;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
251 long split_direction;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
252 long usl7;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
253 } ustr_t;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
254
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
255 /* ---------------------------------------------------------------------- */
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
256
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
257 #define LV1_CHECK(buf1,rle_v3,lv1,lp2) \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
258 if((lv1 & 0x80) != 0) { \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
259 if(rle_v3 != 0) \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
260 rle_v3 = 0; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
261 else { \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
262 rle_v3 = 1; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
263 buf1 -= 2; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
264 } \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
265 } \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
266 lp2 = 4;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
267
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
268
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
269 #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
270 if(rle_v3 == 0) { \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
271 rle_v2 = *buf1; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
272 rle_v1 = 1; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
273 if(rle_v2 > 32) { \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
274 rle_v2 -= 32; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
275 rle_v1 = 0; \
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 rle_v3 = 1; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
278 } \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
279 buf1--;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
280
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
281
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
282 #define LP2_CHECK(buf1,rle_v3,lp2) \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
283 if(lp2 == 0 && rle_v3 != 0) \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
284 rle_v3 = 0; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
285 else { \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
286 buf1--; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
287 rle_v3 = 1; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
288 }
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 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
292 rle_v2--; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
293 if(rle_v2 == 0) { \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
294 rle_v3 = 0; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
295 buf1 += 2; \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
296 } \
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
297 lp2 = 4;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
298
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
299 static void iv_Decode_Chunk(Indeo3DecodeContext *s,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
300 unsigned char *cur, unsigned char *ref, int width, int height,
6240
michael
parents: 6239
diff changeset
301 const unsigned char *buf1, long fflags2, const unsigned char *hdr,
michael
parents: 6239
diff changeset
302 const unsigned char *buf2, int min_width_160)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
303 {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
304 unsigned char bit_buf;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
305 unsigned long bit_pos, lv, lv1, lv2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
306 long *width_tbl, width_tbl_arr[10];
6240
michael
parents: 6239
diff changeset
307 const signed char *ref_vectors;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
308 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
309 uint32_t *cur_lp, *ref_lp;
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
310 const uint32_t *correction_lp[2], *correctionloworder_lp[2], *correctionhighorder_lp[2];
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
311 unsigned short *correction_type_sp[2];
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
312 ustr_t strip_tbl[20], *strip;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
313 int i, j, k, lp1, lp2, flag1, cmd, blks_width, blks_height, region_160_width,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
314 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
315 unsigned short res;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
316
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
317 bit_buf = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
318 ref_vectors = NULL;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
319
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
320 width_tbl = width_tbl_arr + 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
321 i = (width < 0 ? width + 3 : width)/4;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
322 for(j = -1; j < 8; j++)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
323 width_tbl[j] = i * j;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
324
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
325 strip = strip_tbl;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
326
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
327 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
328
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
329 strip->ypos = strip->xpos = 0;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
330 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
331 strip->height = height;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
332 strip->split_direction = 0;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
333 strip->split_flag = 0;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
334 strip->usl7 = 0;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
335
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
336 bit_pos = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
337
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
338 rle_v1 = rle_v2 = rle_v3 = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
339
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
340 while(strip >= strip_tbl) {
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
341 if(bit_pos <= 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
342 bit_pos = 8;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
343 bit_buf = *buf1++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
344 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
345
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
346 bit_pos -= 2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
347 cmd = (bit_buf >> bit_pos) & 0x03;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
348
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
349 if(cmd == 0) {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
350 strip++;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
351 memcpy(strip, strip-1, sizeof(ustr_t));
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
352 strip->split_flag = 1;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
353 strip->split_direction = 0;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
354 strip->height = (strip->height > 8 ? ((strip->height+8)>>4)<<3 : 4);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
355 continue;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
356 } else if(cmd == 1) {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
357 strip++;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
358 memcpy(strip, strip-1, sizeof(ustr_t));
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
359 strip->split_flag = 1;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
360 strip->split_direction = 1;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
361 strip->width = (strip->width > 8 ? ((strip->width+8)>>4)<<3 : 4);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
362 continue;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
363 } else if(cmd == 2) {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
364 if(strip->usl7 == 0) {
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
365 strip->usl7 = 1;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
366 ref_vectors = NULL;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
367 continue;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
368 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
369 } else if(cmd == 3) {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
370 if(strip->usl7 == 0) {
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
371 strip->usl7 = 1;
6240
michael
parents: 6239
diff changeset
372 ref_vectors = (const signed char*)buf2 + (*buf1 * 2);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
373 buf1++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
374 continue;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
375 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
376 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
377
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
378 cur_frm_pos = cur + width * strip->ypos + strip->xpos;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
379
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
380 if((blks_width = strip->width) < 0)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
381 blks_width += 3;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
382 blks_width >>= 2;
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
383 blks_height = strip->height;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
384
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
385 if(ref_vectors != NULL) {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
386 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
387 ref_vectors[1] + strip->xpos;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
388 } else
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
389 ref_frm_pos = cur_frm_pos - width_tbl[4];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
390
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
391 if(cmd == 2) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
392 if(bit_pos <= 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
393 bit_pos = 8;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
394 bit_buf = *buf1++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
395 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
396
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
397 bit_pos -= 2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
398 cmd = (bit_buf >> bit_pos) & 0x03;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
399
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
400 if(cmd == 0 || ref_vectors != NULL) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
401 for(lp1 = 0; lp1 < blks_width; lp1++) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
402 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
403 ((uint32_t *)cur_frm_pos)[j] = ((uint32_t *)ref_frm_pos)[j];
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
404 cur_frm_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
405 ref_frm_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
406 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
407 } else if(cmd != 1)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
408 return;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
409 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
410 k = *buf1 >> 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
411 j = *buf1 & 0x0f;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
412 buf1++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
413 lv = j + fflags2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
414
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
415 if((lv - 8) <= 7 && (k == 0 || k == 3 || k == 10)) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
416 cp2 = s->ModPred + ((lv - 8) << 7);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
417 cp = ref_frm_pos;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
418 for(i = 0; i < blks_width << 2; i++) {
1454
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
419 int v = *cp >> 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
420 *(cp++) = cp2[v];
1454
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
421 }
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
422 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
423
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
424 if(k == 1 || k == 4) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
425 lv = (hdr[j] & 0xf) + fflags2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
426 correction_type_sp[0] = s->corrector_type + (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
427 correction_lp[0] = correction + (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
428 lv = (hdr[j] >> 4) + fflags2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
429 correction_lp[1] = correction + (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
430 correction_type_sp[1] = s->corrector_type + (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
431 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
432 correctionloworder_lp[0] = correctionloworder_lp[1] = correctionloworder + (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
433 correctionhighorder_lp[0] = correctionhighorder_lp[1] = correctionhighorder + (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
434 correction_type_sp[0] = correction_type_sp[1] = s->corrector_type + (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
435 correction_lp[0] = correction_lp[1] = correction + (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
436 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
437
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
438 switch(k) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
439 case 1:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
440 case 0: /********** CASE 0 **********/
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
441 for( ; blks_height > 0; blks_height -= 4) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
442 for(lp1 = 0; lp1 < blks_width; lp1++) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
443 for(lp2 = 0; lp2 < 4; ) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
444 k = *buf1++;
1454
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
445 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
446 ref_lp = ((uint32_t *)ref_frm_pos) + width_tbl[lp2];
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
447
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
448 switch(correction_type_sp[0][k]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
449 case 0:
2528
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
450 *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
451 lp2++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
452 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
453 case 1:
2549
89ca1169b24c indeo3 for bigendian patch by (demo-n <demo-n users.sourceforge net)
michael
parents: 2528
diff changeset
454 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
455 ((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
456 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
457 ((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
458 buf1++;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
459 lp2++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
460 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
461 case 2:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
462 if(lp2 == 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
463 for(i = 0, j = 0; i < 2; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
464 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
465 lp2 += 2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
466 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
467 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
468 case 3:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
469 if(lp2 < 2) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
470 for(i = 0, j = 0; i < (3 - lp2); i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
471 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
472 lp2 = 3;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
473 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
474 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
475 case 8:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
476 if(lp2 == 0) {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
477 RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
478
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
479 if(rle_v1 == 1 || ref_vectors != NULL) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
480 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
481 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
482 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
483
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
484 RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
485 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
486 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
487 rle_v1 = 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
488 rle_v2 = *buf1 - 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
489 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
490 case 5:
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
491 LP2_CHECK(buf1,rle_v3,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
492 case 4:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
493 for(i = 0, j = 0; i < (4 - lp2); i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
494 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
495 lp2 = 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
496 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
497
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
498 case 7:
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
499 if(rle_v3 != 0)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
500 rle_v3 = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
501 else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
502 buf1--;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
503 rle_v3 = 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
504 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
505 case 6:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
506 if(ref_vectors != NULL) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
507 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
508 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
509 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
510 lp2 = 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
511 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
512
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
513 case 9:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
514 lv1 = *buf1++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
515 lv = (lv1 & 0x7F) << 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
516 lv += (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
517 lv += (lv << 16);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
518 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
519 cur_lp[j] = lv;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
520
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
521 LV1_CHECK(buf1,rle_v3,lv1,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
522 break;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
523 default:
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
524 return;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
525 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
526 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
527
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
528 cur_frm_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
529 ref_frm_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
530 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
531
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
532 cur_frm_pos += ((width - blks_width) * 4);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
533 ref_frm_pos += ((width - blks_width) * 4);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
534 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
535 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
536
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
537 case 4:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
538 case 3: /********** CASE 3 **********/
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
539 if(ref_vectors != NULL)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
540 return;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
541 flag1 = 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
542
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
543 for( ; blks_height > 0; blks_height -= 8) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
544 for(lp1 = 0; lp1 < blks_width; lp1++) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
545 for(lp2 = 0; lp2 < 4; ) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
546 k = *buf1++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
547
1454
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
548 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
549 ref_lp = ((uint32_t *)cur_frm_pos) + width_tbl[(lp2 * 2) - 1];
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
550
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
551 switch(correction_type_sp[lp2 & 0x01][k]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
552 case 0:
2528
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
553 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
554 if(lp2 > 0 || flag1 == 0 || strip->ypos != 0)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
555 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
556 else
2528
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
557 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
558 lp2++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
559 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
560
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
561 case 1:
2549
89ca1169b24c indeo3 for bigendian patch by (demo-n <demo-n users.sourceforge net)
michael
parents: 2528
diff changeset
562 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
563 ((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
564 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
565 ((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
566
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
567 if(lp2 > 0 || flag1 == 0 || strip->ypos != 0)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
568 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
569 else
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
570 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
571 buf1++;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
572 lp2++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
573 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
574
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
575 case 2:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
576 if(lp2 == 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
577 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
578 cur_lp[j] = *ref_lp;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
579 lp2 += 2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
580 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
581 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
582
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
583 case 3:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
584 if(lp2 < 2) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
585 for(i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
586 cur_lp[j] = *ref_lp;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
587 lp2 = 3;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
588 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
589 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
590
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
591 case 6:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
592 lp2 = 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
593 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
594
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
595 case 7:
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
596 if(rle_v3 != 0)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
597 rle_v3 = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
598 else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
599 buf1--;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
600 rle_v3 = 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
601 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
602 lp2 = 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
603 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
604
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
605 case 8:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
606 if(lp2 == 0) {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
607 RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
608
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
609 if(rle_v1 == 1) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
610 for(i = 0, j = 0; i < 8; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
611 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
612 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
613
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
614 RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
615 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
616 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
617 rle_v2 = (*buf1) - 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
618 rle_v1 = 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
619 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
620 case 5:
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
621 LP2_CHECK(buf1,rle_v3,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
622 case 4:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
623 for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
624 cur_lp[j] = *ref_lp;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
625 lp2 = 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
626 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
627
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
628 case 9:
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1481
diff changeset
629 av_log(s->avctx, AV_LOG_ERROR, "UNTESTED.\n");
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
630 lv1 = *buf1++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
631 lv = (lv1 & 0x7F) << 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
632 lv += (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
633 lv += (lv << 16);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
634
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
635 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
636 cur_lp[j] = lv;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
637
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
638 LV1_CHECK(buf1,rle_v3,lv1,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
639 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
640
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
641 default:
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
642 return;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
643 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
644 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
645
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
646 cur_frm_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
647 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
648
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
649 cur_frm_pos += (((width * 2) - blks_width) * 4);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
650 flag1 = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
651 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
652 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
653
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
654 case 10: /********** CASE 10 **********/
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
655 if(ref_vectors == NULL) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
656 flag1 = 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
657
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
658 for( ; blks_height > 0; blks_height -= 8) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
659 for(lp1 = 0; lp1 < blks_width; lp1 += 2) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
660 for(lp2 = 0; lp2 < 4; ) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
661 k = *buf1++;
1454
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
662 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
663 ref_lp = ((uint32_t *)cur_frm_pos) + width_tbl[(lp2 * 2) - 1];
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
664 lv1 = ref_lp[0];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
665 lv2 = ref_lp[1];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
666 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
667 #ifdef WORDS_BIGENDIAN
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
668 lv1 = lv1 & 0xFF00FF00;
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
669 lv1 = (lv1 >> 8) | lv1;
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
670 lv2 = lv2 & 0xFF00FF00;
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
671 lv2 = (lv2 >> 8) | lv2;
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
672 #else
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
673 lv1 = lv1 & 0x00FF00FF;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
674 lv1 = (lv1 << 8) | lv1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
675 lv2 = lv2 & 0x00FF00FF;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
676 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
677 #endif
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
678 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
679
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
680 switch(correction_type_sp[lp2 & 0x01][k]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
681 case 0:
2528
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
682 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
683 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
684 if(lp2 > 0 || strip->ypos != 0 || flag1 == 0) {
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
685 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
686 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
687 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
688 cur_lp[0] = cur_lp[width_tbl[1]];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
689 cur_lp[1] = cur_lp[width_tbl[1]+1];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
690 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
691 lp2++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
692 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
693
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
694 case 1:
2549
89ca1169b24c indeo3 for bigendian patch by (demo-n <demo-n users.sourceforge net)
michael
parents: 2528
diff changeset
695 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
696 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
697 if(lp2 > 0 || strip->ypos != 0 || flag1 == 0) {
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
698 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
699 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
700 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
701 cur_lp[0] = cur_lp[width_tbl[1]];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
702 cur_lp[1] = cur_lp[width_tbl[1]+1];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
703 }
2549
89ca1169b24c indeo3 for bigendian patch by (demo-n <demo-n users.sourceforge net)
michael
parents: 2528
diff changeset
704 buf1++;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
705 lp2++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
706 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
707
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
708 case 2:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
709 if(lp2 == 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
710 if(flag1 != 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
711 for(i = 0, j = width_tbl[1]; i < 3; i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
712 cur_lp[j] = lv1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
713 cur_lp[j+1] = lv2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
714 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
715 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
716 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
717 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
718 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
719 cur_lp[j] = lv1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
720 cur_lp[j+1] = lv2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
721 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
722 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
723 lp2 += 2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
724 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
725 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
726
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
727 case 3:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
728 if(lp2 < 2) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
729 if(lp2 == 0 && flag1 != 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
730 for(i = 0, j = width_tbl[1]; i < 5; i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
731 cur_lp[j] = lv1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
732 cur_lp[j+1] = lv2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
733 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
734 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
735 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
736 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
737 for(i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
738 cur_lp[j] = lv1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
739 cur_lp[j+1] = lv2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
740 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
741 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
742 lp2 = 3;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
743 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
744 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
745
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
746 case 8:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
747 if(lp2 == 0) {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
748 RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
749 if(rle_v1 == 1) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
750 if(flag1 != 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
751 for(i = 0, j = width_tbl[1]; i < 7; i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
752 cur_lp[j] = lv1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
753 cur_lp[j+1] = lv2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
754 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
755 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
756 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
757 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
758 for(i = 0, j = 0; i < 8; i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
759 cur_lp[j] = lv1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
760 cur_lp[j+1] = lv2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
761 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
762 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
763 }
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
764 RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
765 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
766 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
767 rle_v1 = 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
768 rle_v2 = (*buf1) - 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
769 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
770 case 5:
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
771 LP2_CHECK(buf1,rle_v3,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
772 case 4:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
773 if(lp2 == 0 && flag1 != 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
774 for(i = 0, j = width_tbl[1]; i < 7; i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
775 cur_lp[j] = lv1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
776 cur_lp[j+1] = lv2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
777 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
778 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
779 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
780 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
781 for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
782 cur_lp[j] = lv1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
783 cur_lp[j+1] = lv2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
784 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
785 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
786 lp2 = 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
787 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
788
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
789 case 6:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
790 lp2 = 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
791 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
792
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
793 case 7:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
794 if(lp2 == 0) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
795 if(rle_v3 != 0)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
796 rle_v3 = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
797 else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
798 buf1--;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
799 rle_v3 = 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
800 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
801 lp2 = 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
802 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
803 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
804
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
805 case 9:
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1481
diff changeset
806 av_log(s->avctx, AV_LOG_ERROR, "UNTESTED.\n");
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
807 lv1 = *buf1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
808 lv = (lv1 & 0x7F) << 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
809 lv += (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
810 lv += (lv << 16);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
811 for(i = 0, j = 0; i < 8; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
812 cur_lp[j] = lv;
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
813 LV1_CHECK(buf1,rle_v3,lv1,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
814 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
815
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
816 default:
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
817 return;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
818 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
819 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
820
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
821 cur_frm_pos += 8;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
822 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
823
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
824 cur_frm_pos += (((width * 2) - blks_width) * 4);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
825 flag1 = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
826 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
827 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
828 for( ; blks_height > 0; blks_height -= 8) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
829 for(lp1 = 0; lp1 < blks_width; lp1 += 2) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
830 for(lp2 = 0; lp2 < 4; ) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
831 k = *buf1++;
1454
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
832 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
833 ref_lp = ((uint32_t *)ref_frm_pos) + width_tbl[lp2 * 2];
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
834
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
835 switch(correction_type_sp[lp2 & 0x01][k]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
836 case 0:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
837 lv1 = correctionloworder_lp[lp2 & 0x01][k];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
838 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
839 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
840 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
841 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
842 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
843 lp2++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
844 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
845
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
846 case 1:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
847 lv1 = correctionloworder_lp[lp2 & 0x01][*buf1++];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
848 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
849 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
850 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
851 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
852 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
853 lp2++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
854 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
855
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
856 case 2:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
857 if(lp2 == 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
858 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
859 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
860 cur_lp[j+1] = ref_lp[j+1];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
861 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
862 lp2 += 2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
863 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
864 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
865
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
866 case 3:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
867 if(lp2 < 2) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
868 for(i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
869 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
870 cur_lp[j+1] = ref_lp[j+1];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
871 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
872 lp2 = 3;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
873 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
874 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
875
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
876 case 8:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
877 if(lp2 == 0) {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
878 RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
879 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
880 ((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
881 ((uint32_t *)cur_frm_pos)[j+1] = ((uint32_t *)ref_frm_pos)[j+1];
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
882 }
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
883 RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
884 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
885 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
886 rle_v1 = 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
887 rle_v2 = (*buf1) - 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
888 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
889 case 5:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
890 case 7:
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
891 LP2_CHECK(buf1,rle_v3,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
892 case 6:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
893 case 4:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
894 for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
895 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
896 cur_lp[j+1] = ref_lp[j+1];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
897 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
898 lp2 = 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
899 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
900
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
901 case 9:
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1481
diff changeset
902 av_log(s->avctx, AV_LOG_ERROR, "UNTESTED.\n");
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
903 lv1 = *buf1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
904 lv = (lv1 & 0x7F) << 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
905 lv += (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
906 lv += (lv << 16);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
907 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
908 ((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
909 LV1_CHECK(buf1,rle_v3,lv1,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
910 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
911
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
912 default:
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
913 return;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
914 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
915 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
916
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
917 cur_frm_pos += 8;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
918 ref_frm_pos += 8;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
919 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
920
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
921 cur_frm_pos += (((width * 2) - blks_width) * 4);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
922 ref_frm_pos += (((width * 2) - blks_width) * 4);
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 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
926
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
927 case 11: /********** CASE 11 **********/
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
928 if(ref_vectors == NULL)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
929 return;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
930
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
931 for( ; blks_height > 0; blks_height -= 8) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
932 for(lp1 = 0; lp1 < blks_width; lp1++) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
933 for(lp2 = 0; lp2 < 4; ) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
934 k = *buf1++;
1454
8b6e5cca1d37 use const data - began to make code more portable
bellard
parents: 1282
diff changeset
935 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
936 ref_lp = ((uint32_t *)ref_frm_pos) + width_tbl[lp2 * 2];
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
937
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
938 switch(correction_type_sp[lp2 & 0x01][k]) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
939 case 0:
2528
5b738c5093ce indeo3 for bigendian patch by (elf at frogger dot rules dot pl Sebastian Jedruszkiewicz)
michael
parents: 2453
diff changeset
940 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
941 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
942 lp2++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
943 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
944
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
945 case 1:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
946 lv1 = (unsigned short)(correction_lp[lp2 & 0x01][*buf1++]);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
947 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
948 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
949 ((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
950 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
951 ((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
952 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
953 ((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
954 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
955 ((unsigned short *)cur_lp)[width_tbl[2]+1] = le2me_16(res);
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
956 lp2++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
957 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
958
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
959 case 2:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
960 if(lp2 == 0) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
961 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
962 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
963 lp2 += 2;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
964 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
965 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
966
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
967 case 3:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
968 if(lp2 < 2) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
969 for(i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
970 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
971 lp2 = 3;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
972 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
973 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
974
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
975 case 8:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
976 if(lp2 == 0) {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
977 RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
978
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
979 for(i = 0, j = 0; i < 8; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
980 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
981
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
982 RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
983 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
984 } else {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
985 rle_v1 = 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
986 rle_v2 = (*buf1) - 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
987 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
988 case 5:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
989 case 7:
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
990 LP2_CHECK(buf1,rle_v3,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
991 case 4:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
992 case 6:
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
993 for(i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
994 cur_lp[j] = ref_lp[j];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
995 lp2 = 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
996 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
997
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
998 case 9:
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1481
diff changeset
999 av_log(s->avctx, AV_LOG_ERROR, "UNTESTED.\n");
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1000 lv1 = *buf1++;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1001 lv = (lv1 & 0x7F) << 1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1002 lv += (lv << 8);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1003 lv += (lv << 16);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1004 for(i = 0, j = 0; i < 4; i++, j += width_tbl[1])
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1005 cur_lp[j] = lv;
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1006 LV1_CHECK(buf1,rle_v3,lv1,lp2)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1007 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1008
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
1009 default:
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1010 return;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1011 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1012 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1013
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1014 cur_frm_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1015 ref_frm_pos += 4;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1016 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1017
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1018 cur_frm_pos += (((width * 2) - blks_width) * 4);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1019 ref_frm_pos += (((width * 2) - blks_width) * 4);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1020 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1021 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1022
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
1023 default:
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1024 return;
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
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2549
diff changeset
1028 if(strip < strip_tbl)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1029 return;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1030
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1031 for( ; strip >= strip_tbl; strip--) {
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1032 if(strip->split_flag != 0) {
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1033 strip->split_flag = 0;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1034 strip->usl7 = (strip-1)->usl7;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1035
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1036 if(strip->split_direction) {
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1037 strip->xpos += strip->width;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1038 strip->width = (strip-1)->width - strip->width;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1039 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
1040 strip->width = width - strip->xpos;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1041 } else {
1198
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1042 strip->ypos += strip->height;
cae31b22b14e code redundancy reduction, courtesy of suxen_drol -at- hotmail.com
tmmm
parents: 1190
diff changeset
1043 strip->height = (strip-1)->height - strip->height;
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1044 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1045 break;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1046 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1047 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1048 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1049 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1050
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6450
diff changeset
1051 static av_cold int indeo3_decode_init(AVCodecContext *avctx)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1052 {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1053 Indeo3DecodeContext *s = avctx->priv_data;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1054
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1055 s->avctx = avctx;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1056 s->width = avctx->width;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1057 s->height = avctx->height;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1058 avctx->pix_fmt = PIX_FMT_YUV410P;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1059
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1060 build_modpred(s);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1061 iv_alloc_frames(s);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1062
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1063 return 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1064 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1065
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1066 static int indeo3_decode_frame(AVCodecContext *avctx,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1067 void *data, int *data_size,
6218
michael
parents: 6210
diff changeset
1068 const unsigned char *buf, int buf_size)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1069 {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1070 Indeo3DecodeContext *s=avctx->priv_data;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1071 unsigned char *src, *dest;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1072 int y;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1073
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1074 iv_decode_frame(s, buf, buf_size);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1075
1228
d63e0185a90f release buffer cleanup
michaelni
parents: 1198
diff changeset
1076 if(s->frame.data[0])
d63e0185a90f release buffer cleanup
michaelni
parents: 1198
diff changeset
1077 avctx->release_buffer(avctx, &s->frame);
d63e0185a90f release buffer cleanup
michaelni
parents: 1198
diff changeset
1078
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1079 s->frame.reference = 0;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1080 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
1081 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1082 return -1;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1083 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1084
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1085 src = s->cur_frame->Ybuf;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1086 dest = s->frame.data[0];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1087 for (y = 0; y < s->height; y++) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1088 memcpy(dest, src, s->cur_frame->y_w);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1089 src += s->cur_frame->y_w;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1090 dest += s->frame.linesize[0];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1091 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1092
2244
4a0cfd63f078 greyscale decoding (option to skip u,v planes) support
alex
parents: 2028
diff changeset
1093 if (!(s->avctx->flags & CODEC_FLAG_GRAY))
4a0cfd63f078 greyscale decoding (option to skip u,v planes) support
alex
parents: 2028
diff changeset
1094 {
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1095 src = s->cur_frame->Ubuf;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1096 dest = s->frame.data[1];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1097 for (y = 0; y < s->height / 4; y++) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1098 memcpy(dest, src, s->cur_frame->uv_w);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1099 src += s->cur_frame->uv_w;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1100 dest += s->frame.linesize[1];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1101 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1102
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1103 src = s->cur_frame->Vbuf;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1104 dest = s->frame.data[2];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1105 for (y = 0; y < s->height / 4; y++) {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1106 memcpy(dest, src, s->cur_frame->uv_w);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1107 src += s->cur_frame->uv_w;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1108 dest += s->frame.linesize[2];
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1109 }
2244
4a0cfd63f078 greyscale decoding (option to skip u,v planes) support
alex
parents: 2028
diff changeset
1110 }
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1111
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1112 *data_size=sizeof(AVFrame);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1113 *(AVFrame*)data= s->frame;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1114
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1115 return buf_size;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1116 }
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1117
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6450
diff changeset
1118 static av_cold int indeo3_decode_end(AVCodecContext *avctx)
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1119 {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1120 Indeo3DecodeContext *s = avctx->priv_data;
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1121
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1122 iv_free_func(s);
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1123
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1124 return 0;
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 AVCodec indeo3_decoder = {
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1128 "indeo3",
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1129 CODEC_TYPE_VIDEO,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1130 CODEC_ID_INDEO3,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1131 sizeof(Indeo3DecodeContext),
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1132 indeo3_decode_init,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1133 NULL,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1134 indeo3_decode_end,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1135 indeo3_decode_frame,
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1136 0,
6710
a4104482ceef Add long names to many AVCodec declarations.
diego
parents: 6517
diff changeset
1137 NULL,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6710
diff changeset
1138 .long_name = NULL_IF_CONFIG_SMALL("Intel Indeo 3"),
1190
60bd91a6e218 native Indeo3 decoder implementation
tmmm
parents:
diff changeset
1139 };