annotate indeo3.c @ 2497:69adfbbdcdeb libavcodec

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