Mercurial > libavcodec.hg
annotate asv1.c @ 12340:2d15f62f4f8a libavcodec
VP8: move zeroing of luma DC block into the WHT
Lets us do the zeroing in asm instead of C.
Also makes it consistent with the way the regular iDCT code does it.
author | darkshikari |
---|---|
date | Mon, 02 Aug 2010 20:18:09 +0000 |
parents | 8b28e74de2c0 |
children |
rev | line source |
---|---|
1273 | 1 /* |
1433 | 2 * ASUS V1/V2 codec |
1273 | 3 * Copyright (c) 2003 Michael Niedermayer |
4 * | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
1273 | 8 * modify it under the terms of the GNU Lesser General Public |
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:
3777
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
1273 | 11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
1273 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
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:
3777
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 |
1273 | 20 */ |
2967 | 21 |
1273 | 22 /** |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11560
diff
changeset
|
23 * @file |
1433 | 24 * ASUS V1/V2 codec. |
1273 | 25 */ |
2967 | 26 |
1273 | 27 #include "avcodec.h" |
10501
bdf4a9ca162a
Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents:
10406
diff
changeset
|
28 #include "libavutil/common.h" |
9411
4cb7c65fc775
Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
9397
diff
changeset
|
29 #include "put_bits.h" |
1273 | 30 #include "dsputil.h" |
6448
7fa807dd7958
remove #include "mpegvideo.h" where it is not needed
aurel
parents:
6225
diff
changeset
|
31 #include "mpeg12data.h" |
1273 | 32 |
33 //#undef NDEBUG | |
34 //#include <assert.h> | |
35 | |
1433 | 36 #define VLC_BITS 6 |
37 #define ASV2_LEVEL_VLC_BITS 10 | |
2967 | 38 |
1273 | 39 typedef struct ASV1Context{ |
40 AVCodecContext *avctx; | |
41 DSPContext dsp; | |
42 AVFrame picture; | |
43 PutBitContext pb; | |
44 GetBitContext gb; | |
45 ScanTable scantable; | |
46 int inv_qscale; | |
47 int mb_width; | |
48 int mb_height; | |
49 int mb_width2; | |
50 int mb_height2; | |
11369 | 51 DECLARE_ALIGNED(16, DCTELEM, block)[6][64]; |
10093 | 52 uint16_t intra_matrix[64]; |
53 int q_intra_matrix[64]; | |
1273 | 54 uint8_t *bitstream_buffer; |
3066
04b924f8f5a5
warning fixes by Luca Abeni, lucabe72 ##@## email ##.## it
diego
parents:
3036
diff
changeset
|
55 unsigned int bitstream_buffer_size; |
1273 | 56 } ASV1Context; |
57 | |
58 static const uint8_t scantab[64]={ | |
59 0x00,0x08,0x01,0x09,0x10,0x18,0x11,0x19, | |
60 0x02,0x0A,0x03,0x0B,0x12,0x1A,0x13,0x1B, | |
61 0x04,0x0C,0x05,0x0D,0x20,0x28,0x21,0x29, | |
62 0x06,0x0E,0x07,0x0F,0x14,0x1C,0x15,0x1D, | |
63 0x22,0x2A,0x23,0x2B,0x30,0x38,0x31,0x39, | |
1433 | 64 0x16,0x1E,0x17,0x1F,0x24,0x2C,0x25,0x2D, |
65 0x32,0x3A,0x33,0x3B,0x26,0x2E,0x27,0x2F, | |
66 0x34,0x3C,0x35,0x3D,0x36,0x3E,0x37,0x3F, | |
67 }; | |
68 | |
69 | |
1273 | 70 static const uint8_t ccp_tab[17][2]={ |
1433 | 71 {0x2,2}, {0x7,5}, {0xB,5}, {0x3,5}, |
72 {0xD,5}, {0x5,5}, {0x9,5}, {0x1,5}, | |
2967 | 73 {0xE,5}, {0x6,5}, {0xA,5}, {0x2,5}, |
1433 | 74 {0xC,5}, {0x4,5}, {0x8,5}, {0x3,2}, |
1273 | 75 {0xF,5}, //EOB |
76 }; | |
77 | |
78 static const uint8_t level_tab[7][2]={ | |
79 {3,4}, {3,3}, {3,2}, {0,3}, {2,2}, {2,3}, {2,4} | |
80 }; | |
81 | |
1433 | 82 static const uint8_t dc_ccp_tab[8][2]={ |
83 {0x1,2}, {0xD,4}, {0xF,4}, {0xC,4}, | |
84 {0x5,3}, {0xE,4}, {0x4,3}, {0x0,2}, | |
85 }; | |
86 | |
87 static const uint8_t ac_ccp_tab[16][2]={ | |
88 {0x00,2}, {0x3B,6}, {0x0A,4}, {0x3A,6}, | |
89 {0x02,3}, {0x39,6}, {0x3C,6}, {0x38,6}, | |
90 {0x03,3}, {0x3D,6}, {0x08,4}, {0x1F,5}, | |
91 {0x09,4}, {0x0B,4}, {0x0D,4}, {0x0C,4}, | |
92 }; | |
93 | |
94 static const uint8_t asv2_level_tab[63][2]={ | |
95 {0x3F,10},{0x2F,10},{0x37,10},{0x27,10},{0x3B,10},{0x2B,10},{0x33,10},{0x23,10}, | |
96 {0x3D,10},{0x2D,10},{0x35,10},{0x25,10},{0x39,10},{0x29,10},{0x31,10},{0x21,10}, | |
97 {0x1F, 8},{0x17, 8},{0x1B, 8},{0x13, 8},{0x1D, 8},{0x15, 8},{0x19, 8},{0x11, 8}, | |
98 {0x0F, 6},{0x0B, 6},{0x0D, 6},{0x09, 6}, | |
99 {0x07, 4},{0x05, 4}, | |
100 {0x03, 2}, | |
101 {0x00, 5}, | |
102 {0x02, 2}, | |
103 {0x04, 4},{0x06, 4}, | |
104 {0x08, 6},{0x0C, 6},{0x0A, 6},{0x0E, 6}, | |
105 {0x10, 8},{0x18, 8},{0x14, 8},{0x1C, 8},{0x12, 8},{0x1A, 8},{0x16, 8},{0x1E, 8}, | |
106 {0x20,10},{0x30,10},{0x28,10},{0x38,10},{0x24,10},{0x34,10},{0x2C,10},{0x3C,10}, | |
107 {0x22,10},{0x32,10},{0x2A,10},{0x3A,10},{0x26,10},{0x36,10},{0x2E,10},{0x3E,10}, | |
108 }; | |
109 | |
110 | |
1273 | 111 static VLC ccp_vlc; |
112 static VLC level_vlc; | |
1433 | 113 static VLC dc_ccp_vlc; |
114 static VLC ac_ccp_vlc; | |
115 static VLC asv2_level_vlc; | |
1273 | 116 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6448
diff
changeset
|
117 static av_cold void init_vlcs(ASV1Context *a){ |
1273 | 118 static int done = 0; |
119 | |
120 if (!done) { | |
121 done = 1; | |
122 | |
9397 | 123 INIT_VLC_STATIC(&ccp_vlc, VLC_BITS, 17, |
1273 | 124 &ccp_tab[0][1], 2, 1, |
9397 | 125 &ccp_tab[0][0], 2, 1, 64); |
126 INIT_VLC_STATIC(&dc_ccp_vlc, VLC_BITS, 8, | |
1433 | 127 &dc_ccp_tab[0][1], 2, 1, |
9397 | 128 &dc_ccp_tab[0][0], 2, 1, 64); |
129 INIT_VLC_STATIC(&ac_ccp_vlc, VLC_BITS, 16, | |
1433 | 130 &ac_ccp_tab[0][1], 2, 1, |
9397 | 131 &ac_ccp_tab[0][0], 2, 1, 64); |
132 INIT_VLC_STATIC(&level_vlc, VLC_BITS, 7, | |
1273 | 133 &level_tab[0][1], 2, 1, |
9397 | 134 &level_tab[0][0], 2, 1, 64); |
135 INIT_VLC_STATIC(&asv2_level_vlc, ASV2_LEVEL_VLC_BITS, 63, | |
1433 | 136 &asv2_level_tab[0][1], 2, 1, |
9397 | 137 &asv2_level_tab[0][0], 2, 1, 1024); |
1273 | 138 } |
139 } | |
140 | |
1433 | 141 //FIXME write a reversed bitstream reader to avoid the double reverse |
142 static inline int asv2_get_bits(GetBitContext *gb, int n){ | |
10501
bdf4a9ca162a
Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents:
10406
diff
changeset
|
143 return av_reverse[ get_bits(gb, n) << (8-n) ]; |
1433 | 144 } |
145 | |
1434 | 146 static inline void asv2_put_bits(PutBitContext *pb, int n, int v){ |
10501
bdf4a9ca162a
Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents:
10406
diff
changeset
|
147 put_bits(pb, n, av_reverse[ v << (8-n) ]); |
1434 | 148 } |
149 | |
1433 | 150 static inline int asv1_get_level(GetBitContext *gb){ |
1273 | 151 int code= get_vlc2(gb, level_vlc.table, VLC_BITS, 1); |
152 | |
153 if(code==3) return get_sbits(gb, 8); | |
154 else return code - 3; | |
155 } | |
156 | |
1433 | 157 static inline int asv2_get_level(GetBitContext *gb){ |
158 int code= get_vlc2(gb, asv2_level_vlc.table, ASV2_LEVEL_VLC_BITS, 1); | |
159 | |
160 if(code==31) return (int8_t)asv2_get_bits(gb, 8); | |
161 else return code - 31; | |
162 } | |
163 | |
164 static inline void asv1_put_level(PutBitContext *pb, int level){ | |
1273 | 165 unsigned int index= level + 3; |
166 | |
167 if(index <= 6) put_bits(pb, level_tab[index][1], level_tab[index][0]); | |
168 else{ | |
169 put_bits(pb, level_tab[3][1], level_tab[3][0]); | |
7260
3ec34b551aae
bitstream: move put_sbits() from flacenc.c to bitstream.h and use it
ramiro
parents:
7040
diff
changeset
|
170 put_sbits(pb, 8, level); |
1273 | 171 } |
172 } | |
173 | |
1434 | 174 static inline void asv2_put_level(PutBitContext *pb, int level){ |
175 unsigned int index= level + 31; | |
176 | |
177 if(index <= 62) put_bits(pb, asv2_level_tab[index][1], asv2_level_tab[index][0]); | |
178 else{ | |
179 put_bits(pb, asv2_level_tab[31][1], asv2_level_tab[31][0]); | |
180 asv2_put_bits(pb, 8, level&0xFF); | |
181 } | |
182 } | |
183 | |
1433 | 184 static inline int asv1_decode_block(ASV1Context *a, DCTELEM block[64]){ |
1273 | 185 int i; |
186 | |
187 block[0]= 8*get_bits(&a->gb, 8); | |
2967 | 188 |
1273 | 189 for(i=0; i<11; i++){ |
190 const int ccp= get_vlc2(&a->gb, ccp_vlc.table, VLC_BITS, 1); | |
191 | |
192 if(ccp){ | |
193 if(ccp == 16) break; | |
194 if(ccp < 0 || i>=10){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1522
diff
changeset
|
195 av_log(a->avctx, AV_LOG_ERROR, "coded coeff pattern damaged\n"); |
1273 | 196 return -1; |
197 } | |
198 | |
1433 | 199 if(ccp&8) block[a->scantable.permutated[4*i+0]]= (asv1_get_level(&a->gb) * a->intra_matrix[4*i+0])>>4; |
200 if(ccp&4) block[a->scantable.permutated[4*i+1]]= (asv1_get_level(&a->gb) * a->intra_matrix[4*i+1])>>4; | |
201 if(ccp&2) block[a->scantable.permutated[4*i+2]]= (asv1_get_level(&a->gb) * a->intra_matrix[4*i+2])>>4; | |
202 if(ccp&1) block[a->scantable.permutated[4*i+3]]= (asv1_get_level(&a->gb) * a->intra_matrix[4*i+3])>>4; | |
1273 | 203 } |
204 } | |
205 | |
206 return 0; | |
207 } | |
208 | |
1433 | 209 static inline int asv2_decode_block(ASV1Context *a, DCTELEM block[64]){ |
210 int i, count, ccp; | |
211 | |
212 count= asv2_get_bits(&a->gb, 4); | |
2967 | 213 |
1433 | 214 block[0]= 8*asv2_get_bits(&a->gb, 8); |
2967 | 215 |
1433 | 216 ccp= get_vlc2(&a->gb, dc_ccp_vlc.table, VLC_BITS, 1); |
217 if(ccp){ | |
218 if(ccp&4) block[a->scantable.permutated[1]]= (asv2_get_level(&a->gb) * a->intra_matrix[1])>>4; | |
219 if(ccp&2) block[a->scantable.permutated[2]]= (asv2_get_level(&a->gb) * a->intra_matrix[2])>>4; | |
220 if(ccp&1) block[a->scantable.permutated[3]]= (asv2_get_level(&a->gb) * a->intra_matrix[3])>>4; | |
221 } | |
222 | |
223 for(i=1; i<count+1; i++){ | |
224 const int ccp= get_vlc2(&a->gb, ac_ccp_vlc.table, VLC_BITS, 1); | |
225 | |
226 if(ccp){ | |
227 if(ccp&8) block[a->scantable.permutated[4*i+0]]= (asv2_get_level(&a->gb) * a->intra_matrix[4*i+0])>>4; | |
228 if(ccp&4) block[a->scantable.permutated[4*i+1]]= (asv2_get_level(&a->gb) * a->intra_matrix[4*i+1])>>4; | |
229 if(ccp&2) block[a->scantable.permutated[4*i+2]]= (asv2_get_level(&a->gb) * a->intra_matrix[4*i+2])>>4; | |
230 if(ccp&1) block[a->scantable.permutated[4*i+3]]= (asv2_get_level(&a->gb) * a->intra_matrix[4*i+3])>>4; | |
231 } | |
232 } | |
2967 | 233 |
1433 | 234 return 0; |
235 } | |
236 | |
1434 | 237 static inline void asv1_encode_block(ASV1Context *a, DCTELEM block[64]){ |
1273 | 238 int i; |
239 int nc_count=0; | |
2967 | 240 |
1273 | 241 put_bits(&a->pb, 8, (block[0] + 32)>>6); |
242 block[0]= 0; | |
2967 | 243 |
1273 | 244 for(i=0; i<10; i++){ |
245 const int index= scantab[4*i]; | |
246 int ccp=0; | |
247 | |
1433 | 248 if( (block[index + 0] = (block[index + 0]*a->q_intra_matrix[index + 0] + (1<<15))>>16) ) ccp |= 8; |
249 if( (block[index + 8] = (block[index + 8]*a->q_intra_matrix[index + 8] + (1<<15))>>16) ) ccp |= 4; | |
250 if( (block[index + 1] = (block[index + 1]*a->q_intra_matrix[index + 1] + (1<<15))>>16) ) ccp |= 2; | |
251 if( (block[index + 9] = (block[index + 9]*a->q_intra_matrix[index + 9] + (1<<15))>>16) ) ccp |= 1; | |
1273 | 252 |
253 if(ccp){ | |
2967 | 254 for(;nc_count; nc_count--) |
1273 | 255 put_bits(&a->pb, ccp_tab[0][1], ccp_tab[0][0]); |
256 | |
257 put_bits(&a->pb, ccp_tab[ccp][1], ccp_tab[ccp][0]); | |
2967 | 258 |
1433 | 259 if(ccp&8) asv1_put_level(&a->pb, block[index + 0]); |
260 if(ccp&4) asv1_put_level(&a->pb, block[index + 8]); | |
261 if(ccp&2) asv1_put_level(&a->pb, block[index + 1]); | |
262 if(ccp&1) asv1_put_level(&a->pb, block[index + 9]); | |
1273 | 263 }else{ |
264 nc_count++; | |
265 } | |
266 } | |
267 put_bits(&a->pb, ccp_tab[16][1], ccp_tab[16][0]); | |
268 } | |
269 | |
1434 | 270 static inline void asv2_encode_block(ASV1Context *a, DCTELEM block[64]){ |
271 int i; | |
272 int count=0; | |
2967 | 273 |
1434 | 274 for(count=63; count>3; count--){ |
275 const int index= scantab[count]; | |
276 | |
2967 | 277 if( (block[index]*a->q_intra_matrix[index] + (1<<15))>>16 ) |
1434 | 278 break; |
279 } | |
2967 | 280 |
1434 | 281 count >>= 2; |
282 | |
283 asv2_put_bits(&a->pb, 4, count); | |
284 asv2_put_bits(&a->pb, 8, (block[0] + 32)>>6); | |
285 block[0]= 0; | |
2967 | 286 |
1434 | 287 for(i=0; i<=count; i++){ |
288 const int index= scantab[4*i]; | |
289 int ccp=0; | |
290 | |
291 if( (block[index + 0] = (block[index + 0]*a->q_intra_matrix[index + 0] + (1<<15))>>16) ) ccp |= 8; | |
292 if( (block[index + 8] = (block[index + 8]*a->q_intra_matrix[index + 8] + (1<<15))>>16) ) ccp |= 4; | |
293 if( (block[index + 1] = (block[index + 1]*a->q_intra_matrix[index + 1] + (1<<15))>>16) ) ccp |= 2; | |
294 if( (block[index + 9] = (block[index + 9]*a->q_intra_matrix[index + 9] + (1<<15))>>16) ) ccp |= 1; | |
295 | |
3183
8e00b10aeb0a
add assert to clarify that we know what we are doing
michael
parents:
3089
diff
changeset
|
296 assert(i || ccp<8); |
1434 | 297 if(i) put_bits(&a->pb, ac_ccp_tab[ccp][1], ac_ccp_tab[ccp][0]); |
298 else put_bits(&a->pb, dc_ccp_tab[ccp][1], dc_ccp_tab[ccp][0]); | |
299 | |
300 if(ccp){ | |
301 if(ccp&8) asv2_put_level(&a->pb, block[index + 0]); | |
302 if(ccp&4) asv2_put_level(&a->pb, block[index + 8]); | |
303 if(ccp&2) asv2_put_level(&a->pb, block[index + 1]); | |
304 if(ccp&1) asv2_put_level(&a->pb, block[index + 9]); | |
305 } | |
306 } | |
307 } | |
308 | |
1273 | 309 static inline int decode_mb(ASV1Context *a, DCTELEM block[6][64]){ |
310 int i; | |
311 | |
312 a->dsp.clear_blocks(block[0]); | |
2967 | 313 |
1433 | 314 if(a->avctx->codec_id == CODEC_ID_ASV1){ |
315 for(i=0; i<6; i++){ | |
2967 | 316 if( asv1_decode_block(a, block[i]) < 0) |
1433 | 317 return -1; |
318 } | |
319 }else{ | |
320 for(i=0; i<6; i++){ | |
2967 | 321 if( asv2_decode_block(a, block[i]) < 0) |
1433 | 322 return -1; |
323 } | |
1273 | 324 } |
325 return 0; | |
326 } | |
327 | |
2422 | 328 static inline int encode_mb(ASV1Context *a, DCTELEM block[6][64]){ |
1273 | 329 int i; |
2967 | 330 |
2422 | 331 if(a->pb.buf_end - a->pb.buf - (put_bits_count(&a->pb)>>3) < 30*16*16*3/2/8){ |
332 av_log(a->avctx, AV_LOG_ERROR, "encoded frame too large\n"); | |
333 return -1; | |
334 } | |
1273 | 335 |
1434 | 336 if(a->avctx->codec_id == CODEC_ID_ASV1){ |
337 for(i=0; i<6; i++) | |
338 asv1_encode_block(a, block[i]); | |
339 }else{ | |
340 for(i=0; i<6; i++) | |
341 asv2_encode_block(a, block[i]); | |
1273 | 342 } |
2422 | 343 return 0; |
1273 | 344 } |
1274
95061e8c5ea9
CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1273
diff
changeset
|
345 |
1273 | 346 static inline void idct_put(ASV1Context *a, int mb_x, int mb_y){ |
347 DCTELEM (*block)[64]= a->block; | |
348 int linesize= a->picture.linesize[0]; | |
2967 | 349 |
1273 | 350 uint8_t *dest_y = a->picture.data[0] + (mb_y * 16* linesize ) + mb_x * 16; |
351 uint8_t *dest_cb = a->picture.data[1] + (mb_y * 8 * a->picture.linesize[1]) + mb_x * 8; | |
352 uint8_t *dest_cr = a->picture.data[2] + (mb_y * 8 * a->picture.linesize[2]) + mb_x * 8; | |
353 | |
354 a->dsp.idct_put(dest_y , linesize, block[0]); | |
355 a->dsp.idct_put(dest_y + 8, linesize, block[1]); | |
356 a->dsp.idct_put(dest_y + 8*linesize , linesize, block[2]); | |
357 a->dsp.idct_put(dest_y + 8*linesize + 8, linesize, block[3]); | |
358 | |
359 if(!(a->avctx->flags&CODEC_FLAG_GRAY)){ | |
360 a->dsp.idct_put(dest_cb, a->picture.linesize[1], block[4]); | |
361 a->dsp.idct_put(dest_cr, a->picture.linesize[2], block[5]); | |
362 } | |
363 } | |
364 | |
365 static inline void dct_get(ASV1Context *a, int mb_x, int mb_y){ | |
366 DCTELEM (*block)[64]= a->block; | |
367 int linesize= a->picture.linesize[0]; | |
368 int i; | |
2967 | 369 |
1273 | 370 uint8_t *ptr_y = a->picture.data[0] + (mb_y * 16* linesize ) + mb_x * 16; |
371 uint8_t *ptr_cb = a->picture.data[1] + (mb_y * 8 * a->picture.linesize[1]) + mb_x * 8; | |
372 uint8_t *ptr_cr = a->picture.data[2] + (mb_y * 8 * a->picture.linesize[2]) + mb_x * 8; | |
373 | |
374 a->dsp.get_pixels(block[0], ptr_y , linesize); | |
375 a->dsp.get_pixels(block[1], ptr_y + 8, linesize); | |
376 a->dsp.get_pixels(block[2], ptr_y + 8*linesize , linesize); | |
377 a->dsp.get_pixels(block[3], ptr_y + 8*linesize + 8, linesize); | |
378 for(i=0; i<4; i++) | |
379 a->dsp.fdct(block[i]); | |
2967 | 380 |
1273 | 381 if(!(a->avctx->flags&CODEC_FLAG_GRAY)){ |
382 a->dsp.get_pixels(block[4], ptr_cb, a->picture.linesize[1]); | |
383 a->dsp.get_pixels(block[5], ptr_cr, a->picture.linesize[2]); | |
384 for(i=4; i<6; i++) | |
385 a->dsp.fdct(block[i]); | |
386 } | |
387 } | |
388 | |
2967 | 389 static int decode_frame(AVCodecContext *avctx, |
1273 | 390 void *data, int *data_size, |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
391 AVPacket *avpkt) |
1273 | 392 { |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
393 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
394 int buf_size = avpkt->size; |
1273 | 395 ASV1Context * const a = avctx->priv_data; |
396 AVFrame *picture = data; | |
10406
825c7f57cfac
Remove silly casts to the same type as we already have.
reimar
parents:
10405
diff
changeset
|
397 AVFrame * const p= &a->picture; |
1273 | 398 int mb_x, mb_y; |
399 | |
400 if(p->data[0]) | |
401 avctx->release_buffer(avctx, p); | |
402 | |
403 p->reference= 0; | |
404 if(avctx->get_buffer(avctx, p) < 0){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1522
diff
changeset
|
405 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); |
1273 | 406 return -1; |
407 } | |
6448
7fa807dd7958
remove #include "mpegvideo.h" where it is not needed
aurel
parents:
6225
diff
changeset
|
408 p->pict_type= FF_I_TYPE; |
1273 | 409 p->key_frame= 1; |
410 | |
9415
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9411
diff
changeset
|
411 av_fast_malloc(&a->bitstream_buffer, &a->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE); |
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9411
diff
changeset
|
412 if (!a->bitstream_buffer) |
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9411
diff
changeset
|
413 return AVERROR(ENOMEM); |
2967 | 414 |
1433 | 415 if(avctx->codec_id == CODEC_ID_ASV1) |
6225 | 416 a->dsp.bswap_buf((uint32_t*)a->bitstream_buffer, (const uint32_t*)buf, buf_size/4); |
1433 | 417 else{ |
418 int i; | |
419 for(i=0; i<buf_size; i++) | |
10501
bdf4a9ca162a
Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents:
10406
diff
changeset
|
420 a->bitstream_buffer[i]= av_reverse[ buf[i] ]; |
1433 | 421 } |
422 | |
1273 | 423 init_get_bits(&a->gb, a->bitstream_buffer, buf_size*8); |
424 | |
425 for(mb_y=0; mb_y<a->mb_height2; mb_y++){ | |
426 for(mb_x=0; mb_x<a->mb_width2; mb_x++){ | |
427 if( decode_mb(a, a->block) <0) | |
428 return -1; | |
2967 | 429 |
1273 | 430 idct_put(a, mb_x, mb_y); |
431 } | |
432 } | |
433 | |
434 if(a->mb_width2 != a->mb_width){ | |
435 mb_x= a->mb_width2; | |
436 for(mb_y=0; mb_y<a->mb_height2; mb_y++){ | |
437 if( decode_mb(a, a->block) <0) | |
438 return -1; | |
2967 | 439 |
1273 | 440 idct_put(a, mb_x, mb_y); |
441 } | |
442 } | |
443 | |
444 if(a->mb_height2 != a->mb_height){ | |
445 mb_y= a->mb_height2; | |
446 for(mb_x=0; mb_x<a->mb_width; mb_x++){ | |
447 if( decode_mb(a, a->block) <0) | |
448 return -1; | |
2967 | 449 |
1273 | 450 idct_put(a, mb_x, mb_y); |
451 } | |
452 } | |
2967 | 453 #if 0 |
1273 | 454 int i; |
455 printf("%d %d\n", 8*buf_size, get_bits_count(&a->gb)); | |
456 for(i=get_bits_count(&a->gb); i<8*buf_size; i++){ | |
457 printf("%d", get_bits1(&a->gb)); | |
458 } | |
459 | |
460 for(i=0; i<s->avctx->extradata_size; i++){ | |
461 printf("%c\n", ((uint8_t*)s->avctx->extradata)[i]); | |
462 } | |
463 #endif | |
464 | |
465 *picture= *(AVFrame*)&a->picture; | |
466 *data_size = sizeof(AVPicture); | |
467 | |
468 emms_c(); | |
2967 | 469 |
1273 | 470 return (get_bits_count(&a->gb)+31)/32*4; |
471 } | |
472 | |
8590 | 473 #if CONFIG_ASV1_ENCODER || CONFIG_ASV2_ENCODER |
1273 | 474 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ |
475 ASV1Context * const a = avctx->priv_data; | |
476 AVFrame *pict = data; | |
10406
825c7f57cfac
Remove silly casts to the same type as we already have.
reimar
parents:
10405
diff
changeset
|
477 AVFrame * const p= &a->picture; |
1273 | 478 int size; |
479 int mb_x, mb_y; | |
480 | |
1522
79dddc5cd990
removed the obsolete and unused parameters of init_put_bits
alex
parents:
1434
diff
changeset
|
481 init_put_bits(&a->pb, buf, buf_size); |
2967 | 482 |
1273 | 483 *p = *pict; |
6448
7fa807dd7958
remove #include "mpegvideo.h" where it is not needed
aurel
parents:
6225
diff
changeset
|
484 p->pict_type= FF_I_TYPE; |
1273 | 485 p->key_frame= 1; |
486 | |
487 for(mb_y=0; mb_y<a->mb_height2; mb_y++){ | |
488 for(mb_x=0; mb_x<a->mb_width2; mb_x++){ | |
489 dct_get(a, mb_x, mb_y); | |
490 encode_mb(a, a->block); | |
491 } | |
492 } | |
493 | |
494 if(a->mb_width2 != a->mb_width){ | |
495 mb_x= a->mb_width2; | |
496 for(mb_y=0; mb_y<a->mb_height2; mb_y++){ | |
497 dct_get(a, mb_x, mb_y); | |
498 encode_mb(a, a->block); | |
499 } | |
500 } | |
501 | |
502 if(a->mb_height2 != a->mb_height){ | |
503 mb_y= a->mb_height2; | |
504 for(mb_x=0; mb_x<a->mb_width; mb_x++){ | |
505 dct_get(a, mb_x, mb_y); | |
506 encode_mb(a, a->block); | |
507 } | |
508 } | |
509 emms_c(); | |
2967 | 510 |
1273 | 511 align_put_bits(&a->pb); |
1786 | 512 while(put_bits_count(&a->pb)&31) |
1273 | 513 put_bits(&a->pb, 8, 0); |
2967 | 514 |
1786 | 515 size= put_bits_count(&a->pb)/32; |
2967 | 516 |
1434 | 517 if(avctx->codec_id == CODEC_ID_ASV1) |
518 a->dsp.bswap_buf((uint32_t*)buf, (uint32_t*)buf, size); | |
519 else{ | |
520 int i; | |
521 for(i=0; i<4*size; i++) | |
10501
bdf4a9ca162a
Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents:
10406
diff
changeset
|
522 buf[i]= av_reverse[ buf[i] ]; |
1434 | 523 } |
2967 | 524 |
1273 | 525 return size*4; |
526 } | |
8590 | 527 #endif /* CONFIG_ASV1_ENCODER || CONFIG_ASV2_ENCODER */ |
1273 | 528 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6448
diff
changeset
|
529 static av_cold void common_init(AVCodecContext *avctx){ |
1273 | 530 ASV1Context * const a = avctx->priv_data; |
531 | |
532 dsputil_init(&a->dsp, avctx); | |
533 | |
534 a->mb_width = (avctx->width + 15) / 16; | |
535 a->mb_height = (avctx->height + 15) / 16; | |
536 a->mb_width2 = (avctx->width + 0) / 16; | |
537 a->mb_height2 = (avctx->height + 0) / 16; | |
538 | |
10406
825c7f57cfac
Remove silly casts to the same type as we already have.
reimar
parents:
10405
diff
changeset
|
539 avctx->coded_frame= &a->picture; |
1273 | 540 a->avctx= avctx; |
541 } | |
542 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6448
diff
changeset
|
543 static av_cold int decode_init(AVCodecContext *avctx){ |
1273 | 544 ASV1Context * const a = avctx->priv_data; |
10406
825c7f57cfac
Remove silly casts to the same type as we already have.
reimar
parents:
10405
diff
changeset
|
545 AVFrame *p= &a->picture; |
1273 | 546 int i; |
1434 | 547 const int scale= avctx->codec_id == CODEC_ID_ASV1 ? 1 : 2; |
2967 | 548 |
1273 | 549 common_init(avctx); |
550 init_vlcs(a); | |
551 ff_init_scantable(a->dsp.idct_permutation, &a->scantable, scantab); | |
2635 | 552 avctx->pix_fmt= PIX_FMT_YUV420P; |
1273 | 553 |
10406
825c7f57cfac
Remove silly casts to the same type as we already have.
reimar
parents:
10405
diff
changeset
|
554 a->inv_qscale= avctx->extradata[0]; |
1273 | 555 if(a->inv_qscale == 0){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1522
diff
changeset
|
556 av_log(avctx, AV_LOG_ERROR, "illegal qscale 0\n"); |
1433 | 557 if(avctx->codec_id == CODEC_ID_ASV1) |
558 a->inv_qscale= 6; | |
559 else | |
560 a->inv_qscale= 10; | |
1273 | 561 } |
562 | |
563 for(i=0; i<64; i++){ | |
564 int index= scantab[i]; | |
1433 | 565 |
1434 | 566 a->intra_matrix[i]= 64*scale*ff_mpeg1_default_intra_matrix[index] / a->inv_qscale; |
1273 | 567 } |
568 | |
569 p->qstride= a->mb_width; | |
2426
1ee03f2a6cd5
av_malloc vs av_mallocz patch by (Kurosu <kurosu inforezo org>)
michael
parents:
2422
diff
changeset
|
570 p->qscale_table= av_malloc( p->qstride * a->mb_height); |
1434 | 571 p->quality= (32*scale + a->inv_qscale/2)/a->inv_qscale; |
572 memset(p->qscale_table, p->quality, p->qstride*a->mb_height); | |
1273 | 573 |
574 return 0; | |
575 } | |
576 | |
8590 | 577 #if CONFIG_ASV1_ENCODER || CONFIG_ASV2_ENCODER |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6448
diff
changeset
|
578 static av_cold int encode_init(AVCodecContext *avctx){ |
1273 | 579 ASV1Context * const a = avctx->priv_data; |
580 int i; | |
1434 | 581 const int scale= avctx->codec_id == CODEC_ID_ASV1 ? 1 : 2; |
582 | |
1273 | 583 common_init(avctx); |
2967 | 584 |
1273 | 585 if(avctx->global_quality == 0) avctx->global_quality= 4*FF_QUALITY_SCALE; |
586 | |
1434 | 587 a->inv_qscale= (32*scale*FF_QUALITY_SCALE + avctx->global_quality/2) / avctx->global_quality; |
2967 | 588 |
1273 | 589 avctx->extradata= av_mallocz(8); |
590 avctx->extradata_size=8; | |
12129 | 591 ((uint32_t*)avctx->extradata)[0]= av_le2ne32(a->inv_qscale); |
592 ((uint32_t*)avctx->extradata)[1]= av_le2ne32(AV_RL32("ASUS")); | |
2967 | 593 |
1273 | 594 for(i=0; i<64; i++){ |
1434 | 595 int q= 32*scale*ff_mpeg1_default_intra_matrix[i]; |
1273 | 596 a->q_intra_matrix[i]= ((a->inv_qscale<<16) + q/2) / q; |
597 } | |
598 | |
599 return 0; | |
600 } | |
8590 | 601 #endif /* CONFIG_ASV1_ENCODER || CONFIG_ASV2_ENCODER */ |
1273 | 602 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6448
diff
changeset
|
603 static av_cold int decode_end(AVCodecContext *avctx){ |
1273 | 604 ASV1Context * const a = avctx->priv_data; |
605 | |
606 av_freep(&a->bitstream_buffer); | |
607 av_freep(&a->picture.qscale_table); | |
608 a->bitstream_buffer_size=0; | |
2967 | 609 |
10405
c687042d9bde
Add missing release_buffer at decode end for asv1 decoder.
reimar
parents:
10146
diff
changeset
|
610 if(a->picture.data[0]) |
c687042d9bde
Add missing release_buffer at decode end for asv1 decoder.
reimar
parents:
10146
diff
changeset
|
611 avctx->release_buffer(avctx, &a->picture); |
c687042d9bde
Add missing release_buffer at decode end for asv1 decoder.
reimar
parents:
10146
diff
changeset
|
612 |
1273 | 613 return 0; |
614 } | |
615 | |
616 AVCodec asv1_decoder = { | |
617 "asv1", | |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11369
diff
changeset
|
618 AVMEDIA_TYPE_VIDEO, |
1273 | 619 CODEC_ID_ASV1, |
620 sizeof(ASV1Context), | |
621 decode_init, | |
622 NULL, | |
623 decode_end, | |
624 decode_frame, | |
625 CODEC_CAP_DR1, | |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6931
diff
changeset
|
626 .long_name= NULL_IF_CONFIG_SMALL("ASUS V1"), |
1273 | 627 }; |
628 | |
1433 | 629 AVCodec asv2_decoder = { |
630 "asv2", | |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11369
diff
changeset
|
631 AVMEDIA_TYPE_VIDEO, |
1433 | 632 CODEC_ID_ASV2, |
633 sizeof(ASV1Context), | |
634 decode_init, | |
635 NULL, | |
636 decode_end, | |
637 decode_frame, | |
638 CODEC_CAP_DR1, | |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6931
diff
changeset
|
639 .long_name= NULL_IF_CONFIG_SMALL("ASUS V2"), |
1433 | 640 }; |
641 | |
8590 | 642 #if CONFIG_ASV1_ENCODER |
1273 | 643 AVCodec asv1_encoder = { |
644 "asv1", | |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11369
diff
changeset
|
645 AVMEDIA_TYPE_VIDEO, |
1273 | 646 CODEC_ID_ASV1, |
647 sizeof(ASV1Context), | |
648 encode_init, | |
649 encode_frame, | |
650 //encode_end, | |
10146
38cfe222e1a4
Mark all pix_fmts and supported_framerates compound literals as const.
reimar
parents:
10093
diff
changeset
|
651 .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE}, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6931
diff
changeset
|
652 .long_name= NULL_IF_CONFIG_SMALL("ASUS V1"), |
1273 | 653 }; |
7782
6efb15a24e91
Replace generic CONFIG_ENCODERS preprocessor conditionals by more specific
diego
parents:
7260
diff
changeset
|
654 #endif |
1274
95061e8c5ea9
CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1273
diff
changeset
|
655 |
8590 | 656 #if CONFIG_ASV2_ENCODER |
1434 | 657 AVCodec asv2_encoder = { |
658 "asv2", | |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11369
diff
changeset
|
659 AVMEDIA_TYPE_VIDEO, |
1434 | 660 CODEC_ID_ASV2, |
661 sizeof(ASV1Context), | |
662 encode_init, | |
663 encode_frame, | |
664 //encode_end, | |
10146
38cfe222e1a4
Mark all pix_fmts and supported_framerates compound literals as const.
reimar
parents:
10093
diff
changeset
|
665 .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE}, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6931
diff
changeset
|
666 .long_name= NULL_IF_CONFIG_SMALL("ASUS V2"), |
1434 | 667 }; |
7782
6efb15a24e91
Replace generic CONFIG_ENCODERS preprocessor conditionals by more specific
diego
parents:
7260
diff
changeset
|
668 #endif |