Mercurial > libavcodec.hg
annotate xl.c @ 5062:2dd00b1cc94b libavcodec
Remove mdct.o and fft.o from fft-test prerequisites list.
Both objects were added to the link command, resulting in multiple definitions
of symbols. Now linking works in the general case when mdct.o and fft.o are
compiled into libavcodec.a.
author | diego |
---|---|
date | Tue, 22 May 2007 07:08:38 +0000 |
parents | 05e932ddaaa9 |
children | 2b72f9bc4f06 |
rev | line source |
---|---|
2325
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
1 /* |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
2 * Miro VideoXL codec |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
3 * Copyright (c) 2004 Konstantin Shishkov |
1180a04d64c5
Miro VideoXL (VIXL) 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 |
2325
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
1180a04d64c5
Miro VideoXL (VIXL) 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. |
2325
1180a04d64c5
Miro VideoXL (VIXL) 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, |
2325
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
16 * |
1180a04d64c5
Miro VideoXL (VIXL) 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:
2967
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
2325
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
20 * |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
21 */ |
2967 | 22 |
2325
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
23 /** |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
24 * @file xl.c |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
25 * Miro VideoXL codec. |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
26 */ |
2967 | 27 |
2325
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
28 #include "avcodec.h" |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
29 #include "mpegvideo.h" |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
30 |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
31 typedef struct VideoXLContext{ |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
32 AVCodecContext *avctx; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
33 AVFrame pic; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
34 } VideoXLContext; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
35 |
4170 | 36 static const int xl_table[32] = { |
2325
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
37 0, 1, 2, 3, 4, 5, 6, 7, |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
38 8, 9, 12, 15, 20, 25, 34, 46, |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
39 64, 82, 94, 103, 108, 113, 116, 119, |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
40 120, 121, 122, 123, 124, 125, 126, 127}; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
41 |
2967 | 42 static int decode_frame(AVCodecContext *avctx, |
2325
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
43 void *data, int *data_size, |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
44 uint8_t *buf, int buf_size) |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
45 { |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
46 VideoXLContext * const a = avctx->priv_data; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
47 AVFrame * const p= (AVFrame*)&a->pic; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
48 uint8_t *Y, *U, *V; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
49 int i, j; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
50 int stride; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
51 uint32_t val; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
52 int y0, y1, y2, y3, c0, c1; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
53 |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
54 if(p->data[0]) |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
55 avctx->release_buffer(avctx, p); |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
56 |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
57 p->reference = 0; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
58 if(avctx->get_buffer(avctx, p) < 0){ |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
59 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
60 return -1; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
61 } |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
62 p->pict_type= I_TYPE; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
63 p->key_frame= 1; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
64 |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
65 Y = a->pic.data[0]; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
66 U = a->pic.data[1]; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
67 V = a->pic.data[2]; |
2967 | 68 |
2325
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
69 stride = avctx->width - 4; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
70 for (i = 0; i < avctx->height; i++) { |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
71 /* lines are stored in reversed order */ |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
72 buf += stride; |
2967 | 73 |
2325
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
74 for (j = 0; j < avctx->width; j += 4) { |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
75 /* value is stored in LE dword with word swapped */ |
4364 | 76 val = AV_RL32(buf); |
2325
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
77 buf -= 4; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
78 val = ((val >> 16) & 0xFFFF) | ((val & 0xFFFF) << 16); |
2967 | 79 |
2325
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
80 if(!j) |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
81 y0 = (val & 0x1F) << 2; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
82 else |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
83 y0 = y3 + xl_table[val & 0x1F]; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
84 val >>= 5; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
85 y1 = y0 + xl_table[val & 0x1F]; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
86 val >>= 5; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
87 y2 = y1 + xl_table[val & 0x1F]; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
88 val >>= 6; /* align to word */ |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
89 y3 = y2 + xl_table[val & 0x1F]; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
90 val >>= 5; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
91 if(!j) |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
92 c0 = (val & 0x1F) << 2; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
93 else |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
94 c0 += xl_table[val & 0x1F]; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
95 val >>= 5; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
96 if(!j) |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
97 c1 = (val & 0x1F) << 2; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
98 else |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
99 c1 += xl_table[val & 0x1F]; |
2967 | 100 |
2325
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
101 Y[j + 0] = y0 << 1; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
102 Y[j + 1] = y1 << 1; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
103 Y[j + 2] = y2 << 1; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
104 Y[j + 3] = y3 << 1; |
2967 | 105 |
2325
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
106 U[j >> 2] = c0 << 1; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
107 V[j >> 2] = c1 << 1; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
108 } |
2967 | 109 |
2325
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
110 buf += avctx->width + 4; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
111 Y += a->pic.linesize[0]; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
112 U += a->pic.linesize[1]; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
113 V += a->pic.linesize[2]; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
114 } |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
115 |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
116 *data_size = sizeof(AVFrame); |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
117 *(AVFrame*)data = a->pic; |
2967 | 118 |
2325
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
119 return buf_size; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
120 } |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
121 |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
122 static int decode_init(AVCodecContext *avctx){ |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
123 // VideoXLContext * const a = avctx->priv_data; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
124 |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
125 avctx->pix_fmt= PIX_FMT_YUV411P; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
126 |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
127 return 0; |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
128 } |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
129 |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
130 AVCodec xl_decoder = { |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
131 "xl", |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
132 CODEC_TYPE_VIDEO, |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
133 CODEC_ID_VIXL, |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
134 sizeof(VideoXLContext), |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
135 decode_init, |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
136 NULL, |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
137 NULL, |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
138 decode_frame, |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
139 CODEC_CAP_DR1, |
1180a04d64c5
Miro VideoXL (VIXL) decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
140 }; |