Mercurial > libavcodec.hg
annotate vmdav.c @ 1795:920e6381e1fe libavcodec
2 byte shorter userdata for mpeg4
in the past it was startcode,string,00,7F,startcode
now it is startcode,string,stratcode
both are mpeg4 compliant, as according to the standard the userdata lasts until the next 00 00 01 (startcode prefix) but some very primitive decoders which simply skip until the first 00 byte and then expect the next valid startcode might fail with the old variant, just a theory though (didnt test if quicktime can decode it now)
author | michael |
---|---|
date | Sun, 08 Feb 2004 22:52:35 +0000 |
parents | 6a7e68899d8a |
children | a660ef952580 |
rev | line source |
---|---|
1717
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
1 /* |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
2 * Sierra VMD Audio & Video Decoders |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
3 * Copyright (C) 2004 the ffmpeg project |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
4 * |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
5 * This library is free software; you can redistribute it and/or |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
6 * modify it under the terms of the GNU Lesser General Public |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
7 * License as published by the Free Software Foundation; either |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
8 * version 2 of the License, or (at your option) any later version. |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
9 * |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
10 * This library is distributed in the hope that it will be useful, |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
13 * Lesser General Public License for more details. |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
14 * |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
15 * You should have received a copy of the GNU Lesser General Public |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
16 * License along with this library; if not, write to the Free Software |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
18 * |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
19 */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
20 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
21 /** |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
22 * @file vmdvideo.c |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
23 * Sierra VMD audio & video decoders |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
24 * by Vladimir "VAG" Gneushev (vagsoft at mail.ru) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
25 * |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
26 * The video decoder outputs PAL8 colorspace data. The decoder expects |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
27 * a 0x330-byte VMD file header to be transmitted via extradata during |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
28 * codec initialization. Each encoded frame that is sent to this decoder |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
29 * is expected to be prepended with the appropriate 16-byte frame |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
30 * information record from the VMD file. |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
31 * |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
32 * The audio decoder, like the video decoder, expects each encoded data |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
33 * chunk to be prepended with the approriate 16-byte frame information |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
34 * record from the VMD file. It does not require the 0x330-byte VMD file |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
35 * header, but it does need the audio setup parameters passed in through |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
36 * normal libavcodec API means. |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
37 */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
38 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
39 #include <stdio.h> |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
40 #include <stdlib.h> |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
41 #include <string.h> |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
42 #include <unistd.h> |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
43 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
44 #include "common.h" |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
45 #include "avcodec.h" |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
46 #include "dsputil.h" |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
47 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
48 #define VMD_HEADER_SIZE 0x330 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
49 #define PALETTE_COUNT 256 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
50 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
51 #define LE_16(x) ((((uint8_t*)(x))[1] << 8) | ((uint8_t*)(x))[0]) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
52 #define LE_32(x) ((((uint8_t*)(x))[3] << 24) | \ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
53 (((uint8_t*)(x))[2] << 16) | \ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
54 (((uint8_t*)(x))[1] << 8) | \ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
55 ((uint8_t*)(x))[0]) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
56 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
57 /* |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
58 * Video Decoder |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
59 */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
60 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
61 typedef struct VmdVideoContext { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
62 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
63 AVCodecContext *avctx; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
64 DSPContext dsp; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
65 AVFrame frame; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
66 AVFrame prev_frame; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
67 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
68 unsigned char *buf; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
69 int size; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
70 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
71 unsigned char palette[PALETTE_COUNT * 4]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
72 unsigned char *unpack_buffer; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
73 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
74 } VmdVideoContext; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
75 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
76 #define QUEUE_SIZE 0x1000 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
77 #define QUEUE_MASK 0x0FFF |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
78 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
79 static void lz_unpack(unsigned char *src, unsigned char *dest) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
80 { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
81 unsigned char *s; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
82 unsigned char *d; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
83 unsigned char queue[QUEUE_SIZE]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
84 unsigned int qpos; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
85 unsigned int dataleft; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
86 unsigned int chainofs; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
87 unsigned int chainlen; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
88 unsigned int speclen; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
89 unsigned char tag; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
90 unsigned int i, j; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
91 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
92 s = src; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
93 d = dest; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
94 dataleft = LE_32(s); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
95 s += 4; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
96 memset(queue, QUEUE_SIZE, 0x20); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
97 if (LE_32(s) == 0x56781234) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
98 s += 4; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
99 qpos = 0x111; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
100 speclen = 0xF + 3; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
101 } else { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
102 qpos = 0xFEE; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
103 speclen = 100; /* no speclen */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
104 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
105 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
106 while (dataleft > 0) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
107 tag = *s++; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
108 if ((tag == 0xFF) && (dataleft > 8)) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
109 for (i = 0; i < 8; i++) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
110 queue[qpos++] = *d++ = *s++; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
111 qpos &= QUEUE_MASK; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
112 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
113 dataleft -= 8; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
114 } else { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
115 for (i = 0; i < 8; i++) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
116 if (dataleft == 0) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
117 break; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
118 if (tag & 0x01) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
119 queue[qpos++] = *d++ = *s++; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
120 qpos &= QUEUE_MASK; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
121 dataleft--; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
122 } else { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
123 chainofs = *s++; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
124 chainofs |= ((*s & 0xF0) << 4); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
125 chainlen = (*s++ & 0x0F) + 3; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
126 if (chainlen == speclen) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
127 chainlen = *s++ + 0xF + 3; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
128 for (j = 0; j < chainlen; j++) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
129 *d = queue[chainofs++ & QUEUE_MASK]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
130 queue[qpos++] = *d++; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
131 qpos &= QUEUE_MASK; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
132 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
133 dataleft -= chainlen; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
134 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
135 tag >>= 1; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
136 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
137 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
138 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
139 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
140 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
141 static int rle_unpack(unsigned char *src, unsigned char *dest, int len) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
142 { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
143 unsigned char *ps; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
144 unsigned char *pd; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
145 int i, l; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
146 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
147 ps = src; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
148 pd = dest; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
149 if (len & 1) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
150 *pd++ = *ps++; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
151 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
152 len >>= 1; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
153 i = 0; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
154 do { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
155 l = *ps++; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
156 if (l & 0x80) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
157 l = (l & 0x7F) * 2; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
158 memcpy(pd, ps, l); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
159 ps += l; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
160 pd += l; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
161 } else { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
162 for (i = 0; i < l; i++) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
163 *pd++ = ps[0]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
164 *pd++ = ps[1]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
165 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
166 ps += 2; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
167 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
168 i += l; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
169 } while (i < len); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
170 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
171 return (ps - src); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
172 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
173 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
174 static void vmd_decode(VmdVideoContext *s) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
175 { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
176 int i; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
177 unsigned int *palette32; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
178 unsigned char r, g, b; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
179 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
180 /* point to the start of the encoded data */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
181 unsigned char *p = s->buf + 16; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
182 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
183 unsigned char *pb; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
184 unsigned char meth; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
185 unsigned char *dp; /* pointer to current frame */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
186 unsigned char *pp; /* pointer to previous frame */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
187 unsigned char len; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
188 int ofs; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
189 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
190 int frame_x, frame_y; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
191 int frame_width, frame_height; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
192 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
193 frame_x = LE_16(&s->buf[6]); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
194 frame_y = LE_16(&s->buf[8]); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
195 frame_width = LE_16(&s->buf[10]) - frame_x + 1; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
196 frame_height = LE_16(&s->buf[12]) - frame_y + 1; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
197 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
198 /* if only a certain region will be updated, copy the entire previous |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
199 * frame before the decode */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
200 if (frame_x || frame_y || (frame_width != s->avctx->width) || |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
201 (frame_height != s->avctx->height)) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
202 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
203 memcpy(s->frame.data[0], s->prev_frame.data[0], |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
204 s->avctx->height * s->frame.linesize[0]); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
205 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
206 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
207 /* check if there is a new palette */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
208 if (s->buf[15] & 0x02) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
209 p += 2; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
210 palette32 = (unsigned int *)s->palette; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
211 for (i = 0; i < PALETTE_COUNT; i++) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
212 r = *p++ * 4; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
213 g = *p++ * 4; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
214 b = *p++ * 4; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
215 palette32[i] = (r << 16) | (g << 8) | (b); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
216 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
217 s->size -= (256 * 3 + 2); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
218 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
219 if (s->size >= 0) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
220 /* originally UnpackFrame in VAG's code */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
221 pb = p; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
222 meth = *pb++; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
223 if (meth & 0x80) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
224 lz_unpack(pb, s->unpack_buffer); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
225 meth &= 0x7F; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
226 pb = s->unpack_buffer; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
227 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
228 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
229 dp = &s->frame.data[0][frame_y * s->frame.linesize[0] + frame_x]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
230 pp = &s->prev_frame.data[0][frame_y * s->prev_frame.linesize[0] + frame_x]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
231 switch (meth) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
232 case 1: |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
233 for (i = 0; i < frame_height; i++) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
234 ofs = 0; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
235 do { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
236 len = *pb++; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
237 if (len & 0x80) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
238 len = (len & 0x7F) + 1; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
239 memcpy(&dp[ofs], pb, len); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
240 pb += len; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
241 ofs += len; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
242 } else { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
243 /* interframe pixel copy */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
244 memcpy(&dp[ofs], &pp[ofs], len + 1); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
245 ofs += len + 1; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
246 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
247 } while (ofs < frame_width); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
248 if (ofs > frame_width) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
249 printf (" VMD video: offset > width (%d > %d)\n", |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
250 ofs, frame_width); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
251 break; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
252 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
253 dp += s->frame.linesize[0]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
254 pp += s->prev_frame.linesize[0]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
255 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
256 break; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
257 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
258 case 2: |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
259 for (i = 0; i < frame_height; i++) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
260 memcpy(dp, pb, frame_width); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
261 pb += frame_width; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
262 dp += s->frame.linesize[0]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
263 pp += s->prev_frame.linesize[0]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
264 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
265 break; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
266 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
267 case 3: |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
268 for (i = 0; i < frame_height; i++) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
269 ofs = 0; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
270 do { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
271 len = *pb++; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
272 if (len & 0x80) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
273 len = (len & 0x7F) + 1; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
274 if (*pb++ == 0xFF) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
275 len = rle_unpack(pb, dp, len); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
276 else |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
277 memcpy(&dp[ofs], pb, len); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
278 pb += len; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
279 ofs += len; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
280 } else { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
281 /* interframe pixel copy */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
282 memcpy(&dp[ofs], &pp[ofs], len + 1); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
283 ofs += len + 1; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
284 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
285 } while (ofs < frame_width); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
286 if (ofs > frame_width) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
287 printf (" VMD video: offset > width (%d > %d)\n", |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
288 ofs, frame_width); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
289 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
290 dp += s->frame.linesize[0]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
291 pp += s->prev_frame.linesize[0]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
292 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
293 break; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
294 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
295 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
296 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
297 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
298 static int vmdvideo_decode_init(AVCodecContext *avctx) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
299 { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
300 VmdVideoContext *s = (VmdVideoContext *)avctx->priv_data; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
301 int i; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
302 unsigned int *palette32; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
303 int palette_index = 0; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
304 unsigned char r, g, b; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
305 unsigned char *vmd_header; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
306 unsigned char *raw_palette; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
307 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
308 s->avctx = avctx; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
309 avctx->pix_fmt = PIX_FMT_PAL8; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
310 avctx->has_b_frames = 0; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
311 dsputil_init(&s->dsp, avctx); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
312 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
313 /* make sure the VMD header made it */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
314 if (s->avctx->extradata_size != VMD_HEADER_SIZE) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
315 printf(" VMD video: expected extradata size of %d\n", |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
316 VMD_HEADER_SIZE); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
317 return -1; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
318 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
319 vmd_header = (unsigned char *)avctx->extradata; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
320 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
321 s->unpack_buffer = av_malloc(LE_32(&vmd_header[800])); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
322 if (!s->unpack_buffer) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
323 return -1; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
324 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
325 /* load up the initial palette */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
326 raw_palette = &vmd_header[28]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
327 palette32 = (unsigned int *)s->palette; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
328 for (i = 0; i < PALETTE_COUNT; i++) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
329 r = raw_palette[palette_index++] * 4; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
330 g = raw_palette[palette_index++] * 4; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
331 b = raw_palette[palette_index++] * 4; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
332 palette32[i] = (r << 16) | (g << 8) | (b); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
333 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
334 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
335 s->frame.data[0] = s->prev_frame.data[0] = NULL; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
336 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
337 return 0; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
338 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
339 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
340 static int vmdvideo_decode_frame(AVCodecContext *avctx, |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
341 void *data, int *data_size, |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
342 uint8_t *buf, int buf_size) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
343 { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
344 VmdVideoContext *s = (VmdVideoContext *)avctx->priv_data; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
345 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
346 s->buf = buf; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
347 s->size = buf_size; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
348 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
349 s->frame.reference = 1; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
350 if (avctx->get_buffer(avctx, &s->frame)) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
351 printf (" VMD Video: get_buffer() failed\n"); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
352 return -1; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
353 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
354 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
355 vmd_decode(s); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
356 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
357 /* make the palette available on the way out */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
358 memcpy(s->frame.data[1], s->palette, PALETTE_COUNT * 4); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
359 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
360 if (s->prev_frame.data[0]) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
361 avctx->release_buffer(avctx, &s->prev_frame); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
362 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
363 /* shuffle frames */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
364 s->prev_frame = s->frame; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
365 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
366 *data_size = sizeof(AVFrame); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
367 *(AVFrame*)data = s->frame; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
368 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
369 /* report that the buffer was completely consumed */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
370 return buf_size; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
371 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
372 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
373 static int vmdvideo_decode_end(AVCodecContext *avctx) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
374 { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
375 VmdVideoContext *s = (VmdVideoContext *)avctx->priv_data; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
376 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
377 if (s->prev_frame.data[0]) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
378 avctx->release_buffer(avctx, &s->prev_frame); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
379 av_free(s->unpack_buffer); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
380 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
381 return 0; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
382 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
383 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
384 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
385 /* |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
386 * Audio Decoder |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
387 */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
388 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
389 typedef struct VmdAudioContext { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
390 int channels; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
391 int bits; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
392 int block_align; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
393 unsigned char steps8[16]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
394 unsigned short steps16[16]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
395 unsigned short steps128[256]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
396 short predictors[2]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
397 } VmdAudioContext; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
398 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
399 static int vmdaudio_decode_init(AVCodecContext *avctx) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
400 { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
401 VmdAudioContext *s = (VmdAudioContext *)avctx->priv_data; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
402 int i; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
403 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
404 s->channels = avctx->channels; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
405 s->bits = avctx->bits_per_sample; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
406 s->block_align = avctx->block_align; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
407 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
408 printf (" %d channels, %d bits/sample, block align = %d\n", |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
409 s->channels, s->bits, s->block_align); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
410 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
411 /* set up the steps8 and steps16 tables */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
412 for (i = 0; i < 8; i++) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
413 if (i < 4) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
414 s->steps8[i] = i; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
415 else |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
416 s->steps8[i] = s->steps8[i - 1] + i - 1; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
417 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
418 if (i == 0) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
419 s->steps16[i] = 0; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
420 else if (i == 1) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
421 s->steps16[i] = 4; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
422 else if (i == 2) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
423 s->steps16[i] = 16; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
424 else |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
425 s->steps16[i] = 1 << (i + 4); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
426 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
427 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
428 /* set up the step128 table */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
429 s->steps128[0] = 0; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
430 s->steps128[1] = 8; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
431 for (i = 0x02; i <= 0x20; i++) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
432 s->steps128[i] = (i - 1) << 4; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
433 for (i = 0x21; i <= 0x60; i++) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
434 s->steps128[i] = (i + 0x1F) << 3; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
435 for (i = 0x61; i <= 0x70; i++) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
436 s->steps128[i] = (i - 0x51) << 6; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
437 for (i = 0x71; i <= 0x78; i++) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
438 s->steps128[i] = (i - 0x69) << 8; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
439 for (i = 0x79; i <= 0x7D; i++) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
440 s->steps128[i] = (i - 0x75) << 10; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
441 s->steps128[0x7E] = 0x3000; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
442 s->steps128[0x7F] = 0x4000; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
443 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
444 /* set up the negative half of each table */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
445 for (i = 0; i < 8; i++) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
446 s->steps8[i + 8] = -s->steps8[i]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
447 s->steps16[i + 8] = -s->steps16[i]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
448 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
449 for (i = 0; i < 128; i++) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
450 s->steps128[i + 128] = -s->steps128[i]; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
451 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
452 return 0; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
453 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
454 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
455 static void vmdaudio_decode_audio(VmdAudioContext *s, unsigned char *data, |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
456 uint8_t *buf, int ratio) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
457 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
458 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
459 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
460 static void vmdaudio_loadsound(VmdAudioContext *s, unsigned char *data, |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
461 uint8_t *buf, int silence) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
462 { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
463 if (s->channels == 2) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
464 if ((s->block_align & 0x01) == 0) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
465 if (silence) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
466 memset(data, 0, s->block_align * 2); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
467 else |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
468 vmdaudio_decode_audio(s, data, buf, 1); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
469 } else { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
470 if (silence) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
471 memset(data, 0, s->block_align * 2); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
472 // else |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
473 // vmdaudio_decode_audio(s, data, buf, 1); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
474 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
475 } else { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
476 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
477 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
478 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
479 static int vmdaudio_decode_frame(AVCodecContext *avctx, |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
480 void *data, int *data_size, |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
481 uint8_t *buf, int buf_size) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
482 { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
483 VmdAudioContext *s = (VmdAudioContext *)avctx->priv_data; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
484 unsigned int sound_flags; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
485 unsigned char *output_samples = (unsigned char *)data; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
486 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
487 /* point to the start of the encoded data */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
488 unsigned char *p = buf + 16; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
489 unsigned char *p_end = buf + buf_size; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
490 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
491 if (buf[6] == 1) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
492 /* the chunk contains audio */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
493 vmdaudio_loadsound(s, output_samples, p, 0); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
494 } else if (buf[6] == 2) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
495 /* the chunk contains audio and silence mixed together */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
496 sound_flags = LE_32(p); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
497 p += 4; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
498 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
499 /* do something with extrabufs here? */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
500 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
501 while (p < p_end) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
502 if (sound_flags & 0x01) |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
503 /* audio */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
504 vmdaudio_loadsound(s, output_samples, p, 1); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
505 else |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
506 /* silence */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
507 vmdaudio_loadsound(s, output_samples, p, 0); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
508 p += s->block_align; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
509 output_samples += (s->block_align * s->bits / 8); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
510 sound_flags >>= 1; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
511 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
512 } else if (buf[6] == 3) { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
513 /* silent chunk */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
514 vmdaudio_loadsound(s, output_samples, p, 1); |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
515 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
516 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
517 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
518 // *datasize = ; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
519 return buf_size; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
520 } |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
521 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
522 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
523 /* |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
524 * Public Data Structures |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
525 */ |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
526 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
527 AVCodec vmdvideo_decoder = { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
528 "vmdvideo", |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
529 CODEC_TYPE_VIDEO, |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
530 CODEC_ID_VMDVIDEO, |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
531 sizeof(VmdVideoContext), |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
532 vmdvideo_decode_init, |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
533 NULL, |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
534 vmdvideo_decode_end, |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
535 vmdvideo_decode_frame, |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
536 CODEC_CAP_DR1, |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
537 }; |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
538 |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
539 AVCodec vmdaudio_decoder = { |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
540 "vmdaudio", |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
541 CODEC_TYPE_AUDIO, |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
542 CODEC_ID_VMDAUDIO, |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
543 sizeof(VmdAudioContext), |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
544 vmdaudio_decode_init, |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
545 NULL, |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
546 NULL, |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
547 vmdaudio_decode_frame, |
6a7e68899d8a
first pass at Sierra VMD A/V decoders; video looks great, audio is not
melanson
parents:
diff
changeset
|
548 }; |