annotate qpeg.c @ 4714:fc70a43a4f01 libavcodec

Fix H.264 8x8 transform selection It seems that it's opt parse bug, it can't process the flags which start by digit. After change 8x8dct to dct8x8, I can set it without problem. I guess nobody will use it since it can't work as expected, so the quick fix is change the option name. Patch by Limin Wang lance dot lmwang at gmail com
author mru
date Sat, 24 Mar 2007 12:07:07 +0000
parents c8c591fe26f8
children 59f4fb490fa7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
1 /*
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
2 * QPEG codec
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
3 * Copyright (c) 2004 Konstantin Shishkov
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
15 * Lesser General Public License for more details.
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
16 *
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
20 *
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
21 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
22
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
23 /**
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
24 * @file qpeg.c
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
25 * QPEG codec.
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
26 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
27
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
28 #include "avcodec.h"
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
29 #include "mpegvideo.h"
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
30
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
31 typedef struct QpegContext{
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
32 AVCodecContext *avctx;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
33 AVFrame pic;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
34 uint8_t *refdata;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
35 } QpegContext;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
36
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
37 static void qpeg_decode_intra(uint8_t *src, uint8_t *dst, int size,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
38 int stride, int width, int height)
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
39 {
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
40 int i;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
41 int code;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
42 int c0, c1;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
43 int run, copy;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
44 int filled = 0;
2823
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
45 int rows_to_go;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
46
2823
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
47 rows_to_go = height;
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
48 height--;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
49 dst = dst + height * stride;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
50
2823
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
51 while((size > 0) && (rows_to_go > 0)) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
52 code = *src++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
53 size--;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
54 run = copy = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
55 if(code == 0xFC) /* end-of-picture code */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
56 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
57 if(code >= 0xF8) { /* very long run */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
58 c0 = *src++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
59 c1 = *src++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
60 size -= 2;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
61 run = ((code & 0x7) << 16) + (c0 << 8) + c1 + 2;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
62 } else if (code >= 0xF0) { /* long run */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
63 c0 = *src++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
64 size--;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
65 run = ((code & 0xF) << 8) + c0 + 2;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
66 } else if (code >= 0xE0) { /* short run */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
67 run = (code & 0x1F) + 2;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
68 } else if (code >= 0xC0) { /* very long copy */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
69 c0 = *src++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
70 c1 = *src++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
71 size -= 2;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
72 copy = ((code & 0x3F) << 16) + (c0 << 8) + c1 + 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
73 } else if (code >= 0x80) { /* long copy */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
74 c0 = *src++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
75 size--;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
76 copy = ((code & 0x7F) << 8) + c0 + 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
77 } else { /* short copy */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
78 copy = code + 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
79 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
80
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
81 /* perform actual run or copy */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
82 if(run) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
83 int p;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
84
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
85 p = *src++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
86 size--;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
87 for(i = 0; i < run; i++) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
88 dst[filled++] = p;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
89 if (filled >= width) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
90 filled = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
91 dst -= stride;
2823
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
92 rows_to_go--;
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
93 if(rows_to_go <= 0)
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
94 break;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
95 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
96 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
97 } else {
2823
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
98 size -= copy;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
99 for(i = 0; i < copy; i++) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
100 dst[filled++] = *src++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
101 if (filled >= width) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
102 filled = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
103 dst -= stride;
2823
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
104 rows_to_go--;
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
105 if(rows_to_go <= 0)
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
106 break;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
107 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
108 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
109 }
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
110 }
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
111 }
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
112
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
113 static int qpeg_table_h[16] =
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
114 { 0x00, 0x20, 0x20, 0x20, 0x18, 0x10, 0x10, 0x20, 0x10, 0x08, 0x18, 0x08, 0x08, 0x18, 0x10, 0x04};
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
115 static int qpeg_table_w[16] =
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
116 { 0x00, 0x20, 0x18, 0x08, 0x18, 0x10, 0x20, 0x10, 0x08, 0x10, 0x20, 0x20, 0x08, 0x10, 0x18, 0x04};
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
117
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
118 /* Decodes delta frames */
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
119 static void qpeg_decode_inter(uint8_t *src, uint8_t *dst, int size,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
120 int stride, int width, int height,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
121 int delta, uint8_t *ctable, uint8_t *refdata)
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
122 {
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
123 int i, j;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
124 int code;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
125 int filled = 0;
2823
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
126 int orig_height;
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
127 uint8_t *blkdata;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
128
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
129 /* copy prev frame */
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
130 for(i = 0; i < height; i++)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
131 memcpy(refdata + (i * width), dst + (i * stride), width);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
132
2823
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
133 orig_height = height;
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
134 blkdata = src - 0x86;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
135 height--;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
136 dst = dst + height * stride;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
137
2823
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
138 while((size > 0) && (height >= 0)) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
139 code = *src++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
140 size--;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
141
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
142 if(delta) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
143 /* motion compensation */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
144 while((code & 0xF0) == 0xF0) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
145 if(delta == 1) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
146 int me_idx;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
147 int me_w, me_h, me_x, me_y;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
148 uint8_t *me_plane;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
149 int corr, val;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
150
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
151 /* get block size by index */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
152 me_idx = code & 0xF;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
153 me_w = qpeg_table_w[me_idx];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
154 me_h = qpeg_table_h[me_idx];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
155
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
156 /* extract motion vector */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
157 corr = *src++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
158 size--;
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
159
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
160 val = corr >> 4;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
161 if(val > 7)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
162 val -= 16;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
163 me_x = val;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
164
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
165 val = corr & 0xF;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
166 if(val > 7)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
167 val -= 16;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
168 me_y = val;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
169
2823
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
170 /* check motion vector */
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
171 if ((me_x + filled < 0) || (me_x + me_w + filled > width) ||
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
172 (height - me_y - me_h < 0) || (height - me_y > orig_height) ||
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
173 (filled + me_w > width) || (height - me_h < 0))
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
174 av_log(NULL, AV_LOG_ERROR, "Bogus motion vector (%i,%i), block size %ix%i at %i,%i\n",
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
175 me_x, me_y, me_w, me_h, filled, height);
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
176 else {
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
177 /* do motion compensation */
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
178 me_plane = refdata + (filled + me_x) + (height - me_y) * width;
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
179 for(j = 0; j < me_h; j++) {
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
180 for(i = 0; i < me_w; i++)
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
181 dst[filled + i - (j * stride)] = me_plane[i - (j * width)];
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
182 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
183 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
184 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
185 code = *src++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
186 size--;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
187 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
188 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
189
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
190 if(code == 0xE0) /* end-of-picture code */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
191 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
192 if(code > 0xE0) { /* run code: 0xE1..0xFF */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
193 int p;
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
194
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
195 code &= 0x1F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
196 p = *src++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
197 size--;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
198 for(i = 0; i <= code; i++) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
199 dst[filled++] = p;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
200 if(filled >= width) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
201 filled = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
202 dst -= stride;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
203 height--;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
204 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
205 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
206 } else if(code >= 0xC0) { /* copy code: 0xC0..0xDF */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
207 code &= 0x1F;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
208
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
209 for(i = 0; i <= code; i++) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
210 dst[filled++] = *src++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
211 if(filled >= width) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
212 filled = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
213 dst -= stride;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
214 height--;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
215 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
216 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
217 size -= code + 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
218 } else if(code >= 0x80) { /* skip code: 0x80..0xBF */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
219 int skip;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
220
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
221 code &= 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
222 /* codes 0x80 and 0x81 are actually escape codes,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
223 skip value minus constant is in the next byte */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
224 if(!code)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
225 skip = (*src++) + 64;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
226 else if(code == 1)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
227 skip = (*src++) + 320;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
228 else
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
229 skip = code;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
230 filled += skip;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
231 while( filled >= width) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
232 filled -= width;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
233 dst -= stride;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
234 height--;
2823
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
235 if(height < 0)
6bf98adb22a1 security fixes
michael
parents: 2586
diff changeset
236 break;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
237 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
238 } else {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
239 /* zero code treated as one-pixel skip */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
240 if(code)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
241 dst[filled++] = ctable[code & 0x7F];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
242 else
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
243 filled++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
244 if(filled >= width) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
245 filled = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
246 dst -= stride;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
247 height--;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
248 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
249 }
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
250 }
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
251 }
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
252
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
253 static int decode_frame(AVCodecContext *avctx,
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
254 void *data, int *data_size,
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
255 uint8_t *buf, int buf_size)
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
256 {
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
257 QpegContext * const a = avctx->priv_data;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
258 AVFrame * const p= (AVFrame*)&a->pic;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
259 uint8_t* outdata;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
260 int delta;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
261
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
262 if(p->data[0])
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
263 avctx->release_buffer(avctx, p);
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
264
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
265 p->reference= 0;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
266 if(avctx->get_buffer(avctx, p) < 0){
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
267 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
268 return -1;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
269 }
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
270 outdata = a->pic.data[0];
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
271 if(buf[0x85] == 0x10) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
272 qpeg_decode_intra(buf+0x86, outdata, buf_size - 0x86, a->pic.linesize[0], avctx->width, avctx->height);
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
273 } else {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
274 delta = buf[0x85];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
275 qpeg_decode_inter(buf+0x86, outdata, buf_size - 0x86, a->pic.linesize[0], avctx->width, avctx->height, delta, buf + 4, a->refdata);
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
276 }
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
277
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
278 /* make the palette available on the way out */
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
279 memcpy(a->pic.data[1], a->avctx->palctrl->palette, AVPALETTE_SIZE);
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
280 if (a->avctx->palctrl->palette_changed) {
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
281 a->pic.palette_has_changed = 1;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
282 a->avctx->palctrl->palette_changed = 0;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
283 }
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
284
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
285 *data_size = sizeof(AVFrame);
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
286 *(AVFrame*)data = a->pic;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
287
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
288 return buf_size;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
289 }
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
290
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
291 static int decode_init(AVCodecContext *avctx){
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
292 QpegContext * const a = avctx->priv_data;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
293
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
294 a->avctx = avctx;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
295 avctx->pix_fmt= PIX_FMT_PAL8;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
296 avctx->has_b_frames = 0;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
297 a->pic.data[0] = NULL;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
298 a->refdata = av_malloc(avctx->width * avctx->height);
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
299
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
300 return 0;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
301 }
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
302
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
303 static int decode_end(AVCodecContext *avctx){
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
304 QpegContext * const a = avctx->priv_data;
2586
00d9abc5f76f free that last frame
melanson
parents: 2453
diff changeset
305 AVFrame * const p= (AVFrame*)&a->pic;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2823
diff changeset
306
2586
00d9abc5f76f free that last frame
melanson
parents: 2453
diff changeset
307 if(p->data[0])
00d9abc5f76f free that last frame
melanson
parents: 2453
diff changeset
308 avctx->release_buffer(avctx, p);
2355
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
309
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
310 av_free(a->refdata);
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
311 return 0;
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
312 }
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
313
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
314 AVCodec qpeg_decoder = {
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
315 "qpeg",
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
316 CODEC_TYPE_VIDEO,
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
317 CODEC_ID_QPEG,
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
318 sizeof(QpegContext),
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
319 decode_init,
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
320 NULL,
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
321 decode_end,
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
322 decode_frame,
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
323 CODEC_CAP_DR1,
69fcdad5f7d5 native QPEG video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
324 };