annotate interplayvideo.c @ 6047:2f9c17454842 libavcodec

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