Mercurial > libavcodec.hg
annotate interplayvideo.c @ 11864:7204cb7dd601 libavcodec
Quant changes only once per MB so move the corresponding scale factor assignment
out of the block decoding loop. Indeo4 doesn't use any scale table but the quant
level itself as scale. Therefore access scale table only if its pointer != NULL.
author | maxim |
---|---|
date | Thu, 10 Jun 2010 17:31:12 +0000 |
parents | 7dd2a45249a9 |
children |
rev | line source |
---|---|
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1 /* |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
2 * Interplay MVE Video Decoder |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
3 * Copyright (C) 2003 the ffmpeg project |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
4 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
9 * License as published by the Free Software Foundation; either |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
16 * |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2962
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
20 */ |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
21 |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
22 /** |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11560
diff
changeset
|
23 * @file |
1468 | 24 * Interplay MVE Video Decoder by Mike Melanson (melanson@pcisys.net) |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
25 * For more information about the Interplay MVE format, visit: |
1468 | 26 * http://www.pcisys.net/~melanson/codecs/interplay-mve.txt |
27 * This code is written in such a way that the identifiers match up | |
28 * with the encoding descriptions in the document. | |
29 * | |
30 * This decoder presently only supports a PAL8 output colorspace. | |
31 * | |
32 * An Interplay video frame consists of 2 parts: The decoding map and | |
33 * the video data. A demuxer must load these 2 parts together in a single | |
34 * buffer before sending it through the stream to this decoder. | |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
35 */ |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
36 |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
37 #include <stdio.h> |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
38 #include <stdlib.h> |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
39 #include <string.h> |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
40 |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
41 #include "avcodec.h" |
5089 | 42 #include "bytestream.h" |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
43 #include "dsputil.h" |
9494
e09e4c095fdb
Simplify ipvideo_decode_opcodes by using get_bits, this might be slower
reimar
parents:
9493
diff
changeset
|
44 #define ALT_BITSTREAM_READER_LE |
e09e4c095fdb
Simplify ipvideo_decode_opcodes by using get_bits, this might be slower
reimar
parents:
9493
diff
changeset
|
45 #include "get_bits.h" |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
46 |
1468 | 47 #define PALETTE_COUNT 256 |
48 | |
49 /* debugging support */ | |
50 #define DEBUG_INTERPLAY 0 | |
51 #if DEBUG_INTERPLAY | |
2515 | 52 #define debug_interplay(x,...) av_log(NULL, AV_LOG_DEBUG, x, __VA_ARGS__) |
1468 | 53 #else |
54 static inline void debug_interplay(const char *format, ...) { } | |
55 #endif | |
56 | |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
57 typedef struct IpvideoContext { |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
58 |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
59 AVCodecContext *avctx; |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
60 DSPContext dsp; |
1474
94c7f7c23dd9
video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents:
1473
diff
changeset
|
61 AVFrame second_last_frame; |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
62 AVFrame last_frame; |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
63 AVFrame current_frame; |
6218 | 64 const unsigned char *decoding_map; |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
65 int decoding_map_size; |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
66 |
6218 | 67 const unsigned char *buf; |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
68 int size; |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
69 |
10712 | 70 int is_16bpp; |
6218 | 71 const unsigned char *stream_ptr; |
72 const unsigned char *stream_end; | |
10718
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
73 const uint8_t *mv_ptr; |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
74 const uint8_t *mv_end; |
1475 | 75 unsigned char *pixel_ptr; |
76 int line_inc; | |
77 int stride; | |
78 int upper_motion_limit_offset; | |
79 | |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
80 } IpvideoContext; |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
81 |
10713
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
82 #define CHECK_STREAM_PTR(stream_ptr, stream_end, n) \ |
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
83 if (stream_end - stream_ptr < n) { \ |
10709 | 84 av_log(s->avctx, AV_LOG_ERROR, "Interplay video warning: stream_ptr out of bounds (%p >= %p)\n", \ |
10713
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
85 stream_ptr + n, stream_end); \ |
10709 | 86 return -1; \ |
87 } | |
1468 | 88 |
9277
b8e5b7edb2d5
Merge the 3 COPY_FROM_* macros with lots of duplicated code into a single
reimar
parents:
9276
diff
changeset
|
89 static int copy_from(IpvideoContext *s, AVFrame *src, int delta_x, int delta_y) |
b8e5b7edb2d5
Merge the 3 COPY_FROM_* macros with lots of duplicated code into a single
reimar
parents:
9276
diff
changeset
|
90 { |
b8e5b7edb2d5
Merge the 3 COPY_FROM_* macros with lots of duplicated code into a single
reimar
parents:
9276
diff
changeset
|
91 int current_offset = s->pixel_ptr - s->current_frame.data[0]; |
10716
e64842a691d8
cosmetics: reindent and break long lines after last commits
kostya
parents:
10715
diff
changeset
|
92 int motion_offset = current_offset + delta_y * s->current_frame.linesize[0] |
e64842a691d8
cosmetics: reindent and break long lines after last commits
kostya
parents:
10715
diff
changeset
|
93 + delta_x * (1 + s->is_16bpp); |
9277
b8e5b7edb2d5
Merge the 3 COPY_FROM_* macros with lots of duplicated code into a single
reimar
parents:
9276
diff
changeset
|
94 if (motion_offset < 0) { |
b8e5b7edb2d5
Merge the 3 COPY_FROM_* macros with lots of duplicated code into a single
reimar
parents:
9276
diff
changeset
|
95 av_log(s->avctx, AV_LOG_ERROR, " Interplay video: motion offset < 0 (%d)\n", motion_offset); |
b8e5b7edb2d5
Merge the 3 COPY_FROM_* macros with lots of duplicated code into a single
reimar
parents:
9276
diff
changeset
|
96 return -1; |
b8e5b7edb2d5
Merge the 3 COPY_FROM_* macros with lots of duplicated code into a single
reimar
parents:
9276
diff
changeset
|
97 } else if (motion_offset > s->upper_motion_limit_offset) { |
b8e5b7edb2d5
Merge the 3 COPY_FROM_* macros with lots of duplicated code into a single
reimar
parents:
9276
diff
changeset
|
98 av_log(s->avctx, AV_LOG_ERROR, " Interplay video: motion offset above limit (%d >= %d)\n", |
b8e5b7edb2d5
Merge the 3 COPY_FROM_* macros with lots of duplicated code into a single
reimar
parents:
9276
diff
changeset
|
99 motion_offset, s->upper_motion_limit_offset); |
b8e5b7edb2d5
Merge the 3 COPY_FROM_* macros with lots of duplicated code into a single
reimar
parents:
9276
diff
changeset
|
100 return -1; |
b8e5b7edb2d5
Merge the 3 COPY_FROM_* macros with lots of duplicated code into a single
reimar
parents:
9276
diff
changeset
|
101 } |
10716
e64842a691d8
cosmetics: reindent and break long lines after last commits
kostya
parents:
10715
diff
changeset
|
102 s->dsp.put_pixels_tab[!s->is_16bpp][0](s->pixel_ptr, src->data[0] + motion_offset, |
e64842a691d8
cosmetics: reindent and break long lines after last commits
kostya
parents:
10715
diff
changeset
|
103 s->current_frame.linesize[0], 8); |
9277
b8e5b7edb2d5
Merge the 3 COPY_FROM_* macros with lots of duplicated code into a single
reimar
parents:
9276
diff
changeset
|
104 return 0; |
b8e5b7edb2d5
Merge the 3 COPY_FROM_* macros with lots of duplicated code into a single
reimar
parents:
9276
diff
changeset
|
105 } |
1475 | 106 |
107 static int ipvideo_decode_block_opcode_0x0(IpvideoContext *s) | |
1468 | 108 { |
9277
b8e5b7edb2d5
Merge the 3 COPY_FROM_* macros with lots of duplicated code into a single
reimar
parents:
9276
diff
changeset
|
109 return copy_from(s, &s->last_frame, 0, 0); |
1468 | 110 } |
111 | |
1475 | 112 static int ipvideo_decode_block_opcode_0x1(IpvideoContext *s) |
1474
94c7f7c23dd9
video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents:
1473
diff
changeset
|
113 { |
9277
b8e5b7edb2d5
Merge the 3 COPY_FROM_* macros with lots of duplicated code into a single
reimar
parents:
9276
diff
changeset
|
114 return copy_from(s, &s->second_last_frame, 0, 0); |
1474
94c7f7c23dd9
video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents:
1473
diff
changeset
|
115 } |
94c7f7c23dd9
video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents:
1473
diff
changeset
|
116 |
1475 | 117 static int ipvideo_decode_block_opcode_0x2(IpvideoContext *s) |
1468 | 118 { |
119 unsigned char B; | |
120 int x, y; | |
121 | |
1475 | 122 /* copy block from 2 frames ago using a motion vector; need 1 more byte */ |
10718
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
123 if (!s->is_16bpp) { |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
124 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 1); |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
125 B = *s->stream_ptr++; |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
126 } else { |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
127 CHECK_STREAM_PTR(s->mv_ptr, s->mv_end, 1); |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
128 B = *s->mv_ptr++; |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
129 } |
1468 | 130 |
131 if (B < 56) { | |
132 x = 8 + (B % 7); | |
133 y = B / 7; | |
134 } else { | |
135 x = -14 + ((B - 56) % 29); | |
136 y = 8 + ((B - 56) / 29); | |
137 } | |
138 | |
139 debug_interplay (" motion byte = %d, (x, y) = (%d, %d)\n", B, x, y); | |
9277
b8e5b7edb2d5
Merge the 3 COPY_FROM_* macros with lots of duplicated code into a single
reimar
parents:
9276
diff
changeset
|
140 return copy_from(s, &s->second_last_frame, x, y); |
1468 | 141 } |
142 | |
1475 | 143 static int ipvideo_decode_block_opcode_0x3(IpvideoContext *s) |
1468 | 144 { |
145 unsigned char B; | |
146 int x, y; | |
147 | |
148 /* copy 8x8 block from current frame from an up/left block */ | |
149 | |
150 /* need 1 more byte for motion */ | |
10718
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
151 if (!s->is_16bpp) { |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
152 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 1); |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
153 B = *s->stream_ptr++; |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
154 } else { |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
155 CHECK_STREAM_PTR(s->mv_ptr, s->mv_end, 1); |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
156 B = *s->mv_ptr++; |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
157 } |
1468 | 158 |
159 if (B < 56) { | |
160 x = -(8 + (B % 7)); | |
161 y = -(B / 7); | |
162 } else { | |
163 x = -(-14 + ((B - 56) % 29)); | |
164 y = -( 8 + ((B - 56) / 29)); | |
165 } | |
166 | |
167 debug_interplay (" motion byte = %d, (x, y) = (%d, %d)\n", B, x, y); | |
9277
b8e5b7edb2d5
Merge the 3 COPY_FROM_* macros with lots of duplicated code into a single
reimar
parents:
9276
diff
changeset
|
168 return copy_from(s, &s->current_frame, x, y); |
1468 | 169 } |
170 | |
1475 | 171 static int ipvideo_decode_block_opcode_0x4(IpvideoContext *s) |
1468 | 172 { |
173 int x, y; | |
174 unsigned char B, BL, BH; | |
175 | |
176 /* copy a block from the previous frame; need 1 more byte */ | |
10718
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
177 if (!s->is_16bpp) { |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
178 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 1); |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
179 B = *s->stream_ptr++; |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
180 } else { |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
181 CHECK_STREAM_PTR(s->mv_ptr, s->mv_end, 1); |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
182 B = *s->mv_ptr++; |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
183 } |
1468 | 184 |
185 BL = B & 0x0F; | |
186 BH = (B >> 4) & 0x0F; | |
187 x = -8 + BL; | |
188 y = -8 + BH; | |
189 | |
190 debug_interplay (" motion byte = %d, (x, y) = (%d, %d)\n", B, x, y); | |
9277
b8e5b7edb2d5
Merge the 3 COPY_FROM_* macros with lots of duplicated code into a single
reimar
parents:
9276
diff
changeset
|
191 return copy_from(s, &s->last_frame, x, y); |
1468 | 192 } |
193 | |
1475 | 194 static int ipvideo_decode_block_opcode_0x5(IpvideoContext *s) |
1468 | 195 { |
196 signed char x, y; | |
197 | |
198 /* copy a block from the previous frame using an expanded range; | |
199 * need 2 more bytes */ | |
10713
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
200 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 2); |
1468 | 201 |
1475 | 202 x = *s->stream_ptr++; |
203 y = *s->stream_ptr++; | |
1468 | 204 |
205 debug_interplay (" motion bytes = %d, %d\n", x, y); | |
9277
b8e5b7edb2d5
Merge the 3 COPY_FROM_* macros with lots of duplicated code into a single
reimar
parents:
9276
diff
changeset
|
206 return copy_from(s, &s->last_frame, x, y); |
1468 | 207 } |
208 | |
1475 | 209 static int ipvideo_decode_block_opcode_0x6(IpvideoContext *s) |
1468 | 210 { |
211 /* mystery opcode? skip multiple blocks? */ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1585
diff
changeset
|
212 av_log(s->avctx, AV_LOG_ERROR, " Interplay video: Help! Mystery opcode 0x6 seen\n"); |
1468 | 213 |
214 /* report success */ | |
215 return 0; | |
216 } | |
217 | |
1475 | 218 static int ipvideo_decode_block_opcode_0x7(IpvideoContext *s) |
1468 | 219 { |
220 int x, y; | |
9298
9698f0d03ed9
Avoid code duplication by using ?: and array indexing instead of if..else
reimar
parents:
9297
diff
changeset
|
221 unsigned char P[2]; |
1468 | 222 unsigned int flags; |
223 | |
224 /* 2-color encoding */ | |
10713
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
225 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 2); |
1468 | 226 |
9298
9698f0d03ed9
Avoid code duplication by using ?: and array indexing instead of if..else
reimar
parents:
9297
diff
changeset
|
227 P[0] = *s->stream_ptr++; |
9698f0d03ed9
Avoid code duplication by using ?: and array indexing instead of if..else
reimar
parents:
9297
diff
changeset
|
228 P[1] = *s->stream_ptr++; |
1468 | 229 |
9298
9698f0d03ed9
Avoid code duplication by using ?: and array indexing instead of if..else
reimar
parents:
9297
diff
changeset
|
230 if (P[0] <= P[1]) { |
1468 | 231 |
232 /* need 8 more bytes from the stream */ | |
10713
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
233 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 8); |
1468 | 234 |
235 for (y = 0; y < 8; y++) { | |
9307
851ca5db8327
Avoid the last two uses of bitmasks in interplayvideo
reimar
parents:
9306
diff
changeset
|
236 flags = *s->stream_ptr++ | 0x100; |
9319 | 237 for (; flags != 1; flags >>= 1) |
9307
851ca5db8327
Avoid the last two uses of bitmasks in interplayvideo
reimar
parents:
9306
diff
changeset
|
238 *s->pixel_ptr++ = P[flags & 1]; |
1475 | 239 s->pixel_ptr += s->line_inc; |
1468 | 240 } |
241 | |
242 } else { | |
243 | |
244 /* need 2 more bytes from the stream */ | |
10713
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
245 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 2); |
1468 | 246 |
5089 | 247 flags = bytestream_get_le16(&s->stream_ptr); |
1468 | 248 for (y = 0; y < 8; y += 2) { |
9296
2129ee5b7e0d
Get rid of some pointless bitmask/shifter variables in interplayvideo.c
reimar
parents:
9277
diff
changeset
|
249 for (x = 0; x < 8; x += 2, flags >>= 1) { |
9299 | 250 s->pixel_ptr[x ] = |
251 s->pixel_ptr[x + 1 ] = | |
252 s->pixel_ptr[x + s->stride] = | |
253 s->pixel_ptr[x + 1 + s->stride] = P[flags & 1]; | |
1468 | 254 } |
1475 | 255 s->pixel_ptr += s->stride * 2; |
1468 | 256 } |
257 } | |
258 | |
259 /* report success */ | |
260 return 0; | |
261 } | |
262 | |
1475 | 263 static int ipvideo_decode_block_opcode_0x8(IpvideoContext *s) |
1468 | 264 { |
265 int x, y; | |
9312
601e91e470e7
Make ipvideo_decode_block_opcode_0x8 a lot simpler by decoding the pixels
reimar
parents:
9311
diff
changeset
|
266 unsigned char P[2]; |
1468 | 267 unsigned int flags = 0; |
268 | |
269 /* 2-color encoding for each 4x4 quadrant, or 2-color encoding on | |
270 * either top and bottom or left and right halves */ | |
10713
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
271 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 2); |
1468 | 272 |
1475 | 273 P[0] = *s->stream_ptr++; |
274 P[1] = *s->stream_ptr++; | |
1468 | 275 |
276 if (P[0] <= P[1]) { | |
277 | |
10713
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
278 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 14); |
9312
601e91e470e7
Make ipvideo_decode_block_opcode_0x8 a lot simpler by decoding the pixels
reimar
parents:
9311
diff
changeset
|
279 s->stream_ptr -= 2; |
1468 | 280 |
9312
601e91e470e7
Make ipvideo_decode_block_opcode_0x8 a lot simpler by decoding the pixels
reimar
parents:
9311
diff
changeset
|
281 for (y = 0; y < 16; y++) { |
601e91e470e7
Make ipvideo_decode_block_opcode_0x8 a lot simpler by decoding the pixels
reimar
parents:
9311
diff
changeset
|
282 // new values for each 4x4 block |
601e91e470e7
Make ipvideo_decode_block_opcode_0x8 a lot simpler by decoding the pixels
reimar
parents:
9311
diff
changeset
|
283 if (!(y & 3)) { |
601e91e470e7
Make ipvideo_decode_block_opcode_0x8 a lot simpler by decoding the pixels
reimar
parents:
9311
diff
changeset
|
284 P[0] = *s->stream_ptr++; P[1] = *s->stream_ptr++; |
601e91e470e7
Make ipvideo_decode_block_opcode_0x8 a lot simpler by decoding the pixels
reimar
parents:
9311
diff
changeset
|
285 flags = bytestream_get_le16(&s->stream_ptr); |
1468 | 286 } |
287 | |
9319 | 288 for (x = 0; x < 4; x++, flags >>= 1) |
9312
601e91e470e7
Make ipvideo_decode_block_opcode_0x8 a lot simpler by decoding the pixels
reimar
parents:
9311
diff
changeset
|
289 *s->pixel_ptr++ = P[flags & 1]; |
601e91e470e7
Make ipvideo_decode_block_opcode_0x8 a lot simpler by decoding the pixels
reimar
parents:
9311
diff
changeset
|
290 s->pixel_ptr += s->stride - 4; |
601e91e470e7
Make ipvideo_decode_block_opcode_0x8 a lot simpler by decoding the pixels
reimar
parents:
9311
diff
changeset
|
291 // switch to right half |
601e91e470e7
Make ipvideo_decode_block_opcode_0x8 a lot simpler by decoding the pixels
reimar
parents:
9311
diff
changeset
|
292 if (y == 7) s->pixel_ptr -= 8 * s->stride - 4; |
1468 | 293 } |
294 | |
295 } else { | |
296 | |
297 /* need 10 more bytes */ | |
10713
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
298 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 10); |
1468 | 299 |
9306 | 300 if (s->stream_ptr[4] <= s->stream_ptr[5]) { |
1468 | 301 |
9312
601e91e470e7
Make ipvideo_decode_block_opcode_0x8 a lot simpler by decoding the pixels
reimar
parents:
9311
diff
changeset
|
302 flags = bytestream_get_le32(&s->stream_ptr); |
9300
6a1aacfa3043
Slightly simplify part of ipvideo_decode_block_opcode_0x8
reimar
parents:
9299
diff
changeset
|
303 |
1468 | 304 /* vertical split; left & right halves are 2-color encoded */ |
305 | |
9312
601e91e470e7
Make ipvideo_decode_block_opcode_0x8 a lot simpler by decoding the pixels
reimar
parents:
9311
diff
changeset
|
306 for (y = 0; y < 16; y++) { |
9319 | 307 for (x = 0; x < 4; x++, flags >>= 1) |
9312
601e91e470e7
Make ipvideo_decode_block_opcode_0x8 a lot simpler by decoding the pixels
reimar
parents:
9311
diff
changeset
|
308 *s->pixel_ptr++ = P[flags & 1]; |
601e91e470e7
Make ipvideo_decode_block_opcode_0x8 a lot simpler by decoding the pixels
reimar
parents:
9311
diff
changeset
|
309 s->pixel_ptr += s->stride - 4; |
601e91e470e7
Make ipvideo_decode_block_opcode_0x8 a lot simpler by decoding the pixels
reimar
parents:
9311
diff
changeset
|
310 // switch to right half |
601e91e470e7
Make ipvideo_decode_block_opcode_0x8 a lot simpler by decoding the pixels
reimar
parents:
9311
diff
changeset
|
311 if (y == 7) { |
601e91e470e7
Make ipvideo_decode_block_opcode_0x8 a lot simpler by decoding the pixels
reimar
parents:
9311
diff
changeset
|
312 s->pixel_ptr -= 8 * s->stride - 4; |
601e91e470e7
Make ipvideo_decode_block_opcode_0x8 a lot simpler by decoding the pixels
reimar
parents:
9311
diff
changeset
|
313 P[0] = *s->stream_ptr++; P[1] = *s->stream_ptr++; |
601e91e470e7
Make ipvideo_decode_block_opcode_0x8 a lot simpler by decoding the pixels
reimar
parents:
9311
diff
changeset
|
314 flags = bytestream_get_le32(&s->stream_ptr); |
1468 | 315 } |
316 } | |
317 | |
318 } else { | |
319 | |
320 /* horizontal split; top & bottom halves are 2-color encoded */ | |
321 | |
322 for (y = 0; y < 8; y++) { | |
9300
6a1aacfa3043
Slightly simplify part of ipvideo_decode_block_opcode_0x8
reimar
parents:
9299
diff
changeset
|
323 if (y == 4) { |
6a1aacfa3043
Slightly simplify part of ipvideo_decode_block_opcode_0x8
reimar
parents:
9299
diff
changeset
|
324 P[0] = *s->stream_ptr++; |
6a1aacfa3043
Slightly simplify part of ipvideo_decode_block_opcode_0x8
reimar
parents:
9299
diff
changeset
|
325 P[1] = *s->stream_ptr++; |
1468 | 326 } |
9307
851ca5db8327
Avoid the last two uses of bitmasks in interplayvideo
reimar
parents:
9306
diff
changeset
|
327 flags = *s->stream_ptr++ | 0x100; |
1468 | 328 |
9319 | 329 for (; flags != 1; flags >>= 1) |
9307
851ca5db8327
Avoid the last two uses of bitmasks in interplayvideo
reimar
parents:
9306
diff
changeset
|
330 *s->pixel_ptr++ = P[flags & 1]; |
1475 | 331 s->pixel_ptr += s->line_inc; |
1468 | 332 } |
333 } | |
334 } | |
335 | |
336 /* report success */ | |
337 return 0; | |
338 } | |
339 | |
1475 | 340 static int ipvideo_decode_block_opcode_0x9(IpvideoContext *s) |
1468 | 341 { |
342 int x, y; | |
343 unsigned char P[4]; | |
344 | |
345 /* 4-color encoding */ | |
10713
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
346 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 4); |
1468 | 347 |
9273
42c63846b321
Replace many tiny loops in the interplayvideo decoder by memset, memcpy
reimar
parents:
9272
diff
changeset
|
348 memcpy(P, s->stream_ptr, 4); |
42c63846b321
Replace many tiny loops in the interplayvideo decoder by memset, memcpy
reimar
parents:
9272
diff
changeset
|
349 s->stream_ptr += 4; |
1468 | 350 |
9303
2ae6ab3fa3ba
Rearrange how the different cases are checked to reduce the number of
reimar
parents:
9302
diff
changeset
|
351 if (P[0] <= P[1]) { |
2ae6ab3fa3ba
Rearrange how the different cases are checked to reduce the number of
reimar
parents:
9302
diff
changeset
|
352 if (P[2] <= P[3]) { |
1468 | 353 |
9305 | 354 /* 1 of 4 colors for each pixel, need 16 more bytes */ |
10713
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
355 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 16); |
1468 | 356 |
9305 | 357 for (y = 0; y < 8; y++) { |
358 /* get the next set of 8 2-bit flags */ | |
359 int flags = bytestream_get_le16(&s->stream_ptr); | |
9319 | 360 for (x = 0; x < 8; x++, flags >>= 2) |
9305 | 361 *s->pixel_ptr++ = P[flags & 0x03]; |
362 s->pixel_ptr += s->line_inc; | |
1468 | 363 } |
364 | |
9303
2ae6ab3fa3ba
Rearrange how the different cases are checked to reduce the number of
reimar
parents:
9302
diff
changeset
|
365 } else { |
9305 | 366 uint32_t flags; |
1468 | 367 |
9305 | 368 /* 1 of 4 colors for each 2x2 block, need 4 more bytes */ |
10713
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
369 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 4); |
1468 | 370 |
9305 | 371 flags = bytestream_get_le32(&s->stream_ptr); |
1468 | 372 |
9305 | 373 for (y = 0; y < 8; y += 2) { |
374 for (x = 0; x < 8; x += 2, flags >>= 2) { | |
375 s->pixel_ptr[x ] = | |
376 s->pixel_ptr[x + 1 ] = | |
377 s->pixel_ptr[x + s->stride] = | |
378 s->pixel_ptr[x + 1 + s->stride] = P[flags & 0x03]; | |
379 } | |
380 s->pixel_ptr += s->stride * 2; | |
1468 | 381 } |
382 | |
9303
2ae6ab3fa3ba
Rearrange how the different cases are checked to reduce the number of
reimar
parents:
9302
diff
changeset
|
383 } |
2ae6ab3fa3ba
Rearrange how the different cases are checked to reduce the number of
reimar
parents:
9302
diff
changeset
|
384 } else { |
9302
0469949a5224
Avoid "reloading" code by using a 64 bit type for the flags and loading all at once.
reimar
parents:
9301
diff
changeset
|
385 uint64_t flags; |
1468 | 386 |
9304 | 387 /* 1 of 4 colors for each 2x1 or 1x2 block, need 8 more bytes */ |
10713
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
388 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 8); |
1468 | 389 |
9302
0469949a5224
Avoid "reloading" code by using a 64 bit type for the flags and loading all at once.
reimar
parents:
9301
diff
changeset
|
390 flags = bytestream_get_le64(&s->stream_ptr); |
9304 | 391 if (P[2] <= P[3]) { |
9305 | 392 for (y = 0; y < 8; y++) { |
393 for (x = 0; x < 8; x += 2, flags >>= 2) { | |
394 s->pixel_ptr[x ] = | |
395 s->pixel_ptr[x + 1] = P[flags & 0x03]; | |
396 } | |
397 s->pixel_ptr += s->stride; | |
1468 | 398 } |
9303
2ae6ab3fa3ba
Rearrange how the different cases are checked to reduce the number of
reimar
parents:
9302
diff
changeset
|
399 } else { |
9305 | 400 for (y = 0; y < 8; y += 2) { |
401 for (x = 0; x < 8; x++, flags >>= 2) { | |
402 s->pixel_ptr[x ] = | |
403 s->pixel_ptr[x + s->stride] = P[flags & 0x03]; | |
404 } | |
405 s->pixel_ptr += s->stride * 2; | |
1468 | 406 } |
9303
2ae6ab3fa3ba
Rearrange how the different cases are checked to reduce the number of
reimar
parents:
9302
diff
changeset
|
407 } |
1468 | 408 } |
409 | |
410 /* report success */ | |
411 return 0; | |
412 } | |
413 | |
1475 | 414 static int ipvideo_decode_block_opcode_0xA(IpvideoContext *s) |
1468 | 415 { |
416 int x, y; | |
9317
2c06c31c8664
One more simplification for ipvideo_decode_block_opcode_0xA
reimar
parents:
9315
diff
changeset
|
417 unsigned char P[4]; |
1468 | 418 int flags = 0; |
419 | |
420 /* 4-color encoding for each 4x4 quadrant, or 4-color encoding on | |
421 * either top and bottom or left and right halves */ | |
10713
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
422 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 24); |
1468 | 423 |
9317
2c06c31c8664
One more simplification for ipvideo_decode_block_opcode_0xA
reimar
parents:
9315
diff
changeset
|
424 if (s->stream_ptr[0] <= s->stream_ptr[1]) { |
1468 | 425 |
9317
2c06c31c8664
One more simplification for ipvideo_decode_block_opcode_0xA
reimar
parents:
9315
diff
changeset
|
426 /* 4-color encoding for each quadrant; need 32 bytes */ |
10713
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
427 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 32); |
1468 | 428 |
9315
a476e5590725
Slightly simplify first part of ipvideo_decode_block_opcode_0xA,
reimar
parents:
9312
diff
changeset
|
429 for (y = 0; y < 16; y++) { |
a476e5590725
Slightly simplify first part of ipvideo_decode_block_opcode_0xA,
reimar
parents:
9312
diff
changeset
|
430 // new values for each 4x4 block |
a476e5590725
Slightly simplify first part of ipvideo_decode_block_opcode_0xA,
reimar
parents:
9312
diff
changeset
|
431 if (!(y & 3)) { |
a476e5590725
Slightly simplify first part of ipvideo_decode_block_opcode_0xA,
reimar
parents:
9312
diff
changeset
|
432 memcpy(P, s->stream_ptr, 4); |
a476e5590725
Slightly simplify first part of ipvideo_decode_block_opcode_0xA,
reimar
parents:
9312
diff
changeset
|
433 s->stream_ptr += 4; |
a476e5590725
Slightly simplify first part of ipvideo_decode_block_opcode_0xA,
reimar
parents:
9312
diff
changeset
|
434 flags = bytestream_get_le32(&s->stream_ptr); |
1468 | 435 } |
436 | |
9319 | 437 for (x = 0; x < 4; x++, flags >>= 2) |
9315
a476e5590725
Slightly simplify first part of ipvideo_decode_block_opcode_0xA,
reimar
parents:
9312
diff
changeset
|
438 *s->pixel_ptr++ = P[flags & 0x03]; |
a476e5590725
Slightly simplify first part of ipvideo_decode_block_opcode_0xA,
reimar
parents:
9312
diff
changeset
|
439 |
a476e5590725
Slightly simplify first part of ipvideo_decode_block_opcode_0xA,
reimar
parents:
9312
diff
changeset
|
440 s->pixel_ptr += s->stride - 4; |
a476e5590725
Slightly simplify first part of ipvideo_decode_block_opcode_0xA,
reimar
parents:
9312
diff
changeset
|
441 // switch to right half |
a476e5590725
Slightly simplify first part of ipvideo_decode_block_opcode_0xA,
reimar
parents:
9312
diff
changeset
|
442 if (y == 7) s->pixel_ptr -= 8 * s->stride - 4; |
1468 | 443 } |
444 | |
445 } else { | |
9317
2c06c31c8664
One more simplification for ipvideo_decode_block_opcode_0xA
reimar
parents:
9315
diff
changeset
|
446 // vertical split? |
2c06c31c8664
One more simplification for ipvideo_decode_block_opcode_0xA
reimar
parents:
9315
diff
changeset
|
447 int vert = s->stream_ptr[12] <= s->stream_ptr[13]; |
2c06c31c8664
One more simplification for ipvideo_decode_block_opcode_0xA
reimar
parents:
9315
diff
changeset
|
448 uint64_t flags = 0; |
1468 | 449 |
450 /* 4-color encoding for either left and right or top and bottom | |
9317
2c06c31c8664
One more simplification for ipvideo_decode_block_opcode_0xA
reimar
parents:
9315
diff
changeset
|
451 * halves */ |
1468 | 452 |
9317
2c06c31c8664
One more simplification for ipvideo_decode_block_opcode_0xA
reimar
parents:
9315
diff
changeset
|
453 for (y = 0; y < 16; y++) { |
2c06c31c8664
One more simplification for ipvideo_decode_block_opcode_0xA
reimar
parents:
9315
diff
changeset
|
454 // load values for each half |
2c06c31c8664
One more simplification for ipvideo_decode_block_opcode_0xA
reimar
parents:
9315
diff
changeset
|
455 if (!(y & 7)) { |
2c06c31c8664
One more simplification for ipvideo_decode_block_opcode_0xA
reimar
parents:
9315
diff
changeset
|
456 memcpy(P, s->stream_ptr, 4); |
2c06c31c8664
One more simplification for ipvideo_decode_block_opcode_0xA
reimar
parents:
9315
diff
changeset
|
457 s->stream_ptr += 4; |
2c06c31c8664
One more simplification for ipvideo_decode_block_opcode_0xA
reimar
parents:
9315
diff
changeset
|
458 flags = bytestream_get_le64(&s->stream_ptr); |
1468 | 459 } |
460 | |
9317
2c06c31c8664
One more simplification for ipvideo_decode_block_opcode_0xA
reimar
parents:
9315
diff
changeset
|
461 for (x = 0; x < 4; x++, flags >>= 2) |
2c06c31c8664
One more simplification for ipvideo_decode_block_opcode_0xA
reimar
parents:
9315
diff
changeset
|
462 *s->pixel_ptr++ = P[flags & 0x03]; |
1468 | 463 |
9317
2c06c31c8664
One more simplification for ipvideo_decode_block_opcode_0xA
reimar
parents:
9315
diff
changeset
|
464 if (vert) { |
2c06c31c8664
One more simplification for ipvideo_decode_block_opcode_0xA
reimar
parents:
9315
diff
changeset
|
465 s->pixel_ptr += s->stride - 4; |
2c06c31c8664
One more simplification for ipvideo_decode_block_opcode_0xA
reimar
parents:
9315
diff
changeset
|
466 // switch to right half |
2c06c31c8664
One more simplification for ipvideo_decode_block_opcode_0xA
reimar
parents:
9315
diff
changeset
|
467 if (y == 7) s->pixel_ptr -= 8 * s->stride - 4; |
2c06c31c8664
One more simplification for ipvideo_decode_block_opcode_0xA
reimar
parents:
9315
diff
changeset
|
468 } else if (y & 1) s->pixel_ptr += s->line_inc; |
1468 | 469 } |
470 } | |
471 | |
472 /* report success */ | |
473 return 0; | |
474 } | |
475 | |
1475 | 476 static int ipvideo_decode_block_opcode_0xB(IpvideoContext *s) |
1468 | 477 { |
9273
42c63846b321
Replace many tiny loops in the interplayvideo decoder by memset, memcpy
reimar
parents:
9272
diff
changeset
|
478 int y; |
1468 | 479 |
480 /* 64-color encoding (each pixel in block is a different color) */ | |
10713
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
481 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 64); |
1468 | 482 |
483 for (y = 0; y < 8; y++) { | |
9273
42c63846b321
Replace many tiny loops in the interplayvideo decoder by memset, memcpy
reimar
parents:
9272
diff
changeset
|
484 memcpy(s->pixel_ptr, s->stream_ptr, 8); |
42c63846b321
Replace many tiny loops in the interplayvideo decoder by memset, memcpy
reimar
parents:
9272
diff
changeset
|
485 s->stream_ptr += 8; |
42c63846b321
Replace many tiny loops in the interplayvideo decoder by memset, memcpy
reimar
parents:
9272
diff
changeset
|
486 s->pixel_ptr += s->stride; |
1468 | 487 } |
488 | |
489 /* report success */ | |
490 return 0; | |
491 } | |
492 | |
1475 | 493 static int ipvideo_decode_block_opcode_0xC(IpvideoContext *s) |
1468 | 494 { |
495 int x, y; | |
496 | |
497 /* 16-color block encoding: each 2x2 block is a different color */ | |
10713
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
498 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 16); |
1468 | 499 |
500 for (y = 0; y < 8; y += 2) { | |
501 for (x = 0; x < 8; x += 2) { | |
9297 | 502 s->pixel_ptr[x ] = |
503 s->pixel_ptr[x + 1 ] = | |
504 s->pixel_ptr[x + s->stride] = | |
9301 | 505 s->pixel_ptr[x + 1 + s->stride] = *s->stream_ptr++; |
1468 | 506 } |
1475 | 507 s->pixel_ptr += s->stride * 2; |
1468 | 508 } |
509 | |
510 /* report success */ | |
511 return 0; | |
512 } | |
513 | |
1475 | 514 static int ipvideo_decode_block_opcode_0xD(IpvideoContext *s) |
1468 | 515 { |
9273
42c63846b321
Replace many tiny loops in the interplayvideo decoder by memset, memcpy
reimar
parents:
9272
diff
changeset
|
516 int y; |
9322 | 517 unsigned char P[2]; |
1468 | 518 |
519 /* 4-color block encoding: each 4x4 block is a different color */ | |
10713
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
520 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 4); |
1468 | 521 |
9322 | 522 for (y = 0; y < 8; y++) { |
523 if (!(y & 3)) { | |
524 P[0] = *s->stream_ptr++; | |
525 P[1] = *s->stream_ptr++; | |
526 } | |
527 memset(s->pixel_ptr, P[0], 4); | |
528 memset(s->pixel_ptr + 4, P[1], 4); | |
9273
42c63846b321
Replace many tiny loops in the interplayvideo decoder by memset, memcpy
reimar
parents:
9272
diff
changeset
|
529 s->pixel_ptr += s->stride; |
1468 | 530 } |
531 | |
532 /* report success */ | |
533 return 0; | |
534 } | |
535 | |
1475 | 536 static int ipvideo_decode_block_opcode_0xE(IpvideoContext *s) |
1468 | 537 { |
9273
42c63846b321
Replace many tiny loops in the interplayvideo decoder by memset, memcpy
reimar
parents:
9272
diff
changeset
|
538 int y; |
1468 | 539 unsigned char pix; |
540 | |
541 /* 1-color encoding: the whole block is 1 solid color */ | |
10713
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
542 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 1); |
1475 | 543 pix = *s->stream_ptr++; |
1468 | 544 |
545 for (y = 0; y < 8; y++) { | |
9273
42c63846b321
Replace many tiny loops in the interplayvideo decoder by memset, memcpy
reimar
parents:
9272
diff
changeset
|
546 memset(s->pixel_ptr, pix, 8); |
42c63846b321
Replace many tiny loops in the interplayvideo decoder by memset, memcpy
reimar
parents:
9272
diff
changeset
|
547 s->pixel_ptr += s->stride; |
1468 | 548 } |
549 | |
550 /* report success */ | |
551 return 0; | |
552 } | |
553 | |
1475 | 554 static int ipvideo_decode_block_opcode_0xF(IpvideoContext *s) |
1468 | 555 { |
556 int x, y; | |
9298
9698f0d03ed9
Avoid code duplication by using ?: and array indexing instead of if..else
reimar
parents:
9297
diff
changeset
|
557 unsigned char sample[2]; |
1468 | 558 |
559 /* dithered encoding */ | |
10713
b703476cd4df
Make CHECK_STREAM_PTR macro in Interplay Video decoder usable with
kostya
parents:
10712
diff
changeset
|
560 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 2); |
9298
9698f0d03ed9
Avoid code duplication by using ?: and array indexing instead of if..else
reimar
parents:
9297
diff
changeset
|
561 sample[0] = *s->stream_ptr++; |
9698f0d03ed9
Avoid code duplication by using ?: and array indexing instead of if..else
reimar
parents:
9297
diff
changeset
|
562 sample[1] = *s->stream_ptr++; |
1468 | 563 |
564 for (y = 0; y < 8; y++) { | |
565 for (x = 0; x < 8; x += 2) { | |
9298
9698f0d03ed9
Avoid code duplication by using ?: and array indexing instead of if..else
reimar
parents:
9297
diff
changeset
|
566 *s->pixel_ptr++ = sample[ y & 1 ]; |
9698f0d03ed9
Avoid code duplication by using ?: and array indexing instead of if..else
reimar
parents:
9297
diff
changeset
|
567 *s->pixel_ptr++ = sample[!(y & 1)]; |
1468 | 568 } |
1475 | 569 s->pixel_ptr += s->line_inc; |
1468 | 570 } |
571 | |
572 /* report success */ | |
573 return 0; | |
574 } | |
575 | |
10719
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
576 static int ipvideo_decode_block_opcode_0x6_16(IpvideoContext *s) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
577 { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
578 signed char x, y; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
579 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
580 /* copy a block from the second last frame using an expanded range */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
581 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 2); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
582 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
583 x = *s->stream_ptr++; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
584 y = *s->stream_ptr++; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
585 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
586 debug_interplay (" motion bytes = %d, %d\n", x, y); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
587 return copy_from(s, &s->second_last_frame, x, y); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
588 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
589 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
590 static int ipvideo_decode_block_opcode_0x7_16(IpvideoContext *s) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
591 { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
592 int x, y; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
593 uint16_t P[2]; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
594 unsigned int flags; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
595 uint16_t *pixel_ptr = (uint16_t*)s->pixel_ptr; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
596 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
597 /* 2-color encoding */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
598 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 4); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
599 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
600 P[0] = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
601 P[1] = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
602 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
603 if (!(P[0] & 0x8000)) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
604 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
605 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 8); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
606 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
607 for (y = 0; y < 8; y++) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
608 flags = *s->stream_ptr++ | 0x100; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
609 for (; flags != 1; flags >>= 1) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
610 *pixel_ptr++ = P[flags & 1]; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
611 pixel_ptr += s->line_inc; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
612 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
613 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
614 } else { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
615 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
616 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 2); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
617 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
618 flags = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
619 for (y = 0; y < 8; y += 2) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
620 for (x = 0; x < 8; x += 2, flags >>= 1) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
621 pixel_ptr[x ] = |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
622 pixel_ptr[x + 1 ] = |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
623 pixel_ptr[x + s->stride] = |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
624 pixel_ptr[x + 1 + s->stride] = P[flags & 1]; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
625 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
626 pixel_ptr += s->stride * 2; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
627 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
628 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
629 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
630 return 0; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
631 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
632 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
633 static int ipvideo_decode_block_opcode_0x8_16(IpvideoContext *s) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
634 { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
635 int x, y; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
636 uint16_t P[2]; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
637 unsigned int flags = 0; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
638 uint16_t *pixel_ptr = (uint16_t*)s->pixel_ptr; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
639 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
640 /* 2-color encoding for each 4x4 quadrant, or 2-color encoding on |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
641 * either top and bottom or left and right halves */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
642 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 4); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
643 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
644 P[0] = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
645 P[1] = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
646 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
647 if (!(P[0] & 0x8000)) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
648 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
649 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 24); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
650 s->stream_ptr -= 4; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
651 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
652 for (y = 0; y < 16; y++) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
653 // new values for each 4x4 block |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
654 if (!(y & 3)) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
655 P[0] = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
656 P[1] = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
657 flags = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
658 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
659 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
660 for (x = 0; x < 4; x++, flags >>= 1) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
661 *pixel_ptr++ = P[flags & 1]; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
662 pixel_ptr += s->stride - 4; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
663 // switch to right half |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
664 if (y == 7) pixel_ptr -= 8 * s->stride - 4; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
665 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
666 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
667 } else { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
668 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
669 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 12); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
670 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
671 if (!(AV_RL16(s->stream_ptr + 4) & 0x8000)) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
672 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
673 flags = bytestream_get_le32(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
674 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
675 /* vertical split; left & right halves are 2-color encoded */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
676 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
677 for (y = 0; y < 16; y++) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
678 for (x = 0; x < 4; x++, flags >>= 1) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
679 *pixel_ptr++ = P[flags & 1]; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
680 pixel_ptr += s->stride - 4; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
681 // switch to right half |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
682 if (y == 7) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
683 pixel_ptr -= 8 * s->stride - 4; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
684 P[0] = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
685 P[1] = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
686 flags = bytestream_get_le32(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
687 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
688 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
689 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
690 } else { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
691 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
692 /* horizontal split; top & bottom halves are 2-color encoded */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
693 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
694 for (y = 0; y < 8; y++) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
695 if (y == 4) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
696 P[0] = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
697 P[1] = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
698 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
699 flags = *s->stream_ptr++ | 0x100; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
700 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
701 for (; flags != 1; flags >>= 1) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
702 *pixel_ptr++ = P[flags & 1]; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
703 pixel_ptr += s->line_inc; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
704 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
705 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
706 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
707 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
708 /* report success */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
709 return 0; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
710 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
711 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
712 static int ipvideo_decode_block_opcode_0x9_16(IpvideoContext *s) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
713 { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
714 int x, y; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
715 uint16_t P[4]; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
716 uint16_t *pixel_ptr = (uint16_t*)s->pixel_ptr; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
717 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
718 /* 4-color encoding */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
719 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 8); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
720 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
721 for (x = 0; x < 4; x++) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
722 P[x] = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
723 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
724 if (!(P[0] & 0x8000)) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
725 if (!(P[2] & 0x8000)) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
726 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
727 /* 1 of 4 colors for each pixel */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
728 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 16); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
729 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
730 for (y = 0; y < 8; y++) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
731 /* get the next set of 8 2-bit flags */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
732 int flags = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
733 for (x = 0; x < 8; x++, flags >>= 2) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
734 *pixel_ptr++ = P[flags & 0x03]; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
735 pixel_ptr += s->line_inc; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
736 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
737 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
738 } else { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
739 uint32_t flags; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
740 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
741 /* 1 of 4 colors for each 2x2 block */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
742 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 4); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
743 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
744 flags = bytestream_get_le32(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
745 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
746 for (y = 0; y < 8; y += 2) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
747 for (x = 0; x < 8; x += 2, flags >>= 2) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
748 pixel_ptr[x ] = |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
749 pixel_ptr[x + 1 ] = |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
750 pixel_ptr[x + s->stride] = |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
751 pixel_ptr[x + 1 + s->stride] = P[flags & 0x03]; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
752 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
753 pixel_ptr += s->stride * 2; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
754 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
755 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
756 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
757 } else { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
758 uint64_t flags; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
759 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
760 /* 1 of 4 colors for each 2x1 or 1x2 block */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
761 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 8); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
762 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
763 flags = bytestream_get_le64(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
764 if (!(P[2] & 0x8000)) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
765 for (y = 0; y < 8; y++) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
766 for (x = 0; x < 8; x += 2, flags >>= 2) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
767 pixel_ptr[x ] = |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
768 pixel_ptr[x + 1] = P[flags & 0x03]; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
769 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
770 pixel_ptr += s->stride; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
771 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
772 } else { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
773 for (y = 0; y < 8; y += 2) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
774 for (x = 0; x < 8; x++, flags >>= 2) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
775 pixel_ptr[x ] = |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
776 pixel_ptr[x + s->stride] = P[flags & 0x03]; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
777 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
778 pixel_ptr += s->stride * 2; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
779 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
780 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
781 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
782 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
783 /* report success */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
784 return 0; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
785 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
786 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
787 static int ipvideo_decode_block_opcode_0xA_16(IpvideoContext *s) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
788 { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
789 int x, y; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
790 uint16_t P[4]; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
791 int flags = 0; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
792 uint16_t *pixel_ptr = (uint16_t*)s->pixel_ptr; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
793 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
794 /* 4-color encoding for each 4x4 quadrant, or 4-color encoding on |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
795 * either top and bottom or left and right halves */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
796 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 24); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
797 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
798 if (!(AV_RL16(s->stream_ptr) & 0x8000)) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
799 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
800 /* 4-color encoding for each quadrant */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
801 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 48); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
802 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
803 for (y = 0; y < 16; y++) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
804 // new values for each 4x4 block |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
805 if (!(y & 3)) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
806 for (x = 0; x < 4; x++) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
807 P[x] = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
808 flags = bytestream_get_le32(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
809 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
810 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
811 for (x = 0; x < 4; x++, flags >>= 2) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
812 *pixel_ptr++ = P[flags & 0x03]; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
813 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
814 pixel_ptr += s->stride - 4; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
815 // switch to right half |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
816 if (y == 7) pixel_ptr -= 8 * s->stride - 4; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
817 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
818 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
819 } else { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
820 // vertical split? |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
821 int vert = !(AV_RL16(s->stream_ptr + 16) & 0x8000); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
822 uint64_t flags = 0; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
823 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
824 /* 4-color encoding for either left and right or top and bottom |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
825 * halves */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
826 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
827 for (y = 0; y < 16; y++) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
828 // load values for each half |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
829 if (!(y & 7)) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
830 for (x = 0; x < 4; x++) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
831 P[x] = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
832 flags = bytestream_get_le64(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
833 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
834 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
835 for (x = 0; x < 4; x++, flags >>= 2) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
836 *pixel_ptr++ = P[flags & 0x03]; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
837 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
838 if (vert) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
839 pixel_ptr += s->stride - 4; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
840 // switch to right half |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
841 if (y == 7) pixel_ptr -= 8 * s->stride - 4; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
842 } else if (y & 1) pixel_ptr += s->line_inc; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
843 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
844 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
845 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
846 /* report success */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
847 return 0; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
848 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
849 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
850 static int ipvideo_decode_block_opcode_0xB_16(IpvideoContext *s) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
851 { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
852 int x, y; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
853 uint16_t *pixel_ptr = (uint16_t*)s->pixel_ptr; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
854 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
855 /* 64-color encoding (each pixel in block is a different color) */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
856 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 128); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
857 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
858 for (y = 0; y < 8; y++) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
859 for (x = 0; x < 8; x++) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
860 pixel_ptr[x] = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
861 pixel_ptr += s->stride; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
862 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
863 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
864 /* report success */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
865 return 0; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
866 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
867 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
868 static int ipvideo_decode_block_opcode_0xC_16(IpvideoContext *s) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
869 { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
870 int x, y; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
871 uint16_t *pixel_ptr = (uint16_t*)s->pixel_ptr; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
872 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
873 /* 16-color block encoding: each 2x2 block is a different color */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
874 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 32); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
875 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
876 for (y = 0; y < 8; y += 2) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
877 for (x = 0; x < 8; x += 2) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
878 pixel_ptr[x ] = |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
879 pixel_ptr[x + 1 ] = |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
880 pixel_ptr[x + s->stride] = |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
881 pixel_ptr[x + 1 + s->stride] = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
882 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
883 pixel_ptr += s->stride * 2; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
884 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
885 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
886 /* report success */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
887 return 0; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
888 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
889 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
890 static int ipvideo_decode_block_opcode_0xD_16(IpvideoContext *s) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
891 { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
892 int x, y; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
893 uint16_t P[2]; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
894 uint16_t *pixel_ptr = (uint16_t*)s->pixel_ptr; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
895 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
896 /* 4-color block encoding: each 4x4 block is a different color */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
897 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 8); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
898 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
899 for (y = 0; y < 8; y++) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
900 if (!(y & 3)) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
901 P[0] = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
902 P[1] = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
903 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
904 for (x = 0; x < 8; x++) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
905 pixel_ptr[x] = P[x >> 2]; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
906 pixel_ptr += s->stride; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
907 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
908 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
909 /* report success */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
910 return 0; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
911 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
912 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
913 static int ipvideo_decode_block_opcode_0xE_16(IpvideoContext *s) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
914 { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
915 int x, y; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
916 uint16_t pix; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
917 uint16_t *pixel_ptr = (uint16_t*)s->pixel_ptr; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
918 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
919 /* 1-color encoding: the whole block is 1 solid color */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
920 CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 2); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
921 pix = bytestream_get_le16(&s->stream_ptr); |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
922 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
923 for (y = 0; y < 8; y++) { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
924 for (x = 0; x < 8; x++) |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
925 pixel_ptr[x] = pix; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
926 pixel_ptr += s->stride; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
927 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
928 |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
929 /* report success */ |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
930 return 0; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
931 } |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
932 |
9272
bb2fa003a336
Make ipvideo_decode_block array constant, compile-time initialized instead
reimar
parents:
9127
diff
changeset
|
933 static int (* const ipvideo_decode_block[])(IpvideoContext *s) = { |
bb2fa003a336
Make ipvideo_decode_block array constant, compile-time initialized instead
reimar
parents:
9127
diff
changeset
|
934 ipvideo_decode_block_opcode_0x0, ipvideo_decode_block_opcode_0x1, |
bb2fa003a336
Make ipvideo_decode_block array constant, compile-time initialized instead
reimar
parents:
9127
diff
changeset
|
935 ipvideo_decode_block_opcode_0x2, ipvideo_decode_block_opcode_0x3, |
bb2fa003a336
Make ipvideo_decode_block array constant, compile-time initialized instead
reimar
parents:
9127
diff
changeset
|
936 ipvideo_decode_block_opcode_0x4, ipvideo_decode_block_opcode_0x5, |
bb2fa003a336
Make ipvideo_decode_block array constant, compile-time initialized instead
reimar
parents:
9127
diff
changeset
|
937 ipvideo_decode_block_opcode_0x6, ipvideo_decode_block_opcode_0x7, |
bb2fa003a336
Make ipvideo_decode_block array constant, compile-time initialized instead
reimar
parents:
9127
diff
changeset
|
938 ipvideo_decode_block_opcode_0x8, ipvideo_decode_block_opcode_0x9, |
bb2fa003a336
Make ipvideo_decode_block array constant, compile-time initialized instead
reimar
parents:
9127
diff
changeset
|
939 ipvideo_decode_block_opcode_0xA, ipvideo_decode_block_opcode_0xB, |
bb2fa003a336
Make ipvideo_decode_block array constant, compile-time initialized instead
reimar
parents:
9127
diff
changeset
|
940 ipvideo_decode_block_opcode_0xC, ipvideo_decode_block_opcode_0xD, |
bb2fa003a336
Make ipvideo_decode_block array constant, compile-time initialized instead
reimar
parents:
9127
diff
changeset
|
941 ipvideo_decode_block_opcode_0xE, ipvideo_decode_block_opcode_0xF, |
bb2fa003a336
Make ipvideo_decode_block array constant, compile-time initialized instead
reimar
parents:
9127
diff
changeset
|
942 }; |
1468 | 943 |
10719
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
944 static int (* const ipvideo_decode_block16[])(IpvideoContext *s) = { |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
945 ipvideo_decode_block_opcode_0x0, ipvideo_decode_block_opcode_0x1, |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
946 ipvideo_decode_block_opcode_0x2, ipvideo_decode_block_opcode_0x3, |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
947 ipvideo_decode_block_opcode_0x4, ipvideo_decode_block_opcode_0x5, |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
948 ipvideo_decode_block_opcode_0x6_16, ipvideo_decode_block_opcode_0x7_16, |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
949 ipvideo_decode_block_opcode_0x8_16, ipvideo_decode_block_opcode_0x9_16, |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
950 ipvideo_decode_block_opcode_0xA_16, ipvideo_decode_block_opcode_0xB_16, |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
951 ipvideo_decode_block_opcode_0xC_16, ipvideo_decode_block_opcode_0xD_16, |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
952 ipvideo_decode_block_opcode_0xE_16, ipvideo_decode_block_opcode_0x1, |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
953 }; |
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
954 |
1468 | 955 static void ipvideo_decode_opcodes(IpvideoContext *s) |
956 { | |
957 int x, y; | |
958 unsigned char opcode; | |
959 int ret; | |
960 static int frame = 0; | |
9494
e09e4c095fdb
Simplify ipvideo_decode_opcodes by using get_bits, this might be slower
reimar
parents:
9493
diff
changeset
|
961 GetBitContext gb; |
1468 | 962 |
963 debug_interplay("------------------ frame %d\n", frame); | |
964 frame++; | |
965 | |
10715
4f455f478398
Add 16-bit image data handling (but not decoding yet) to Interplay Video
kostya
parents:
10714
diff
changeset
|
966 if (!s->is_16bpp) { |
10716
e64842a691d8
cosmetics: reindent and break long lines after last commits
kostya
parents:
10715
diff
changeset
|
967 /* this is PAL8, so make the palette available */ |
e64842a691d8
cosmetics: reindent and break long lines after last commits
kostya
parents:
10715
diff
changeset
|
968 memcpy(s->current_frame.data[1], s->avctx->palctrl->palette, PALETTE_COUNT * 4); |
1468 | 969 |
10716
e64842a691d8
cosmetics: reindent and break long lines after last commits
kostya
parents:
10715
diff
changeset
|
970 s->stride = s->current_frame.linesize[0]; |
e64842a691d8
cosmetics: reindent and break long lines after last commits
kostya
parents:
10715
diff
changeset
|
971 s->stream_ptr = s->buf + 14; /* data starts 14 bytes in */ |
e64842a691d8
cosmetics: reindent and break long lines after last commits
kostya
parents:
10715
diff
changeset
|
972 s->stream_end = s->buf + s->size; |
10715
4f455f478398
Add 16-bit image data handling (but not decoding yet) to Interplay Video
kostya
parents:
10714
diff
changeset
|
973 } else { |
4f455f478398
Add 16-bit image data handling (but not decoding yet) to Interplay Video
kostya
parents:
10714
diff
changeset
|
974 s->stride = s->current_frame.linesize[0] >> 1; |
10718
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
975 s->stream_ptr = s->buf + 16; |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
976 s->stream_end = |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
977 s->mv_ptr = s->buf + 14 + AV_RL16(s->buf+14); |
1b91df81bda4
16-bit Interplay Video stores motion vector data at the end of frame,
kostya
parents:
10717
diff
changeset
|
978 s->mv_end = s->buf + s->size; |
10715
4f455f478398
Add 16-bit image data handling (but not decoding yet) to Interplay Video
kostya
parents:
10714
diff
changeset
|
979 } |
1475 | 980 s->line_inc = s->stride - 8; |
10717
4b1bc4a1ff14
10l trocadero: forgot one case where picture linesize should be used
kostya
parents:
10716
diff
changeset
|
981 s->upper_motion_limit_offset = (s->avctx->height - 8) * s->current_frame.linesize[0] |
10716
e64842a691d8
cosmetics: reindent and break long lines after last commits
kostya
parents:
10715
diff
changeset
|
982 + (s->avctx->width - 8) * (1 + s->is_16bpp); |
1468 | 983 |
9494
e09e4c095fdb
Simplify ipvideo_decode_opcodes by using get_bits, this might be slower
reimar
parents:
9493
diff
changeset
|
984 init_get_bits(&gb, s->decoding_map, s->decoding_map_size * 8); |
10711
d2c20d24abbd
Change main loop in Interplay Video decoder, so variables x and y really mean
kostya
parents:
10709
diff
changeset
|
985 for (y = 0; y < s->avctx->height; y += 8) { |
d2c20d24abbd
Change main loop in Interplay Video decoder, so variables x and y really mean
kostya
parents:
10709
diff
changeset
|
986 for (x = 0; x < s->avctx->width; x += 8) { |
9494
e09e4c095fdb
Simplify ipvideo_decode_opcodes by using get_bits, this might be slower
reimar
parents:
9493
diff
changeset
|
987 opcode = get_bits(&gb, 4); |
1468 | 988 |
1475 | 989 debug_interplay(" block @ (%3d, %3d): encoding 0x%X, data ptr @ %p\n", |
10711
d2c20d24abbd
Change main loop in Interplay Video decoder, so variables x and y really mean
kostya
parents:
10709
diff
changeset
|
990 x, y, opcode, s->stream_ptr); |
1468 | 991 |
10715
4f455f478398
Add 16-bit image data handling (but not decoding yet) to Interplay Video
kostya
parents:
10714
diff
changeset
|
992 if (!s->is_16bpp) { |
10716
e64842a691d8
cosmetics: reindent and break long lines after last commits
kostya
parents:
10715
diff
changeset
|
993 s->pixel_ptr = s->current_frame.data[0] + x |
e64842a691d8
cosmetics: reindent and break long lines after last commits
kostya
parents:
10715
diff
changeset
|
994 + y*s->current_frame.linesize[0]; |
e64842a691d8
cosmetics: reindent and break long lines after last commits
kostya
parents:
10715
diff
changeset
|
995 ret = ipvideo_decode_block[opcode](s); |
10715
4f455f478398
Add 16-bit image data handling (but not decoding yet) to Interplay Video
kostya
parents:
10714
diff
changeset
|
996 } else { |
10716
e64842a691d8
cosmetics: reindent and break long lines after last commits
kostya
parents:
10715
diff
changeset
|
997 s->pixel_ptr = s->current_frame.data[0] + x*2 |
e64842a691d8
cosmetics: reindent and break long lines after last commits
kostya
parents:
10715
diff
changeset
|
998 + y*s->current_frame.linesize[0]; |
10719
cc2f80bbf304
Add missing opcodes for 16-bit Interplay Video decoding and finally enable it
kostya
parents:
10718
diff
changeset
|
999 ret = ipvideo_decode_block16[opcode](s); |
10715
4f455f478398
Add 16-bit image data handling (but not decoding yet) to Interplay Video
kostya
parents:
10714
diff
changeset
|
1000 } |
1475 | 1001 if (ret != 0) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1585
diff
changeset
|
1002 av_log(s->avctx, AV_LOG_ERROR, " Interplay video: decode problem on frame %d, @ block (%d, %d)\n", |
10711
d2c20d24abbd
Change main loop in Interplay Video decoder, so variables x and y really mean
kostya
parents:
10709
diff
changeset
|
1003 frame, x, y); |
1475 | 1004 return; |
1468 | 1005 } |
1006 } | |
1007 } | |
9275
67cf9d31724c
Simplify check for leftover bytes after decoding for interplayvideo.
reimar
parents:
9274
diff
changeset
|
1008 if (s->stream_end - s->stream_ptr > 1) { |
2962 | 1009 av_log(s->avctx, AV_LOG_ERROR, " Interplay video: decode finished with %td bytes left over\n", |
10709 | 1010 s->stream_end - s->stream_ptr); |
1475 | 1011 } |
1468 | 1012 } |
1013 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6483
diff
changeset
|
1014 static av_cold int ipvideo_decode_init(AVCodecContext *avctx) |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1015 { |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1016 IpvideoContext *s = avctx->priv_data; |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1017 |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1018 s->avctx = avctx; |
1468 | 1019 |
10720
bcc62edd9b41
16-bit Interplay video does not need palette control
kostya
parents:
10719
diff
changeset
|
1020 s->is_16bpp = avctx->bits_per_coded_sample == 16; |
bcc62edd9b41
16-bit Interplay video does not need palette control
kostya
parents:
10719
diff
changeset
|
1021 avctx->pix_fmt = s->is_16bpp ? PIX_FMT_RGB555 : PIX_FMT_PAL8; |
bcc62edd9b41
16-bit Interplay video does not need palette control
kostya
parents:
10719
diff
changeset
|
1022 if (!s->is_16bpp && s->avctx->palctrl == NULL) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1585
diff
changeset
|
1023 av_log(avctx, AV_LOG_ERROR, " Interplay video: palette expected.\n"); |
1468 | 1024 return -1; |
1025 } | |
1026 | |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1027 dsputil_init(&s->dsp, avctx); |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1028 |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1029 /* decoding map contains 4 bits of information per 8x8 block */ |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1030 s->decoding_map_size = avctx->width * avctx->height / (8 * 8 * 2); |
1468 | 1031 |
1474
94c7f7c23dd9
video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents:
1473
diff
changeset
|
1032 s->current_frame.data[0] = s->last_frame.data[0] = |
94c7f7c23dd9
video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents:
1473
diff
changeset
|
1033 s->second_last_frame.data[0] = NULL; |
94c7f7c23dd9
video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents:
1473
diff
changeset
|
1034 |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1035 return 0; |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1036 } |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1037 |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1038 static int ipvideo_decode_frame(AVCodecContext *avctx, |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1039 void *data, int *data_size, |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9322
diff
changeset
|
1040 AVPacket *avpkt) |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1041 { |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9322
diff
changeset
|
1042 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9322
diff
changeset
|
1043 int buf_size = avpkt->size; |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1044 IpvideoContext *s = avctx->priv_data; |
1585
6b224ca24033
revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents:
1545
diff
changeset
|
1045 AVPaletteControl *palette_control = avctx->palctrl; |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1046 |
1770 | 1047 /* compressed buffer needs to be large enough to at least hold an entire |
1048 * decoding map */ | |
1049 if (buf_size < s->decoding_map_size) | |
1050 return buf_size; | |
1051 | |
1468 | 1052 s->decoding_map = buf; |
1053 s->buf = buf + s->decoding_map_size; | |
1054 s->size = buf_size - s->decoding_map_size; | |
1055 | |
1474
94c7f7c23dd9
video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents:
1473
diff
changeset
|
1056 s->current_frame.reference = 3; |
1468 | 1057 if (avctx->get_buffer(avctx, &s->current_frame)) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1585
diff
changeset
|
1058 av_log(avctx, AV_LOG_ERROR, " Interplay Video: get_buffer() failed\n"); |
1468 | 1059 return -1; |
1060 } | |
1061 | |
1062 ipvideo_decode_opcodes(s); | |
1063 | |
10715
4f455f478398
Add 16-bit image data handling (but not decoding yet) to Interplay Video
kostya
parents:
10714
diff
changeset
|
1064 if (!s->is_16bpp && palette_control->palette_changed) { |
1585
6b224ca24033
revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents:
1545
diff
changeset
|
1065 palette_control->palette_changed = 0; |
6b224ca24033
revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents:
1545
diff
changeset
|
1066 s->current_frame.palette_has_changed = 1; |
6b224ca24033
revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents:
1545
diff
changeset
|
1067 } |
6b224ca24033
revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents:
1545
diff
changeset
|
1068 |
1474
94c7f7c23dd9
video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents:
1473
diff
changeset
|
1069 *data_size = sizeof(AVFrame); |
94c7f7c23dd9
video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents:
1473
diff
changeset
|
1070 *(AVFrame*)data = s->current_frame; |
1468 | 1071 |
1072 /* shuffle frames */ | |
1474
94c7f7c23dd9
video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents:
1473
diff
changeset
|
1073 if (s->second_last_frame.data[0]) |
94c7f7c23dd9
video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents:
1473
diff
changeset
|
1074 avctx->release_buffer(avctx, &s->second_last_frame); |
94c7f7c23dd9
video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents:
1473
diff
changeset
|
1075 s->second_last_frame = s->last_frame; |
1468 | 1076 s->last_frame = s->current_frame; |
1474
94c7f7c23dd9
video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents:
1473
diff
changeset
|
1077 s->current_frame.data[0] = NULL; /* catch any access attempts */ |
1468 | 1078 |
1079 /* report that the buffer was completely consumed */ | |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1080 return buf_size; |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1081 } |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1082 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6483
diff
changeset
|
1083 static av_cold int ipvideo_decode_end(AVCodecContext *avctx) |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1084 { |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1085 IpvideoContext *s = avctx->priv_data; |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1086 |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1087 /* release the last frame */ |
1474
94c7f7c23dd9
video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents:
1473
diff
changeset
|
1088 if (s->last_frame.data[0]) |
94c7f7c23dd9
video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents:
1473
diff
changeset
|
1089 avctx->release_buffer(avctx, &s->last_frame); |
94c7f7c23dd9
video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents:
1473
diff
changeset
|
1090 if (s->second_last_frame.data[0]) |
94c7f7c23dd9
video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents:
1473
diff
changeset
|
1091 avctx->release_buffer(avctx, &s->second_last_frame); |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1092 |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1093 return 0; |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1094 } |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1095 |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1096 AVCodec interplay_video_decoder = { |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1097 "interplayvideo", |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
10720
diff
changeset
|
1098 AVMEDIA_TYPE_VIDEO, |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1099 CODEC_ID_INTERPLAY_VIDEO, |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1100 sizeof(IpvideoContext), |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1101 ipvideo_decode_init, |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1102 NULL, |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1103 ipvideo_decode_end, |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1104 ipvideo_decode_frame, |
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1105 CODEC_CAP_DR1, |
9083
bf274494b66e
Change a bunch of codec long_names to be more consistent and descriptive.
diego
parents:
8718
diff
changeset
|
1106 .long_name = NULL_IF_CONFIG_SMALL("Interplay MVE video"), |
1439
a4d00b1f0271
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
1107 }; |