annotate interplayvideo.c @ 4765:85298e8c55c4 libavcodec

bfin dsputils, basic pixel operations sads, diffs, motion compensation and standard IEEE 8x8 block transforms patch by Marc Hoffman, mmh pleasantst com
author diego
date Sun, 01 Apr 2007 22:28:45 +0000
parents c8c591fe26f8
children 66ef3690d108
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
23 /**
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
24 * @file interplayvideo.c
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
25 * 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
26 * For more information about the Interplay MVE format, visit:
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
27 * http://www.pcisys.net/~melanson/codecs/interplay-mve.txt
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
28 * This code is written in such a way that the identifiers match up
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
29 * with the encoding descriptions in the document.
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
30 *
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
31 * This decoder presently only supports a PAL8 output colorspace.
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
32 *
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
33 * An Interplay video frame consists of 2 parts: The decoding map and
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
34 * the video data. A demuxer must load these 2 parts together in a single
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
35 * 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
36 */
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
37
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
38 #include <stdio.h>
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
39 #include <stdlib.h>
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
40 #include <string.h>
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
41 #include <unistd.h>
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
42
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
43 #include "common.h"
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
44 #include "avcodec.h"
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
45 #include "dsputil.h"
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
46
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
47 #define PALETTE_COUNT 256
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
48
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
49 /* debugging support */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
50 #define DEBUG_INTERPLAY 0
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
51 #if DEBUG_INTERPLAY
2515
alex
parents: 1926
diff changeset
52 #define debug_interplay(x,...) av_log(NULL, AV_LOG_DEBUG, x, __VA_ARGS__)
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
53 #else
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
54 static inline void debug_interplay(const char *format, ...) { }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
55 #endif
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
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;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
64 unsigned char *decoding_map;
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
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
67 unsigned char *buf;
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
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
70 unsigned char *stream_ptr;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
71 unsigned char *stream_end;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
72 unsigned char *pixel_ptr;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
73 int line_inc;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
74 int stride;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
75 int upper_motion_limit_offset;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
76
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
77 } IpvideoContext;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
78
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
79 #define CHECK_STREAM_PTR(n) \
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
80 if ((s->stream_ptr + n) > s->stream_end) { \
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1585
diff changeset
81 av_log(s->avctx, AV_LOG_ERROR, "Interplay video warning: stream_ptr out of bounds (%p >= %p)\n", \
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
82 s->stream_ptr + n, s->stream_end); \
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
83 return -1; \
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
84 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
85
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
86 #define COPY_FROM_CURRENT() \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
87 motion_offset = current_offset; \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
88 motion_offset += y * s->stride; \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
89 motion_offset += x; \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
90 if (motion_offset < 0) { \
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1585
diff changeset
91 av_log(s->avctx, AV_LOG_ERROR, " Interplay video: motion offset < 0 (%d)\n", motion_offset); \
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
92 return -1; \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
93 } else if (motion_offset > s->upper_motion_limit_offset) { \
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1585
diff changeset
94 av_log(s->avctx, AV_LOG_ERROR, " Interplay video: motion offset above limit (%d >= %d)\n", \
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
95 motion_offset, s->upper_motion_limit_offset); \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
96 return -1; \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
97 } \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
98 s->dsp.put_pixels_tab[0][0](s->pixel_ptr, \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
99 s->current_frame.data[0] + motion_offset, s->stride, 8);
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
100
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
101 #define COPY_FROM_PREVIOUS() \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
102 motion_offset = current_offset; \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
103 motion_offset += y * s->stride; \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
104 motion_offset += x; \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
105 if (motion_offset < 0) { \
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1585
diff changeset
106 av_log(s->avctx, AV_LOG_ERROR, " Interplay video: motion offset < 0 (%d)\n", motion_offset); \
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
107 return -1; \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
108 } else if (motion_offset > s->upper_motion_limit_offset) { \
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1585
diff changeset
109 av_log(s->avctx, AV_LOG_ERROR, " Interplay video: motion offset above limit (%d >= %d)\n", \
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
110 motion_offset, s->upper_motion_limit_offset); \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
111 return -1; \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
112 } \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
113 s->dsp.put_pixels_tab[0][0](s->pixel_ptr, \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
114 s->last_frame.data[0] + motion_offset, s->stride, 8);
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
115
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
116 #define COPY_FROM_SECOND_LAST() \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
117 motion_offset = current_offset; \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
118 motion_offset += y * s->stride; \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
119 motion_offset += x; \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
120 if (motion_offset < 0) { \
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1585
diff changeset
121 av_log(s->avctx, AV_LOG_ERROR, " Interplay video: motion offset < 0 (%d)\n", motion_offset); \
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
122 return -1; \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
123 } else if (motion_offset > s->upper_motion_limit_offset) { \
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1585
diff changeset
124 av_log(s->avctx, AV_LOG_ERROR, " Interplay video: motion offset above limit (%d >= %d)\n", \
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
125 motion_offset, s->upper_motion_limit_offset); \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
126 return -1; \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
127 } \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
128 s->dsp.put_pixels_tab[0][0](s->pixel_ptr, \
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
129 s->second_last_frame.data[0] + motion_offset, s->stride, 8);
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
130
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
131 static int ipvideo_decode_block_opcode_0x0(IpvideoContext *s)
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
132 {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
133 int x, y;
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
134 int motion_offset;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
135 int current_offset = s->pixel_ptr - s->current_frame.data[0];
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
136
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
137 /* copy a block from the previous frame */
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
138 x = y = 0;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
139 COPY_FROM_PREVIOUS();
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
140
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
141 /* report success */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
142 return 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
143 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
144
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
145 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
146 {
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
147 int x, y;
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
148 int motion_offset;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
149 int current_offset = s->pixel_ptr - s->current_frame.data[0];
1474
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
150
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
151 /* copy block from 2 frames ago */
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
152 x = y = 0;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
153 COPY_FROM_SECOND_LAST();
1474
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
154
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
155 /* report success */
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
156 return 0;
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
157 }
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
158
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
159 static int ipvideo_decode_block_opcode_0x2(IpvideoContext *s)
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
160 {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
161 unsigned char B;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
162 int x, y;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
163 int motion_offset;
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
164 int current_offset = s->pixel_ptr - s->current_frame.data[0];
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
165
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
166 /* copy block from 2 frames ago using a motion vector; need 1 more byte */
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
167 CHECK_STREAM_PTR(1);
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
168 B = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
169
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
170 if (B < 56) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
171 x = 8 + (B % 7);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
172 y = B / 7;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
173 } else {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
174 x = -14 + ((B - 56) % 29);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
175 y = 8 + ((B - 56) / 29);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
176 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
177
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
178 debug_interplay (" motion byte = %d, (x, y) = (%d, %d)\n", B, x, y);
1474
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
179 COPY_FROM_SECOND_LAST();
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
180
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
181 /* report success */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
182 return 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
183 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
184
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
185 static int ipvideo_decode_block_opcode_0x3(IpvideoContext *s)
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
186 {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
187 unsigned char B;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
188 int x, y;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
189 int motion_offset;
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
190 int current_offset = s->pixel_ptr - s->current_frame.data[0];
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
191
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
192 /* copy 8x8 block from current frame from an up/left block */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
193
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
194 /* need 1 more byte for motion */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
195 CHECK_STREAM_PTR(1);
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
196 B = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
197
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
198 if (B < 56) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
199 x = -(8 + (B % 7));
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
200 y = -(B / 7);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
201 } else {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
202 x = -(-14 + ((B - 56) % 29));
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
203 y = -( 8 + ((B - 56) / 29));
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
204 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
205
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
206 debug_interplay (" motion byte = %d, (x, y) = (%d, %d)\n", B, x, y);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
207 COPY_FROM_CURRENT();
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
208
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
209 /* report success */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
210 return 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
211 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
212
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
213 static int ipvideo_decode_block_opcode_0x4(IpvideoContext *s)
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
214 {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
215 int x, y;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
216 unsigned char B, BL, BH;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
217 int motion_offset;
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
218 int current_offset = s->pixel_ptr - s->current_frame.data[0];
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
219
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
220 /* copy a block from the previous frame; need 1 more byte */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
221 CHECK_STREAM_PTR(1);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
222
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
223 B = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
224 BL = B & 0x0F;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
225 BH = (B >> 4) & 0x0F;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
226 x = -8 + BL;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
227 y = -8 + BH;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
228
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
229 debug_interplay (" motion byte = %d, (x, y) = (%d, %d)\n", B, x, y);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
230 COPY_FROM_PREVIOUS();
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
231
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
232 /* report success */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
233 return 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
234 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
235
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
236 static int ipvideo_decode_block_opcode_0x5(IpvideoContext *s)
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
237 {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
238 signed char x, y;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
239 int motion_offset;
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
240 int current_offset = s->pixel_ptr - s->current_frame.data[0];
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
241
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
242 /* copy a block from the previous frame using an expanded range;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
243 * need 2 more bytes */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
244 CHECK_STREAM_PTR(2);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
245
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
246 x = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
247 y = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
248
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
249 debug_interplay (" motion bytes = %d, %d\n", x, y);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
250 COPY_FROM_PREVIOUS();
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
251
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
252 /* report success */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
253 return 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
254 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
255
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
256 static int ipvideo_decode_block_opcode_0x6(IpvideoContext *s)
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
257 {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
258 /* mystery opcode? skip multiple blocks? */
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1585
diff changeset
259 av_log(s->avctx, AV_LOG_ERROR, " Interplay video: Help! Mystery opcode 0x6 seen\n");
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
260
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
261 /* report success */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
262 return 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
263 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
264
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
265 static int ipvideo_decode_block_opcode_0x7(IpvideoContext *s)
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
266 {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
267 int x, y;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
268 unsigned char P0, P1;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
269 unsigned char B[8];
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
270 unsigned int flags;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
271 int bitmask;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
272
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
273 /* 2-color encoding */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
274 CHECK_STREAM_PTR(2);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
275
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
276 P0 = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
277 P1 = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
278
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
279 if (P0 <= P1) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
280
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
281 /* need 8 more bytes from the stream */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
282 CHECK_STREAM_PTR(8);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
283 for (y = 0; y < 8; y++)
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
284 B[y] = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
285
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
286 for (y = 0; y < 8; y++) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
287 flags = B[y];
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
288 for (x = 0x01; x <= 0x80; x <<= 1) {
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
289 if (flags & x)
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
290 *s->pixel_ptr++ = P1;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
291 else
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
292 *s->pixel_ptr++ = P0;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
293 }
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
294 s->pixel_ptr += s->line_inc;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
295 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
296
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
297 } else {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
298
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
299 /* need 2 more bytes from the stream */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
300 CHECK_STREAM_PTR(2);
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
301 B[0] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
302 B[1] = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
303
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
304 flags = (B[1] << 8) | B[0];
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
305 bitmask = 0x0001;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
306 for (y = 0; y < 8; y += 2) {
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
307 for (x = 0; x < 8; x += 2, bitmask <<= 1) {
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
308 if (flags & bitmask) {
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
309 *(s->pixel_ptr + x) = P1;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
310 *(s->pixel_ptr + x + 1) = P1;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
311 *(s->pixel_ptr + s->stride + x) = P1;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
312 *(s->pixel_ptr + s->stride + x + 1) = P1;
1474
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
313 } else {
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
314 *(s->pixel_ptr + x) = P0;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
315 *(s->pixel_ptr + x + 1) = P0;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
316 *(s->pixel_ptr + s->stride + x) = P0;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
317 *(s->pixel_ptr + s->stride + x + 1) = P0;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
318 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
319 }
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
320 s->pixel_ptr += s->stride * 2;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
321 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
322 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
323
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
324 /* report success */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
325 return 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
326 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
327
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
328 static int ipvideo_decode_block_opcode_0x8(IpvideoContext *s)
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
329 {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
330 int x, y;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
331 unsigned char P[8];
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
332 unsigned char B[8];
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
333 unsigned int flags = 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
334 unsigned int bitmask = 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
335 unsigned char P0 = 0, P1 = 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
336 int lower_half = 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
337
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
338 /* 2-color encoding for each 4x4 quadrant, or 2-color encoding on
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
339 * either top and bottom or left and right halves */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
340 CHECK_STREAM_PTR(2);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
341
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
342 P[0] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
343 P[1] = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
344
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
345 if (P[0] <= P[1]) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
346
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
347 /* need 12 more bytes */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
348 CHECK_STREAM_PTR(12);
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
349 B[0] = *s->stream_ptr++; B[1] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
350 P[2] = *s->stream_ptr++; P[3] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
351 B[2] = *s->stream_ptr++; B[3] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
352 P[4] = *s->stream_ptr++; P[5] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
353 B[4] = *s->stream_ptr++; B[5] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
354 P[6] = *s->stream_ptr++; P[7] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
355 B[6] = *s->stream_ptr++; B[7] = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
356
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
357 for (y = 0; y < 8; y++) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
358
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
359 /* time to reload flags? */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
360 if (y == 0) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
361 flags =
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
362 ((B[0] & 0xF0) << 4) | ((B[4] & 0xF0) << 8) |
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
363 ((B[0] & 0x0F) ) | ((B[4] & 0x0F) << 4) |
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
364 ((B[1] & 0xF0) << 20) | ((B[5] & 0xF0) << 24) |
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
365 ((B[1] & 0x0F) << 16) | ((B[5] & 0x0F) << 20);
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
366 bitmask = 0x00000001;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
367 lower_half = 0; /* still on top half */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
368 } else if (y == 4) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
369 flags =
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
370 ((B[2] & 0xF0) << 4) | ((B[6] & 0xF0) << 8) |
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
371 ((B[2] & 0x0F) ) | ((B[6] & 0x0F) << 4) |
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
372 ((B[3] & 0xF0) << 20) | ((B[7] & 0xF0) << 24) |
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
373 ((B[3] & 0x0F) << 16) | ((B[7] & 0x0F) << 20);
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
374 bitmask = 0x00000001;
1474
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
375 lower_half = 2;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
376 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
377
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
378 for (x = 0; x < 8; x++, bitmask <<= 1) {
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
379 /* get the pixel values ready for this quadrant */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
380 if (x == 0) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
381 P0 = P[lower_half + 0];
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
382 P1 = P[lower_half + 1];
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
383 } else if (x == 4) {
1474
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
384 P0 = P[lower_half + 4];
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
385 P1 = P[lower_half + 5];
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
386 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
387
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
388 if (flags & bitmask)
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
389 *s->pixel_ptr++ = P1;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
390 else
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
391 *s->pixel_ptr++ = P0;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
392 }
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
393 s->pixel_ptr += s->line_inc;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
394 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
395
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
396 } else {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
397
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
398 /* need 10 more bytes */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
399 CHECK_STREAM_PTR(10);
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
400 B[0] = *s->stream_ptr++; B[1] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
401 B[2] = *s->stream_ptr++; B[3] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
402 P[2] = *s->stream_ptr++; P[3] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
403 B[4] = *s->stream_ptr++; B[5] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
404 B[6] = *s->stream_ptr++; B[7] = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
405
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
406 if (P[2] <= P[3]) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
407
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
408 /* vertical split; left & right halves are 2-color encoded */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
409
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
410 for (y = 0; y < 8; y++) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
411
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
412 /* time to reload flags? */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
413 if (y == 0) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
414 flags =
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
415 ((B[0] & 0xF0) << 4) | ((B[4] & 0xF0) << 8) |
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
416 ((B[0] & 0x0F) ) | ((B[4] & 0x0F) << 4) |
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
417 ((B[1] & 0xF0) << 20) | ((B[5] & 0xF0) << 24) |
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
418 ((B[1] & 0x0F) << 16) | ((B[5] & 0x0F) << 20);
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
419 bitmask = 0x00000001;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
420 } else if (y == 4) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
421 flags =
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
422 ((B[2] & 0xF0) << 4) | ((B[6] & 0xF0) << 8) |
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
423 ((B[2] & 0x0F) ) | ((B[6] & 0x0F) << 4) |
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
424 ((B[3] & 0xF0) << 20) | ((B[7] & 0xF0) << 24) |
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
425 ((B[3] & 0x0F) << 16) | ((B[7] & 0x0F) << 20);
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
426 bitmask = 0x00000001;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
427 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
428
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
429 for (x = 0; x < 8; x++, bitmask <<= 1) {
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
430 /* get the pixel values ready for this half */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
431 if (x == 0) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
432 P0 = P[0];
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
433 P1 = P[1];
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
434 } else if (x == 4) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
435 P0 = P[2];
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
436 P1 = P[3];
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
437 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
438
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
439 if (flags & bitmask)
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
440 *s->pixel_ptr++ = P1;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
441 else
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
442 *s->pixel_ptr++ = P0;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
443 }
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
444 s->pixel_ptr += s->line_inc;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
445 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
446
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
447 } else {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
448
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
449 /* horizontal split; top & bottom halves are 2-color encoded */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
450
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
451 for (y = 0; y < 8; y++) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
452
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
453 flags = B[y];
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
454 if (y == 0) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
455 P0 = P[0];
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
456 P1 = P[1];
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
457 } else if (y == 4) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
458 P0 = P[2];
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
459 P1 = P[3];
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
460 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
461
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
462 for (bitmask = 0x01; bitmask <= 0x80; bitmask <<= 1) {
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
463
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
464 if (flags & bitmask)
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
465 *s->pixel_ptr++ = P1;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
466 else
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
467 *s->pixel_ptr++ = P0;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
468 }
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
469 s->pixel_ptr += s->line_inc;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
470 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
471 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
472 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
473
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
474 /* report success */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
475 return 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
476 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
477
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
478 static int ipvideo_decode_block_opcode_0x9(IpvideoContext *s)
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
479 {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
480 int x, y;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
481 unsigned char P[4];
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
482 unsigned char B[4];
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
483 unsigned int flags = 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
484 int shifter = 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
485 unsigned char pix;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
486
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
487 /* 4-color encoding */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
488 CHECK_STREAM_PTR(4);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
489
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
490 for (y = 0; y < 4; y++)
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
491 P[y] = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
492
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
493 if ((P[0] <= P[1]) && (P[2] <= P[3])) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
494
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
495 /* 1 of 4 colors for each pixel, need 16 more bytes */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
496 CHECK_STREAM_PTR(16);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
497
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
498 for (y = 0; y < 8; y++) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
499 /* get the next set of 8 2-bit flags */
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
500 flags = (s->stream_ptr[1] << 8) | s->stream_ptr[0];
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
501 s->stream_ptr += 2;
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
502 for (x = 0, shifter = 0; x < 8; x++, shifter += 2) {
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
503 *s->pixel_ptr++ = P[(flags >> shifter) & 0x03];
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
504 }
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
505 s->pixel_ptr += s->line_inc;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
506 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
507
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
508 } else if ((P[0] <= P[1]) && (P[2] > P[3])) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
509
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
510 /* 1 of 4 colors for each 2x2 block, need 4 more bytes */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
511 CHECK_STREAM_PTR(4);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
512
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
513 B[0] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
514 B[1] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
515 B[2] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
516 B[3] = *s->stream_ptr++;
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
517 flags = (B[3] << 24) | (B[2] << 16) | (B[1] << 8) | B[0];
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
518 shifter = 0;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
519
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
520 for (y = 0; y < 8; y += 2) {
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
521 for (x = 0; x < 8; x += 2, shifter += 2) {
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
522 pix = P[(flags >> shifter) & 0x03];
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
523 *(s->pixel_ptr + x) = pix;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
524 *(s->pixel_ptr + x + 1) = pix;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
525 *(s->pixel_ptr + s->stride + x) = pix;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
526 *(s->pixel_ptr + s->stride + x + 1) = pix;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
527 }
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
528 s->pixel_ptr += s->stride * 2;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
529 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
530
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
531 } else if ((P[0] > P[1]) && (P[2] <= P[3])) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
532
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
533 /* 1 of 4 colors for each 2x1 block, need 8 more bytes */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
534 CHECK_STREAM_PTR(8);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
535
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
536 for (y = 0; y < 8; y++) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
537 /* time to reload flags? */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
538 if ((y == 0) || (y == 4)) {
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
539 B[0] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
540 B[1] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
541 B[2] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
542 B[3] = *s->stream_ptr++;
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
543 flags = (B[3] << 24) | (B[2] << 16) | (B[1] << 8) | B[0];
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
544 shifter = 0;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
545 }
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
546 for (x = 0; x < 8; x += 2, shifter += 2) {
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
547 pix = P[(flags >> shifter) & 0x03];
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
548 *(s->pixel_ptr + x) = pix;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
549 *(s->pixel_ptr + x + 1) = pix;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
550 }
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
551 s->pixel_ptr += s->stride;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
552 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
553
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
554 } else {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
555
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
556 /* 1 of 4 colors for each 1x2 block, need 8 more bytes */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
557 CHECK_STREAM_PTR(8);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
558
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
559 for (y = 0; y < 8; y += 2) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
560 /* time to reload flags? */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
561 if ((y == 0) || (y == 4)) {
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
562 B[0] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
563 B[1] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
564 B[2] = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
565 B[3] = *s->stream_ptr++;
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
566 flags = (B[3] << 24) | (B[2] << 16) | (B[1] << 8) | B[0];
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
567 shifter = 0;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
568 }
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
569 for (x = 0; x < 8; x++, shifter += 2) {
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
570 pix = P[(flags >> shifter) & 0x03];
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
571 *(s->pixel_ptr + x) = pix;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
572 *(s->pixel_ptr + s->stride + x) = pix;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
573 }
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
574 s->pixel_ptr += s->stride * 2;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
575 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
576 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
577
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
578 /* report success */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
579 return 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
580 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
581
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
582 static int ipvideo_decode_block_opcode_0xA(IpvideoContext *s)
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
583 {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
584 int x, y;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
585 unsigned char P[16];
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
586 unsigned char B[16];
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
587 int flags = 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
588 int shifter = 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
589 int index;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
590 int split;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
591 int lower_half;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
592
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
593 /* 4-color encoding for each 4x4 quadrant, or 4-color encoding on
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
594 * either top and bottom or left and right halves */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
595 CHECK_STREAM_PTR(4);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
596
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
597 for (y = 0; y < 4; y++)
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
598 P[y] = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
599
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
600 if (P[0] <= P[1]) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
601
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
602 /* 4-color encoding for each quadrant; need 28 more bytes */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
603 CHECK_STREAM_PTR(28);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
604
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
605 for (y = 0; y < 4; y++)
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
606 B[y] = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
607 for (y = 4; y < 16; y += 4) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
608 for (x = y; x < y + 4; x++)
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
609 P[x] = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
610 for (x = y; x < y + 4; x++)
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
611 B[x] = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
612 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
613
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
614 for (y = 0; y < 8; y++) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
615
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
616 lower_half = (y >= 4) ? 4 : 0;
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
617 flags = (B[y + 8] << 8) | B[y];
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
618
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
619 for (x = 0, shifter = 0; x < 8; x++, shifter += 2) {
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
620 split = (x >= 4) ? 8 : 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
621 index = split + lower_half + ((flags >> shifter) & 0x03);
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
622 *s->pixel_ptr++ = P[index];
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
623 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
624
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
625 s->pixel_ptr += s->line_inc;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
626 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
627
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
628 } else {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
629
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
630 /* 4-color encoding for either left and right or top and bottom
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
631 * halves; need 20 more bytes */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
632 CHECK_STREAM_PTR(20);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
633
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
634 for (y = 0; y < 8; y++)
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
635 B[y] = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
636 for (y = 4; y < 8; y++)
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
637 P[y] = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
638 for (y = 8; y < 16; y++)
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
639 B[y] = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
640
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
641 if (P[4] <= P[5]) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
642
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
643 /* block is divided into left and right halves */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
644 for (y = 0; y < 8; y++) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
645
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
646 flags = (B[y + 8] << 8) | B[y];
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
647 split = 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
648
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
649 for (x = 0, shifter = 0; x < 8; x++, shifter += 2) {
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
650 if (x == 4)
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
651 split = 4;
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
652 *s->pixel_ptr++ = P[split + ((flags >> shifter) & 0x03)];
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
653 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
654
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
655 s->pixel_ptr += s->line_inc;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
656 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
657
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
658 } else {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
659
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
660 /* block is divided into top and bottom halves */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
661 split = 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
662 for (y = 0; y < 8; y++) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
663
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
664 flags = (B[y * 2 + 1] << 8) | B[y * 2];
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
665 if (y == 4)
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
666 split = 4;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
667
1473
873100cd2108 wrong, wrong, wrong...coded bits are read in the opposite direction
tmmm
parents: 1468
diff changeset
668 for (x = 0, shifter = 0; x < 8; x++, shifter += 2)
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
669 *s->pixel_ptr++ = P[split + ((flags >> shifter) & 0x03)];
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
670
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
671 s->pixel_ptr += s->line_inc;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
672 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
673 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
674 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
675
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
676 /* report success */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
677 return 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
678 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
679
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
680 static int ipvideo_decode_block_opcode_0xB(IpvideoContext *s)
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
681 {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
682 int x, y;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
683
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
684 /* 64-color encoding (each pixel in block is a different color) */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
685 CHECK_STREAM_PTR(64);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
686
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
687 for (y = 0; y < 8; y++) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
688 for (x = 0; x < 8; x++) {
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
689 *s->pixel_ptr++ = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
690 }
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
691 s->pixel_ptr += s->line_inc;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
692 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
693
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
694 /* report success */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
695 return 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
696 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
697
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
698 static int ipvideo_decode_block_opcode_0xC(IpvideoContext *s)
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
699 {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
700 int x, y;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
701 unsigned char pix;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
702
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
703 /* 16-color block encoding: each 2x2 block is a different color */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
704 CHECK_STREAM_PTR(16);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
705
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
706 for (y = 0; y < 8; y += 2) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
707 for (x = 0; x < 8; x += 2) {
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
708 pix = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
709 *(s->pixel_ptr + x) = pix;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
710 *(s->pixel_ptr + x + 1) = pix;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
711 *(s->pixel_ptr + s->stride + x) = pix;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
712 *(s->pixel_ptr + s->stride + x + 1) = pix;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
713 }
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
714 s->pixel_ptr += s->stride * 2;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
715 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
716
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
717 /* report success */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
718 return 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
719 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
720
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
721 static int ipvideo_decode_block_opcode_0xD(IpvideoContext *s)
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
722 {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
723 int x, y;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
724 unsigned char P[4];
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
725 unsigned char index = 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
726
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
727 /* 4-color block encoding: each 4x4 block is a different color */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
728 CHECK_STREAM_PTR(4);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
729
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
730 for (y = 0; y < 4; y++)
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
731 P[y] = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
732
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
733 for (y = 0; y < 8; y++) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
734 if (y < 4)
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
735 index = 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
736 else
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
737 index = 2;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
738
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
739 for (x = 0; x < 8; x++) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
740 if (x == 4)
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
741 index++;
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
742 *s->pixel_ptr++ = P[index];
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
743 }
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
744 s->pixel_ptr += s->line_inc;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
745 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
746
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
747 /* report success */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
748 return 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
749 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
750
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
751 static int ipvideo_decode_block_opcode_0xE(IpvideoContext *s)
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
752 {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
753 int x, y;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
754 unsigned char pix;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
755
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
756 /* 1-color encoding: the whole block is 1 solid color */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
757 CHECK_STREAM_PTR(1);
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
758 pix = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
759
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
760 for (y = 0; y < 8; y++) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
761 for (x = 0; x < 8; x++) {
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
762 *s->pixel_ptr++ = pix;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
763 }
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
764 s->pixel_ptr += s->line_inc;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
765 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
766
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
767 /* report success */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
768 return 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
769 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
770
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
771 static int ipvideo_decode_block_opcode_0xF(IpvideoContext *s)
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
772 {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
773 int x, y;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
774 unsigned char sample0, sample1;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
775
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
776 /* dithered encoding */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
777 CHECK_STREAM_PTR(2);
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
778 sample0 = *s->stream_ptr++;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
779 sample1 = *s->stream_ptr++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
780
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
781 for (y = 0; y < 8; y++) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
782 for (x = 0; x < 8; x += 2) {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
783 if (y & 1) {
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
784 *s->pixel_ptr++ = sample1;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
785 *s->pixel_ptr++ = sample0;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
786 } else {
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
787 *s->pixel_ptr++ = sample0;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
788 *s->pixel_ptr++ = sample1;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
789 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
790 }
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
791 s->pixel_ptr += s->line_inc;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
792 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
793
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
794 /* report success */
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
795 return 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
796 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
797
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
798 static int (*ipvideo_decode_block[16])(IpvideoContext *s);
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
799
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
800 static void ipvideo_decode_opcodes(IpvideoContext *s)
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
801 {
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
802 int x, y;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
803 int index = 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
804 unsigned char opcode;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
805 int ret;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
806 int code_counts[16];
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
807 static int frame = 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
808
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
809 debug_interplay("------------------ frame %d\n", frame);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
810 frame++;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
811
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
812 for (x = 0; x < 16; x++)
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
813 code_counts[x] = 0;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
814
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
815 /* this is PAL8, so make the palette available */
1585
6b224ca24033 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 1545
diff changeset
816 memcpy(s->current_frame.data[1], s->avctx->palctrl->palette, PALETTE_COUNT * 4);
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
817
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
818 s->stride = s->current_frame.linesize[0];
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
819 s->stream_ptr = s->buf + 14; /* data starts 14 bytes in */
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
820 s->stream_end = s->buf + s->size;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
821 s->line_inc = s->stride - 8;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
822 s->upper_motion_limit_offset = (s->avctx->height - 8) * s->stride
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
823 + s->avctx->width - 8;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
824 s->dsp = s->dsp;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
825
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
826 for (y = 0; y < (s->stride * s->avctx->height); y += s->stride * 8) {
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
827 for (x = y; x < y + s->avctx->width; x += 8) {
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
828 /* bottom nibble first, then top nibble (which makes it
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
829 * hard to use a GetBitcontext) */
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
830 if (index & 1)
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
831 opcode = s->decoding_map[index >> 1] >> 4;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
832 else
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
833 opcode = s->decoding_map[index >> 1] & 0xF;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
834 index++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
835
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
836 debug_interplay(" block @ (%3d, %3d): encoding 0x%X, data ptr @ %p\n",
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
837 x - y, y / s->stride, opcode, s->stream_ptr);
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
838 code_counts[opcode]++;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
839
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
840 s->pixel_ptr = s->current_frame.data[0] + x;
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
841 ret = ipvideo_decode_block[opcode](s);
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
842 if (ret != 0) {
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1585
diff changeset
843 av_log(s->avctx, AV_LOG_ERROR, " Interplay video: decode problem on frame %d, @ block (%d, %d)\n",
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
844 frame, x - y, y / s->stride);
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
845 return;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
846 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
847 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
848 }
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
849 if ((s->stream_ptr != s->stream_end) &&
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
850 (s->stream_ptr + 1 != s->stream_end)) {
2962
fde28cb7e3d5 use PRIxN, %zd, %td formats where needed
mru
parents: 2515
diff changeset
851 av_log(s->avctx, AV_LOG_ERROR, " Interplay video: decode finished with %td bytes left over\n",
1475
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
852 s->stream_end - s->stream_ptr);
26eb7678cb46 do away with all those naughty global variables
tmmm
parents: 1474
diff changeset
853 }
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
854 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
855
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
856 static int ipvideo_decode_init(AVCodecContext *avctx)
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
857 {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
858 IpvideoContext *s = avctx->priv_data;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
859
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
860 s->avctx = avctx;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
861
1585
6b224ca24033 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 1545
diff changeset
862 if (s->avctx->palctrl == NULL) {
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1585
diff changeset
863 av_log(avctx, AV_LOG_ERROR, " Interplay video: palette expected.\n");
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
864 return -1;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
865 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
866
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
867 avctx->pix_fmt = PIX_FMT_PAL8;
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
868 avctx->has_b_frames = 0;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
869 dsputil_init(&s->dsp, avctx);
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
870
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
871 /* 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
872 s->decoding_map_size = avctx->width * avctx->height / (8 * 8 * 2);
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
873
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
874 /* assign block decode functions */
1474
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
875 ipvideo_decode_block[0x0] = ipvideo_decode_block_opcode_0x0;
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
876 ipvideo_decode_block[0x1] = ipvideo_decode_block_opcode_0x1;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
877 ipvideo_decode_block[0x2] = ipvideo_decode_block_opcode_0x2;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
878 ipvideo_decode_block[0x3] = ipvideo_decode_block_opcode_0x3;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
879 ipvideo_decode_block[0x4] = ipvideo_decode_block_opcode_0x4;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
880 ipvideo_decode_block[0x5] = ipvideo_decode_block_opcode_0x5;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
881 ipvideo_decode_block[0x6] = ipvideo_decode_block_opcode_0x6;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
882 ipvideo_decode_block[0x7] = ipvideo_decode_block_opcode_0x7;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
883 ipvideo_decode_block[0x8] = ipvideo_decode_block_opcode_0x8;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
884 ipvideo_decode_block[0x9] = ipvideo_decode_block_opcode_0x9;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
885 ipvideo_decode_block[0xA] = ipvideo_decode_block_opcode_0xA;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
886 ipvideo_decode_block[0xB] = ipvideo_decode_block_opcode_0xB;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
887 ipvideo_decode_block[0xC] = ipvideo_decode_block_opcode_0xC;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
888 ipvideo_decode_block[0xD] = ipvideo_decode_block_opcode_0xD;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
889 ipvideo_decode_block[0xE] = ipvideo_decode_block_opcode_0xE;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
890 ipvideo_decode_block[0xF] = ipvideo_decode_block_opcode_0xF;
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
891
1474
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
892 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
893 s->second_last_frame.data[0] = NULL;
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
894
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
895 return 0;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
896 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
897
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
898 static int ipvideo_decode_frame(AVCodecContext *avctx,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
899 void *data, int *data_size,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
900 uint8_t *buf, int buf_size)
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
901 {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
902 IpvideoContext *s = avctx->priv_data;
1585
6b224ca24033 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 1545
diff changeset
903 AVPaletteControl *palette_control = avctx->palctrl;
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
904
1770
cd36e37fb879 handle invalid buffer sizes
melanson
parents: 1598
diff changeset
905 /* compressed buffer needs to be large enough to at least hold an entire
cd36e37fb879 handle invalid buffer sizes
melanson
parents: 1598
diff changeset
906 * decoding map */
cd36e37fb879 handle invalid buffer sizes
melanson
parents: 1598
diff changeset
907 if (buf_size < s->decoding_map_size)
cd36e37fb879 handle invalid buffer sizes
melanson
parents: 1598
diff changeset
908 return buf_size;
cd36e37fb879 handle invalid buffer sizes
melanson
parents: 1598
diff changeset
909
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
910 s->decoding_map = buf;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
911 s->buf = buf + s->decoding_map_size;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
912 s->size = buf_size - s->decoding_map_size;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
913
1474
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
914 s->current_frame.reference = 3;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
915 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
916 av_log(avctx, AV_LOG_ERROR, " Interplay Video: get_buffer() failed\n");
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
917 return -1;
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
918 }
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
919
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
920 ipvideo_decode_opcodes(s);
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
921
1585
6b224ca24033 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 1545
diff changeset
922 if (palette_control->palette_changed) {
6b224ca24033 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 1545
diff changeset
923 palette_control->palette_changed = 0;
6b224ca24033 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 1545
diff changeset
924 s->current_frame.palette_has_changed = 1;
6b224ca24033 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 1545
diff changeset
925 }
6b224ca24033 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 1545
diff changeset
926
1474
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
927 *data_size = sizeof(AVFrame);
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
928 *(AVFrame*)data = s->current_frame;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
929
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
930 /* shuffle frames */
1474
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
931 if (s->second_last_frame.data[0])
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
932 avctx->release_buffer(avctx, &s->second_last_frame);
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
933 s->second_last_frame = s->last_frame;
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
934 s->last_frame = s->current_frame;
1474
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
935 s->current_frame.data[0] = NULL; /* catch any access attempts */
1468
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
936
92c1f24f7754 initial Interplay video decoder
tmmm
parents: 1439
diff changeset
937 /* report that the buffer was completely consumed */
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
938 return buf_size;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
939 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
940
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
941 static int ipvideo_decode_end(AVCodecContext *avctx)
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
942 {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
943 IpvideoContext *s = avctx->priv_data;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
944
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
945 /* release the last frame */
1474
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
946 if (s->last_frame.data[0])
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
947 avctx->release_buffer(avctx, &s->last_frame);
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
948 if (s->second_last_frame.data[0])
94c7f7c23dd9 video looks beautiful now, many thanks to Alexander Belyakov
tmmm
parents: 1473
diff changeset
949 avctx->release_buffer(avctx, &s->second_last_frame);
1439
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
950
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
951 return 0;
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
952 }
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
953
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
954 AVCodec interplay_video_decoder = {
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
955 "interplayvideo",
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
956 CODEC_TYPE_VIDEO,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
957 CODEC_ID_INTERPLAY_VIDEO,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
958 sizeof(IpvideoContext),
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
959 ipvideo_decode_init,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
960 NULL,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
961 ipvideo_decode_end,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
962 ipvideo_decode_frame,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
963 CODEC_CAP_DR1,
a4d00b1f0271 initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
964 };