annotate vmnc.c @ 8130:c45366b01126 libavcodec

ARM: fix j_rev_dct_ARM This is a bugfix for ARMv4 assembly implementation of 'j_rev_dct' function. The problem was in the incorrect partially empty row detection. Even if the first two coefficients in the row were nonzero, it handled this just like the case with only the first nonzero coefficient. Now this function produces exactly the same output as the stripped down reference C version of 'j_rev_dct' (with the nested checks like 'if (d6) { if (d2) { ...' always evaluated as true, avoiding shortcut branches).
author mru
date Wed, 12 Nov 2008 20:23:36 +0000
parents 4525dcd81357
children 2acf0ae7b041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
1 /*
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
2 * VMware Screen Codec (VMnc) decoder
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
3 * Copyright (c) 2006 Konstantin Shishkov
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3920
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3920
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3920
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
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: 3920
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3920
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
15 * Lesser General Public License for more details.
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
16 *
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
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: 3920
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
20 */
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
21
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
22 /**
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
23 * @file vmnc.c
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
24 * VMware Screen Codec (VMnc) decoder
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
25 * As Alex Beregszaszi discovered, this is effectively RFB data dump
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
26 */
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
27
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
28 #include <stdio.h>
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
29 #include <stdlib.h>
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
30
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
31 #include "avcodec.h"
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
32
3679
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
33 enum EncTypes {
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
34 MAGIC_WMVd = 0x574D5664,
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
35 MAGIC_WMVe,
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
36 MAGIC_WMVf,
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
37 MAGIC_WMVg,
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
38 MAGIC_WMVh,
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
39 MAGIC_WMVi,
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
40 MAGIC_WMVj
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
41 };
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
42
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
43 enum HexTile_Flags {
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
44 HT_RAW = 1, // tile is raw
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
45 HT_BKG = 2, // background color is present
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
46 HT_FG = 4, // foreground color is present
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
47 HT_SUB = 8, // subrects are present
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
48 HT_CLR = 16 // each subrect has own color
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
49 };
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
50
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
51 /*
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
52 * Decoder context
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
53 */
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
54 typedef struct VmncContext {
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
55 AVCodecContext *avctx;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
56 AVFrame pic;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
57
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
58 int bpp;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
59 int bpp2;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
60 int bigendian;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
61 uint8_t pal[768];
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
62 int width, height;
3684
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
63
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
64 /* cursor data */
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
65 int cur_w, cur_h;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
66 int cur_x, cur_y;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
67 int cur_hx, cur_hy;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
68 uint8_t* curbits, *curmask;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
69 uint8_t* screendta;
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
70 } VmncContext;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
71
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
72 /* read pixel value from stream */
6293
michael
parents: 5967
diff changeset
73 static av_always_inline int vmnc_get_pixel(const uint8_t* buf, int bpp, int be) {
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
74 switch(bpp * 2 + be) {
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
75 case 2:
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
76 case 3: return *buf;
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
77 case 4: return AV_RL16(buf);
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
78 case 5: return AV_RB16(buf);
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
79 case 8: return AV_RL32(buf);
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
80 case 9: return AV_RB32(buf);
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
81 default: return 0;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
82 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
83 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
84
6293
michael
parents: 5967
diff changeset
85 static void load_cursor(VmncContext *c, const uint8_t *src)
3684
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
86 {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
87 int i, j, p;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
88 const int bpp = c->bpp2;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
89 uint8_t *dst8 = c->curbits;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
90 uint16_t *dst16 = (uint16_t*)c->curbits;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
91 uint32_t *dst32 = (uint32_t*)c->curbits;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
92
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
93 for(j = 0; j < c->cur_h; j++) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
94 for(i = 0; i < c->cur_w; i++) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
95 p = vmnc_get_pixel(src, bpp, c->bigendian);
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
96 src += bpp;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
97 if(bpp == 1) *dst8++ = p;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
98 if(bpp == 2) *dst16++ = p;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
99 if(bpp == 4) *dst32++ = p;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
100 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
101 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
102 dst8 = c->curmask;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
103 dst16 = (uint16_t*)c->curmask;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
104 dst32 = (uint32_t*)c->curmask;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
105 for(j = 0; j < c->cur_h; j++) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
106 for(i = 0; i < c->cur_w; i++) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
107 p = vmnc_get_pixel(src, bpp, c->bigendian);
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
108 src += bpp;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
109 if(bpp == 1) *dst8++ = p;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
110 if(bpp == 2) *dst16++ = p;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
111 if(bpp == 4) *dst32++ = p;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
112 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
113 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
114 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
115
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
116 static void put_cursor(uint8_t *dst, int stride, VmncContext *c, int dx, int dy)
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
117 {
3920
3a151ccc6ed7 Remove unused variables and the corresponding warnings along with them.
diego
parents: 3800
diff changeset
118 int i, j;
3684
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
119 int w, h, x, y;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
120 w = c->cur_w;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
121 if(c->width < c->cur_x + c->cur_w) w = c->width - c->cur_x;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
122 h = c->cur_h;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
123 if(c->height < c->cur_y + c->cur_h) h = c->height - c->cur_y;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
124 x = c->cur_x;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
125 y = c->cur_y;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
126 if(x < 0) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
127 w += x;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
128 x = 0;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
129 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
130 if(y < 0) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
131 h += y;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
132 y = 0;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
133 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
134
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
135 if((w < 1) || (h < 1)) return;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
136 dst += x * c->bpp2 + y * stride;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
137
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
138 if(c->bpp2 == 1) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
139 uint8_t* cd = c->curbits, *msk = c->curmask;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
140 for(j = 0; j < h; j++) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
141 for(i = 0; i < w; i++)
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
142 dst[i] = (dst[i] & cd[i]) ^ msk[i];
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
143 msk += c->cur_w;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
144 cd += c->cur_w;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
145 dst += stride;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
146 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
147 } else if(c->bpp2 == 2) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
148 uint16_t* cd = (uint16_t*)c->curbits, *msk = (uint16_t*)c->curmask;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
149 uint16_t* dst2;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
150 for(j = 0; j < h; j++) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
151 dst2 = (uint16_t*)dst;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
152 for(i = 0; i < w; i++)
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
153 dst2[i] = (dst2[i] & cd[i]) ^ msk[i];
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
154 msk += c->cur_w;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
155 cd += c->cur_w;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
156 dst += stride;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
157 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
158 } else if(c->bpp2 == 4) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
159 uint32_t* cd = (uint32_t*)c->curbits, *msk = (uint32_t*)c->curmask;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
160 uint32_t* dst2;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
161 for(j = 0; j < h; j++) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
162 dst2 = (uint32_t*)dst;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
163 for(i = 0; i < w; i++)
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
164 dst2[i] = (dst2[i] & cd[i]) ^ msk[i];
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
165 msk += c->cur_w;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
166 cd += c->cur_w;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
167 dst += stride;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
168 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
169 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
170 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
171
5967
15ed47af1838 Misc spelling fixes, prefer American over British English.
diego
parents: 5215
diff changeset
172 /* fill rectangle with given color */
4283
d6f83e2f8804 rename always_inline to av_always_inline and move to common.h
mru
parents: 3947
diff changeset
173 static av_always_inline void paint_rect(uint8_t *dst, int dx, int dy, int w, int h, int color, int bpp, int stride)
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
174 {
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
175 int i, j;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
176 dst += dx * bpp + dy * stride;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
177 if(bpp == 1){
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
178 for(j = 0; j < h; j++) {
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
179 memset(dst, color, w);
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
180 dst += stride;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
181 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
182 }else if(bpp == 2){
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
183 uint16_t* dst2;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
184 for(j = 0; j < h; j++) {
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
185 dst2 = (uint16_t*)dst;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
186 for(i = 0; i < w; i++) {
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
187 *dst2++ = color;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
188 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
189 dst += stride;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
190 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
191 }else if(bpp == 4){
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
192 uint32_t* dst2;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
193 for(j = 0; j < h; j++) {
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
194 dst2 = (uint32_t*)dst;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
195 for(i = 0; i < w; i++) {
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
196 dst2[i] = color;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
197 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
198 dst += stride;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
199 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
200 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
201 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
202
6293
michael
parents: 5967
diff changeset
203 static av_always_inline void paint_raw(uint8_t *dst, int w, int h, const uint8_t* src, int bpp, int be, int stride)
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
204 {
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
205 int i, j, p;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
206 for(j = 0; j < h; j++) {
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
207 for(i = 0; i < w; i++) {
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
208 p = vmnc_get_pixel(src, bpp, be);
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
209 src += bpp;
3678
93a961e40d65 Handle raw blocks correctly (both updating pointer and storing to memory)
kostya
parents: 3677
diff changeset
210 switch(bpp){
93a961e40d65 Handle raw blocks correctly (both updating pointer and storing to memory)
kostya
parents: 3677
diff changeset
211 case 1:
93a961e40d65 Handle raw blocks correctly (both updating pointer and storing to memory)
kostya
parents: 3677
diff changeset
212 dst[i] = p;
93a961e40d65 Handle raw blocks correctly (both updating pointer and storing to memory)
kostya
parents: 3677
diff changeset
213 break;
93a961e40d65 Handle raw blocks correctly (both updating pointer and storing to memory)
kostya
parents: 3677
diff changeset
214 case 2:
93a961e40d65 Handle raw blocks correctly (both updating pointer and storing to memory)
kostya
parents: 3677
diff changeset
215 ((uint16_t*)dst)[i] = p;
93a961e40d65 Handle raw blocks correctly (both updating pointer and storing to memory)
kostya
parents: 3677
diff changeset
216 break;
93a961e40d65 Handle raw blocks correctly (both updating pointer and storing to memory)
kostya
parents: 3677
diff changeset
217 case 4:
93a961e40d65 Handle raw blocks correctly (both updating pointer and storing to memory)
kostya
parents: 3677
diff changeset
218 ((uint32_t*)dst)[i] = p;
93a961e40d65 Handle raw blocks correctly (both updating pointer and storing to memory)
kostya
parents: 3677
diff changeset
219 break;
93a961e40d65 Handle raw blocks correctly (both updating pointer and storing to memory)
kostya
parents: 3677
diff changeset
220 }
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
221 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
222 dst += stride;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
223 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
224 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
225
6293
michael
parents: 5967
diff changeset
226 static int decode_hextile(VmncContext *c, uint8_t* dst, const uint8_t* src, int ssize, int w, int h, int stride)
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
227 {
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
228 int i, j, k;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
229 int bg = 0, fg = 0, rects, color, flags, xy, wh;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
230 const int bpp = c->bpp2;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
231 uint8_t *dst2;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
232 int bw = 16, bh = 16;
6293
michael
parents: 5967
diff changeset
233 const uint8_t *ssrc=src;
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
234
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
235 for(j = 0; j < h; j += 16) {
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
236 dst2 = dst;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
237 bw = 16;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
238 if(j + 16 > h) bh = h - j;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
239 for(i = 0; i < w; i += 16, dst2 += 16 * bpp) {
3685
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
240 if(src - ssrc >= ssize) {
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
241 av_log(c->avctx, AV_LOG_ERROR, "Premature end of data!\n");
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
242 return -1;
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
243 }
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
244 if(i + 16 > w) bw = w - i;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
245 flags = *src++;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
246 if(flags & HT_RAW) {
3685
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
247 if(src - ssrc > ssize - bw * bh * bpp) {
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
248 av_log(c->avctx, AV_LOG_ERROR, "Premature end of data!\n");
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
249 return -1;
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
250 }
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
251 paint_raw(dst2, bw, bh, src, bpp, c->bigendian, stride);
3678
93a961e40d65 Handle raw blocks correctly (both updating pointer and storing to memory)
kostya
parents: 3677
diff changeset
252 src += bw * bh * bpp;
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
253 } else {
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
254 if(flags & HT_BKG) {
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
255 bg = vmnc_get_pixel(src, bpp, c->bigendian); src += bpp;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
256 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
257 if(flags & HT_FG) {
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
258 fg = vmnc_get_pixel(src, bpp, c->bigendian); src += bpp;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
259 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
260 rects = 0;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
261 if(flags & HT_SUB)
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
262 rects = *src++;
3685
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
263 color = !!(flags & HT_CLR);
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
264
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
265 paint_rect(dst2, 0, 0, bw, bh, bg, bpp, stride);
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
266
3685
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
267 if(src - ssrc > ssize - rects * (color * bpp + 2)) {
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
268 av_log(c->avctx, AV_LOG_ERROR, "Premature end of data!\n");
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
269 return -1;
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
270 }
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
271 for(k = 0; k < rects; k++) {
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
272 if(color) {
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
273 fg = vmnc_get_pixel(src, bpp, c->bigendian); src += bpp;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
274 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
275 xy = *src++;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
276 wh = *src++;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
277 paint_rect(dst2, xy >> 4, xy & 0xF, (wh>>4)+1, (wh & 0xF)+1, fg, bpp, stride);
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
278 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
279 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
280 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
281 dst += stride * 16;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
282 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
283 return src - ssrc;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
284 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
285
6293
michael
parents: 5967
diff changeset
286 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, const uint8_t *buf, int buf_size)
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
287 {
4827
b3ee9a1526b0 Get rid of unnecessary pointer casts.
diego
parents: 4740
diff changeset
288 VmncContext * const c = avctx->priv_data;
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
289 uint8_t *outptr;
6293
michael
parents: 5967
diff changeset
290 const uint8_t *src = buf;
3685
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
291 int dx, dy, w, h, depth, enc, chunks, res, size_left;
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
292
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
293 c->pic.reference = 1;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
294 c->pic.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
295 if(avctx->reget_buffer(avctx, &c->pic) < 0){
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
296 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
297 return -1;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
298 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
299
3679
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
300 c->pic.key_frame = 0;
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
301 c->pic.pict_type = FF_P_TYPE;
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
302
3684
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
303 //restore screen after cursor
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
304 if(c->screendta) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
305 int i;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
306 w = c->cur_w;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
307 if(c->width < c->cur_x + w) w = c->width - c->cur_x;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
308 h = c->cur_h;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
309 if(c->height < c->cur_y + h) h = c->height - c->cur_y;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
310 dx = c->cur_x;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
311 if(dx < 0) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
312 w += dx;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
313 dx = 0;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
314 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
315 dy = c->cur_y;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
316 if(dy < 0) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
317 h += dy;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
318 dy = 0;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
319 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
320 if((w > 0) && (h > 0)) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
321 outptr = c->pic.data[0] + dx * c->bpp2 + dy * c->pic.linesize[0];
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
322 for(i = 0; i < h; i++) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
323 memcpy(outptr, c->screendta + i * c->cur_w * c->bpp2, w * c->bpp2);
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
324 outptr += c->pic.linesize[0];
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
325 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
326 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
327 }
3679
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
328 src += 2;
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
329 chunks = AV_RB16(src); src += 2;
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
330 while(chunks--) {
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
331 dx = AV_RB16(src); src += 2;
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
332 dy = AV_RB16(src); src += 2;
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
333 w = AV_RB16(src); src += 2;
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
334 h = AV_RB16(src); src += 2;
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
335 enc = AV_RB32(src); src += 4;
3684
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
336 outptr = c->pic.data[0] + dx * c->bpp2 + dy * c->pic.linesize[0];
3685
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
337 size_left = buf_size - (src - buf);
3679
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
338 switch(enc) {
3684
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
339 case MAGIC_WMVd: // cursor
3685
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
340 if(size_left < 2 + w * h * c->bpp2 * 2) {
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
341 av_log(avctx, AV_LOG_ERROR, "Premature end of data! (need %i got %i)\n", 2 + w * h * c->bpp2 * 2, size_left);
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
342 return -1;
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
343 }
3679
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
344 src += 2;
3684
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
345 c->cur_w = w;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
346 c->cur_h = h;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
347 c->cur_hx = dx;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
348 c->cur_hy = dy;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
349 if((c->cur_hx > c->cur_w) || (c->cur_hy > c->cur_h)) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
350 av_log(avctx, AV_LOG_ERROR, "Cursor hot spot is not in image: %ix%i of %ix%i cursor size\n", c->cur_hx, c->cur_hy, c->cur_w, c->cur_h);
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
351 c->cur_hx = c->cur_hy = 0;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
352 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
353 c->curbits = av_realloc(c->curbits, c->cur_w * c->cur_h * c->bpp2);
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
354 c->curmask = av_realloc(c->curmask, c->cur_w * c->cur_h * c->bpp2);
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
355 c->screendta = av_realloc(c->screendta, c->cur_w * c->cur_h * c->bpp2);
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
356 load_cursor(c, src);
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
357 src += w * h * c->bpp2 * 2;
3679
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
358 break;
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
359 case MAGIC_WMVe: // unknown
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
360 src += 2;
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
361 break;
3684
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
362 case MAGIC_WMVf: // update cursor position
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
363 c->cur_x = dx - c->cur_hx;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
364 c->cur_y = dy - c->cur_hy;
3679
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
365 break;
3686
5fc587a5feea Handle the rest of known blocks (by skipping them)
kostya
parents: 3685
diff changeset
366 case MAGIC_WMVg: // unknown
5fc587a5feea Handle the rest of known blocks (by skipping them)
kostya
parents: 3685
diff changeset
367 src += 10;
5fc587a5feea Handle the rest of known blocks (by skipping them)
kostya
parents: 3685
diff changeset
368 break;
5fc587a5feea Handle the rest of known blocks (by skipping them)
kostya
parents: 3685
diff changeset
369 case MAGIC_WMVh: // unknown
5fc587a5feea Handle the rest of known blocks (by skipping them)
kostya
parents: 3685
diff changeset
370 src += 4;
5fc587a5feea Handle the rest of known blocks (by skipping them)
kostya
parents: 3685
diff changeset
371 break;
3679
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
372 case MAGIC_WMVi: // ServerInitialization struct
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
373 c->pic.key_frame = 1;
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
374 c->pic.pict_type = FF_I_TYPE;
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
375 depth = *src++;
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
376 if(depth != c->bpp) {
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
377 av_log(avctx, AV_LOG_INFO, "Depth mismatch. Container %i bpp, Frame data: %i bpp\n", c->bpp, depth);
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
378 }
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
379 src++;
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
380 c->bigendian = *src++;
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
381 if(c->bigendian & (~1)) {
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
382 av_log(avctx, AV_LOG_INFO, "Invalid header: bigendian flag = %i\n", c->bigendian);
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
383 return -1;
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
384 }
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
385 //skip the rest of pixel format data
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
386 src += 13;
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
387 break;
3686
5fc587a5feea Handle the rest of known blocks (by skipping them)
kostya
parents: 3685
diff changeset
388 case MAGIC_WMVj: // unknown
5fc587a5feea Handle the rest of known blocks (by skipping them)
kostya
parents: 3685
diff changeset
389 src += 2;
5fc587a5feea Handle the rest of known blocks (by skipping them)
kostya
parents: 3685
diff changeset
390 break;
3679
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
391 case 0x00000000: // raw rectangle data
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
392 if((dx + w > c->width) || (dy + h > c->height)) {
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
393 av_log(avctx, AV_LOG_ERROR, "Incorrect frame size: %ix%i+%ix%i of %ix%i\n", w, h, dx, dy, c->width, c->height);
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
394 return -1;
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
395 }
3685
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
396 if(size_left < w * h * c->bpp2) {
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
397 av_log(avctx, AV_LOG_ERROR, "Premature end of data! (need %i got %i)\n", w * h * c->bpp2, size_left);
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
398 return -1;
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
399 }
3679
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
400 paint_raw(outptr, w, h, src, c->bpp2, c->bigendian, c->pic.linesize[0]);
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
401 src += w * h * c->bpp2;
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
402 break;
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
403 case 0x00000005: // HexTile encoded rectangle
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
404 if((dx + w > c->width) || (dy + h > c->height)) {
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
405 av_log(avctx, AV_LOG_ERROR, "Incorrect frame size: %ix%i+%ix%i of %ix%i\n", w, h, dx, dy, c->width, c->height);
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
406 return -1;
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
407 }
3685
dd2da6e09d32 Tests for overreading input data
kostya
parents: 3684
diff changeset
408 res = decode_hextile(c, outptr, src, size_left, w, h, c->pic.linesize[0]);
3679
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
409 if(res < 0)
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
410 return -1;
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
411 src += res;
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
412 break;
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
413 default:
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
414 av_log(avctx, AV_LOG_ERROR, "Unsupported block type 0x%08X\n", enc);
2702eec8c8b9 Try to handle all chunks, previous scheme was not correct.
kostya
parents: 3678
diff changeset
415 chunks = 0; // leave chunks decoding loop
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
416 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
417 }
3684
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
418 if(c->screendta){
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
419 int i;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
420 //save screen data before painting cursor
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
421 w = c->cur_w;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
422 if(c->width < c->cur_x + w) w = c->width - c->cur_x;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
423 h = c->cur_h;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
424 if(c->height < c->cur_y + h) h = c->height - c->cur_y;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
425 dx = c->cur_x;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
426 if(dx < 0) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
427 w += dx;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
428 dx = 0;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
429 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
430 dy = c->cur_y;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
431 if(dy < 0) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
432 h += dy;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
433 dy = 0;
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
434 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
435 if((w > 0) && (h > 0)) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
436 outptr = c->pic.data[0] + dx * c->bpp2 + dy * c->pic.linesize[0];
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
437 for(i = 0; i < h; i++) {
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
438 memcpy(c->screendta + i * c->cur_w * c->bpp2, outptr, w * c->bpp2);
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
439 outptr += c->pic.linesize[0];
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
440 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
441 outptr = c->pic.data[0];
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
442 put_cursor(outptr, c->pic.linesize[0], c, c->cur_x, c->cur_y);
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
443 }
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
444 }
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
445 *data_size = sizeof(AVFrame);
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
446 *(AVFrame*)data = c->pic;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
447
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
448 /* always report that the buffer was completely consumed */
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
449 return buf_size;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
450 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
451
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
452
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
453
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
454 /*
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
455 *
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
456 * Init VMnc decoder
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
457 *
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
458 */
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6293
diff changeset
459 static av_cold int decode_init(AVCodecContext *avctx)
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
460 {
4827
b3ee9a1526b0 Get rid of unnecessary pointer casts.
diego
parents: 4740
diff changeset
461 VmncContext * const c = avctx->priv_data;
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
462
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
463 c->avctx = avctx;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
464
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
465 c->pic.data[0] = NULL;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
466 c->width = avctx->width;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
467 c->height = avctx->height;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
468
3800
9b75ab171fa9 1l: correct argument order in avcodec_check_dimensions
kostya
parents: 3686
diff changeset
469 if (avcodec_check_dimensions(avctx, avctx->width, avctx->height) < 0) {
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
470 return 1;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
471 }
7823
4525dcd81357 Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 7040
diff changeset
472 c->bpp = avctx->bits_per_coded_sample;
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
473 c->bpp2 = c->bpp/8;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
474
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
475 switch(c->bpp){
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
476 case 8:
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
477 avctx->pix_fmt = PIX_FMT_PAL8;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
478 break;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
479 case 16:
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
480 avctx->pix_fmt = PIX_FMT_RGB555;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
481 break;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
482 case 32:
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
483 avctx->pix_fmt = PIX_FMT_RGB32;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
484 break;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
485 default:
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
486 av_log(avctx, AV_LOG_ERROR, "Unsupported bitdepth %i\n", c->bpp);
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
487 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
488
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
489 return 0;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
490 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
491
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
492
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
493
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
494 /*
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
495 *
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
496 * Uninit VMnc decoder
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
497 *
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
498 */
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6293
diff changeset
499 static av_cold int decode_end(AVCodecContext *avctx)
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
500 {
4827
b3ee9a1526b0 Get rid of unnecessary pointer casts.
diego
parents: 4740
diff changeset
501 VmncContext * const c = avctx->priv_data;
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
502
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
503 if (c->pic.data[0])
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
504 avctx->release_buffer(avctx, &c->pic);
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
505
3684
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
506 av_free(c->curbits);
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
507 av_free(c->curmask);
9f77f4f577b4 Cursor drawing support
kostya
parents: 3679
diff changeset
508 av_free(c->screendta);
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
509 return 0;
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
510 }
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
511
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
512 AVCodec vmnc_decoder = {
6723
2ced96d3cde0 Transform codec short name into a single word.
diego
parents: 6722
diff changeset
513 "vmnc",
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
514 CODEC_TYPE_VIDEO,
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
515 CODEC_ID_VMNC,
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
516 sizeof(VmncContext),
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
517 decode_init,
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
518 NULL,
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
519 decode_end,
6722
6eeb19edcee3 Add long names to some AVCodec declarations.
diego
parents: 6517
diff changeset
520 decode_frame,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6723
diff changeset
521 .long_name = NULL_IF_CONFIG_SMALL("VMware Screen Codec / VMware Video"),
3677
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
522 };
18b13b923616 VMware Video decoder (fourcc: VMnc)
kostya
parents:
diff changeset
523