3 * Copyright (c) 2003 Michael Niedermayer
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
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.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
28 #include "bitstream.h"
30 #include "mpeg12data.h"
36 #define ASV2_LEVEL_VLC_BITS 10
38 typedef struct ASV1Context
{
39 AVCodecContext
*avctx
;
50 DECLARE_ALIGNED_16(DCTELEM
, block
[6][64]);
51 DECLARE_ALIGNED_8(uint16_t, intra_matrix
[64]);
52 DECLARE_ALIGNED_8(int, q_intra_matrix
[64]);
53 uint8_t *bitstream_buffer
;
54 unsigned int bitstream_buffer_size
;
57 static const uint8_t scantab
[64]={
58 0x00,0x08,0x01,0x09,0x10,0x18,0x11,0x19,
59 0x02,0x0A,0x03,0x0B,0x12,0x1A,0x13,0x1B,
60 0x04,0x0C,0x05,0x0D,0x20,0x28,0x21,0x29,
61 0x06,0x0E,0x07,0x0F,0x14,0x1C,0x15,0x1D,
62 0x22,0x2A,0x23,0x2B,0x30,0x38,0x31,0x39,
63 0x16,0x1E,0x17,0x1F,0x24,0x2C,0x25,0x2D,
64 0x32,0x3A,0x33,0x3B,0x26,0x2E,0x27,0x2F,
65 0x34,0x3C,0x35,0x3D,0x36,0x3E,0x37,0x3F,
69 static const uint8_t ccp_tab
[17][2]={
70 {0x2,2}, {0x7,5}, {0xB,5}, {0x3,5},
71 {0xD,5}, {0x5,5}, {0x9,5}, {0x1,5},
72 {0xE,5}, {0x6,5}, {0xA,5}, {0x2,5},
73 {0xC,5}, {0x4,5}, {0x8,5}, {0x3,2},
77 static const uint8_t level_tab
[7][2]={
78 {3,4}, {3,3}, {3,2}, {0,3}, {2,2}, {2,3}, {2,4}
81 static const uint8_t dc_ccp_tab
[8][2]={
82 {0x1,2}, {0xD,4}, {0xF,4}, {0xC,4},
83 {0x5,3}, {0xE,4}, {0x4,3}, {0x0,2},
86 static const uint8_t ac_ccp_tab
[16][2]={
87 {0x00,2}, {0x3B,6}, {0x0A,4}, {0x3A,6},
88 {0x02,3}, {0x39,6}, {0x3C,6}, {0x38,6},
89 {0x03,3}, {0x3D,6}, {0x08,4}, {0x1F,5},
90 {0x09,4}, {0x0B,4}, {0x0D,4}, {0x0C,4},
93 static const uint8_t asv2_level_tab
[63][2]={
94 {0x3F,10},{0x2F,10},{0x37,10},{0x27,10},{0x3B,10},{0x2B,10},{0x33,10},{0x23,10},
95 {0x3D,10},{0x2D,10},{0x35,10},{0x25,10},{0x39,10},{0x29,10},{0x31,10},{0x21,10},
96 {0x1F, 8},{0x17, 8},{0x1B, 8},{0x13, 8},{0x1D, 8},{0x15, 8},{0x19, 8},{0x11, 8},
97 {0x0F, 6},{0x0B, 6},{0x0D, 6},{0x09, 6},
103 {0x08, 6},{0x0C, 6},{0x0A, 6},{0x0E, 6},
104 {0x10, 8},{0x18, 8},{0x14, 8},{0x1C, 8},{0x12, 8},{0x1A, 8},{0x16, 8},{0x1E, 8},
105 {0x20,10},{0x30,10},{0x28,10},{0x38,10},{0x24,10},{0x34,10},{0x2C,10},{0x3C,10},
106 {0x22,10},{0x32,10},{0x2A,10},{0x3A,10},{0x26,10},{0x36,10},{0x2E,10},{0x3E,10},
111 static VLC level_vlc
;
112 static VLC dc_ccp_vlc
;
113 static VLC ac_ccp_vlc
;
114 static VLC asv2_level_vlc
;
116 static av_cold
void init_vlcs(ASV1Context
*a
){
122 init_vlc(&ccp_vlc
, VLC_BITS
, 17,
123 &ccp_tab
[0][1], 2, 1,
124 &ccp_tab
[0][0], 2, 1, 1);
125 init_vlc(&dc_ccp_vlc
, VLC_BITS
, 8,
126 &dc_ccp_tab
[0][1], 2, 1,
127 &dc_ccp_tab
[0][0], 2, 1, 1);
128 init_vlc(&ac_ccp_vlc
, VLC_BITS
, 16,
129 &ac_ccp_tab
[0][1], 2, 1,
130 &ac_ccp_tab
[0][0], 2, 1, 1);
131 init_vlc(&level_vlc
, VLC_BITS
, 7,
132 &level_tab
[0][1], 2, 1,
133 &level_tab
[0][0], 2, 1, 1);
134 init_vlc(&asv2_level_vlc
, ASV2_LEVEL_VLC_BITS
, 63,
135 &asv2_level_tab
[0][1], 2, 1,
136 &asv2_level_tab
[0][0], 2, 1, 1);
140 //FIXME write a reversed bitstream reader to avoid the double reverse
141 static inline int asv2_get_bits(GetBitContext
*gb
, int n
){
142 return ff_reverse
[ get_bits(gb
, n
) << (8-n
) ];
145 static inline void asv2_put_bits(PutBitContext
*pb
, int n
, int v
){
146 put_bits(pb
, n
, ff_reverse
[ v
<< (8-n
) ]);
149 static inline int asv1_get_level(GetBitContext
*gb
){
150 int code
= get_vlc2(gb
, level_vlc
.table
, VLC_BITS
, 1);
152 if(code
==3) return get_sbits(gb
, 8);
153 else return code
- 3;
156 static inline int asv2_get_level(GetBitContext
*gb
){
157 int code
= get_vlc2(gb
, asv2_level_vlc
.table
, ASV2_LEVEL_VLC_BITS
, 1);
159 if(code
==31) return (int8_t)asv2_get_bits(gb
, 8);
160 else return code
- 31;
163 static inline void asv1_put_level(PutBitContext
*pb
, int level
){
164 unsigned int index
= level
+ 3;
166 if(index
<= 6) put_bits(pb
, level_tab
[index
][1], level_tab
[index
][0]);
168 put_bits(pb
, level_tab
[3][1], level_tab
[3][0]);
169 put_bits(pb
, 8, level
&0xFF);
173 static inline void asv2_put_level(PutBitContext
*pb
, int level
){
174 unsigned int index
= level
+ 31;
176 if(index
<= 62) put_bits(pb
, asv2_level_tab
[index
][1], asv2_level_tab
[index
][0]);
178 put_bits(pb
, asv2_level_tab
[31][1], asv2_level_tab
[31][0]);
179 asv2_put_bits(pb
, 8, level
&0xFF);
183 static inline int asv1_decode_block(ASV1Context
*a
, DCTELEM block
[64]){
186 block
[0]= 8*get_bits(&a
->gb
, 8);
189 const int ccp
= get_vlc2(&a
->gb
, ccp_vlc
.table
, VLC_BITS
, 1);
193 if(ccp
< 0 || i
>=10){
194 av_log(a
->avctx
, AV_LOG_ERROR
, "coded coeff pattern damaged\n");
198 if(ccp
&8) block
[a
->scantable
.permutated
[4*i
+0]]= (asv1_get_level(&a
->gb
) * a
->intra_matrix
[4*i
+0])>>4;
199 if(ccp
&4) block
[a
->scantable
.permutated
[4*i
+1]]= (asv1_get_level(&a
->gb
) * a
->intra_matrix
[4*i
+1])>>4;
200 if(ccp
&2) block
[a
->scantable
.permutated
[4*i
+2]]= (asv1_get_level(&a
->gb
) * a
->intra_matrix
[4*i
+2])>>4;
201 if(ccp
&1) block
[a
->scantable
.permutated
[4*i
+3]]= (asv1_get_level(&a
->gb
) * a
->intra_matrix
[4*i
+3])>>4;
208 static inline int asv2_decode_block(ASV1Context
*a
, DCTELEM block
[64]){
211 count
= asv2_get_bits(&a
->gb
, 4);
213 block
[0]= 8*asv2_get_bits(&a
->gb
, 8);
215 ccp
= get_vlc2(&a
->gb
, dc_ccp_vlc
.table
, VLC_BITS
, 1);
217 if(ccp
&4) block
[a
->scantable
.permutated
[1]]= (asv2_get_level(&a
->gb
) * a
->intra_matrix
[1])>>4;
218 if(ccp
&2) block
[a
->scantable
.permutated
[2]]= (asv2_get_level(&a
->gb
) * a
->intra_matrix
[2])>>4;
219 if(ccp
&1) block
[a
->scantable
.permutated
[3]]= (asv2_get_level(&a
->gb
) * a
->intra_matrix
[3])>>4;
222 for(i
=1; i
<count
+1; i
++){
223 const int ccp
= get_vlc2(&a
->gb
, ac_ccp_vlc
.table
, VLC_BITS
, 1);
226 if(ccp
&8) block
[a
->scantable
.permutated
[4*i
+0]]= (asv2_get_level(&a
->gb
) * a
->intra_matrix
[4*i
+0])>>4;
227 if(ccp
&4) block
[a
->scantable
.permutated
[4*i
+1]]= (asv2_get_level(&a
->gb
) * a
->intra_matrix
[4*i
+1])>>4;
228 if(ccp
&2) block
[a
->scantable
.permutated
[4*i
+2]]= (asv2_get_level(&a
->gb
) * a
->intra_matrix
[4*i
+2])>>4;
229 if(ccp
&1) block
[a
->scantable
.permutated
[4*i
+3]]= (asv2_get_level(&a
->gb
) * a
->intra_matrix
[4*i
+3])>>4;
236 static inline void asv1_encode_block(ASV1Context
*a
, DCTELEM block
[64]){
240 put_bits(&a
->pb
, 8, (block
[0] + 32)>>6);
244 const int index
= scantab
[4*i
];
247 if( (block
[index
+ 0] = (block
[index
+ 0]*a
->q_intra_matrix
[index
+ 0] + (1<<15))>>16) ) ccp
|= 8;
248 if( (block
[index
+ 8] = (block
[index
+ 8]*a
->q_intra_matrix
[index
+ 8] + (1<<15))>>16) ) ccp
|= 4;
249 if( (block
[index
+ 1] = (block
[index
+ 1]*a
->q_intra_matrix
[index
+ 1] + (1<<15))>>16) ) ccp
|= 2;
250 if( (block
[index
+ 9] = (block
[index
+ 9]*a
->q_intra_matrix
[index
+ 9] + (1<<15))>>16) ) ccp
|= 1;
253 for(;nc_count
; nc_count
--)
254 put_bits(&a
->pb
, ccp_tab
[0][1], ccp_tab
[0][0]);
256 put_bits(&a
->pb
, ccp_tab
[ccp
][1], ccp_tab
[ccp
][0]);
258 if(ccp
&8) asv1_put_level(&a
->pb
, block
[index
+ 0]);
259 if(ccp
&4) asv1_put_level(&a
->pb
, block
[index
+ 8]);
260 if(ccp
&2) asv1_put_level(&a
->pb
, block
[index
+ 1]);
261 if(ccp
&1) asv1_put_level(&a
->pb
, block
[index
+ 9]);
266 put_bits(&a
->pb
, ccp_tab
[16][1], ccp_tab
[16][0]);
269 static inline void asv2_encode_block(ASV1Context
*a
, DCTELEM block
[64]){
273 for(count
=63; count
>3; count
--){
274 const int index
= scantab
[count
];
276 if( (block
[index
]*a
->q_intra_matrix
[index
] + (1<<15))>>16 )
282 asv2_put_bits(&a
->pb
, 4, count
);
283 asv2_put_bits(&a
->pb
, 8, (block
[0] + 32)>>6);
286 for(i
=0; i
<=count
; i
++){
287 const int index
= scantab
[4*i
];
290 if( (block
[index
+ 0] = (block
[index
+ 0]*a
->q_intra_matrix
[index
+ 0] + (1<<15))>>16) ) ccp
|= 8;
291 if( (block
[index
+ 8] = (block
[index
+ 8]*a
->q_intra_matrix
[index
+ 8] + (1<<15))>>16) ) ccp
|= 4;
292 if( (block
[index
+ 1] = (block
[index
+ 1]*a
->q_intra_matrix
[index
+ 1] + (1<<15))>>16) ) ccp
|= 2;
293 if( (block
[index
+ 9] = (block
[index
+ 9]*a
->q_intra_matrix
[index
+ 9] + (1<<15))>>16) ) ccp
|= 1;
296 if(i
) put_bits(&a
->pb
, ac_ccp_tab
[ccp
][1], ac_ccp_tab
[ccp
][0]);
297 else put_bits(&a
->pb
, dc_ccp_tab
[ccp
][1], dc_ccp_tab
[ccp
][0]);
300 if(ccp
&8) asv2_put_level(&a
->pb
, block
[index
+ 0]);
301 if(ccp
&4) asv2_put_level(&a
->pb
, block
[index
+ 8]);
302 if(ccp
&2) asv2_put_level(&a
->pb
, block
[index
+ 1]);
303 if(ccp
&1) asv2_put_level(&a
->pb
, block
[index
+ 9]);
308 static inline int decode_mb(ASV1Context
*a
, DCTELEM block
[6][64]){
311 a
->dsp
.clear_blocks(block
[0]);
313 if(a
->avctx
->codec_id
== CODEC_ID_ASV1
){
315 if( asv1_decode_block(a
, block
[i
]) < 0)
320 if( asv2_decode_block(a
, block
[i
]) < 0)
327 static inline int encode_mb(ASV1Context
*a
, DCTELEM block
[6][64]){
330 if(a
->pb
.buf_end
- a
->pb
.buf
- (put_bits_count(&a
->pb
)>>3) < 30*16*16*3/2/8){
331 av_log(a
->avctx
, AV_LOG_ERROR
, "encoded frame too large\n");
335 if(a
->avctx
->codec_id
== CODEC_ID_ASV1
){
337 asv1_encode_block(a
, block
[i
]);
340 asv2_encode_block(a
, block
[i
]);
345 static inline void idct_put(ASV1Context
*a
, int mb_x
, int mb_y
){
346 DCTELEM (*block
)[64]= a
->block
;
347 int linesize
= a
->picture
.linesize
[0];
349 uint8_t *dest_y
= a
->picture
.data
[0] + (mb_y
* 16* linesize
) + mb_x
* 16;
350 uint8_t *dest_cb
= a
->picture
.data
[1] + (mb_y
* 8 * a
->picture
.linesize
[1]) + mb_x
* 8;
351 uint8_t *dest_cr
= a
->picture
.data
[2] + (mb_y
* 8 * a
->picture
.linesize
[2]) + mb_x
* 8;
353 a
->dsp
.idct_put(dest_y
, linesize
, block
[0]);
354 a
->dsp
.idct_put(dest_y
+ 8, linesize
, block
[1]);
355 a
->dsp
.idct_put(dest_y
+ 8*linesize
, linesize
, block
[2]);
356 a
->dsp
.idct_put(dest_y
+ 8*linesize
+ 8, linesize
, block
[3]);
358 if(!(a
->avctx
->flags
&CODEC_FLAG_GRAY
)){
359 a
->dsp
.idct_put(dest_cb
, a
->picture
.linesize
[1], block
[4]);
360 a
->dsp
.idct_put(dest_cr
, a
->picture
.linesize
[2], block
[5]);
364 static inline void dct_get(ASV1Context
*a
, int mb_x
, int mb_y
){
365 DCTELEM (*block
)[64]= a
->block
;
366 int linesize
= a
->picture
.linesize
[0];
369 uint8_t *ptr_y
= a
->picture
.data
[0] + (mb_y
* 16* linesize
) + mb_x
* 16;
370 uint8_t *ptr_cb
= a
->picture
.data
[1] + (mb_y
* 8 * a
->picture
.linesize
[1]) + mb_x
* 8;
371 uint8_t *ptr_cr
= a
->picture
.data
[2] + (mb_y
* 8 * a
->picture
.linesize
[2]) + mb_x
* 8;
373 a
->dsp
.get_pixels(block
[0], ptr_y
, linesize
);
374 a
->dsp
.get_pixels(block
[1], ptr_y
+ 8, linesize
);
375 a
->dsp
.get_pixels(block
[2], ptr_y
+ 8*linesize
, linesize
);
376 a
->dsp
.get_pixels(block
[3], ptr_y
+ 8*linesize
+ 8, linesize
);
378 a
->dsp
.fdct(block
[i
]);
380 if(!(a
->avctx
->flags
&CODEC_FLAG_GRAY
)){
381 a
->dsp
.get_pixels(block
[4], ptr_cb
, a
->picture
.linesize
[1]);
382 a
->dsp
.get_pixels(block
[5], ptr_cr
, a
->picture
.linesize
[2]);
384 a
->dsp
.fdct(block
[i
]);
388 static int decode_frame(AVCodecContext
*avctx
,
389 void *data
, int *data_size
,
390 const uint8_t *buf
, int buf_size
)
392 ASV1Context
* const a
= avctx
->priv_data
;
393 AVFrame
*picture
= data
;
394 AVFrame
* const p
= (AVFrame
*)&a
->picture
;
398 avctx
->release_buffer(avctx
, p
);
401 if(avctx
->get_buffer(avctx
, p
) < 0){
402 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
405 p
->pict_type
= FF_I_TYPE
;
408 a
->bitstream_buffer
= av_fast_realloc(a
->bitstream_buffer
, &a
->bitstream_buffer_size
, buf_size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
410 if(avctx
->codec_id
== CODEC_ID_ASV1
)
411 a
->dsp
.bswap_buf((uint32_t*)a
->bitstream_buffer
, (const uint32_t*)buf
, buf_size
/4);
414 for(i
=0; i
<buf_size
; i
++)
415 a
->bitstream_buffer
[i
]= ff_reverse
[ buf
[i
] ];
418 init_get_bits(&a
->gb
, a
->bitstream_buffer
, buf_size
*8);
420 for(mb_y
=0; mb_y
<a
->mb_height2
; mb_y
++){
421 for(mb_x
=0; mb_x
<a
->mb_width2
; mb_x
++){
422 if( decode_mb(a
, a
->block
) <0)
425 idct_put(a
, mb_x
, mb_y
);
429 if(a
->mb_width2
!= a
->mb_width
){
431 for(mb_y
=0; mb_y
<a
->mb_height2
; mb_y
++){
432 if( decode_mb(a
, a
->block
) <0)
435 idct_put(a
, mb_x
, mb_y
);
439 if(a
->mb_height2
!= a
->mb_height
){
441 for(mb_x
=0; mb_x
<a
->mb_width
; mb_x
++){
442 if( decode_mb(a
, a
->block
) <0)
445 idct_put(a
, mb_x
, mb_y
);
450 printf("%d %d\n", 8*buf_size
, get_bits_count(&a
->gb
));
451 for(i
=get_bits_count(&a
->gb
); i
<8*buf_size
; i
++){
452 printf("%d", get_bits1(&a
->gb
));
455 for(i
=0; i
<s
->avctx
->extradata_size
; i
++){
456 printf("%c\n", ((uint8_t*)s
->avctx
->extradata
)[i
]);
460 *picture
= *(AVFrame
*)&a
->picture
;
461 *data_size
= sizeof(AVPicture
);
465 return (get_bits_count(&a
->gb
)+31)/32*4;
468 #ifdef CONFIG_ENCODERS
469 static int encode_frame(AVCodecContext
*avctx
, unsigned char *buf
, int buf_size
, void *data
){
470 ASV1Context
* const a
= avctx
->priv_data
;
471 AVFrame
*pict
= data
;
472 AVFrame
* const p
= (AVFrame
*)&a
->picture
;
476 init_put_bits(&a
->pb
, buf
, buf_size
);
479 p
->pict_type
= FF_I_TYPE
;
482 for(mb_y
=0; mb_y
<a
->mb_height2
; mb_y
++){
483 for(mb_x
=0; mb_x
<a
->mb_width2
; mb_x
++){
484 dct_get(a
, mb_x
, mb_y
);
485 encode_mb(a
, a
->block
);
489 if(a
->mb_width2
!= a
->mb_width
){
491 for(mb_y
=0; mb_y
<a
->mb_height2
; mb_y
++){
492 dct_get(a
, mb_x
, mb_y
);
493 encode_mb(a
, a
->block
);
497 if(a
->mb_height2
!= a
->mb_height
){
499 for(mb_x
=0; mb_x
<a
->mb_width
; mb_x
++){
500 dct_get(a
, mb_x
, mb_y
);
501 encode_mb(a
, a
->block
);
506 align_put_bits(&a
->pb
);
507 while(put_bits_count(&a
->pb
)&31)
508 put_bits(&a
->pb
, 8, 0);
510 size
= put_bits_count(&a
->pb
)/32;
512 if(avctx
->codec_id
== CODEC_ID_ASV1
)
513 a
->dsp
.bswap_buf((uint32_t*)buf
, (uint32_t*)buf
, size
);
516 for(i
=0; i
<4*size
; i
++)
517 buf
[i
]= ff_reverse
[ buf
[i
] ];
522 #endif /* CONFIG_ENCODERS */
524 static av_cold
void common_init(AVCodecContext
*avctx
){
525 ASV1Context
* const a
= avctx
->priv_data
;
527 dsputil_init(&a
->dsp
, avctx
);
529 a
->mb_width
= (avctx
->width
+ 15) / 16;
530 a
->mb_height
= (avctx
->height
+ 15) / 16;
531 a
->mb_width2
= (avctx
->width
+ 0) / 16;
532 a
->mb_height2
= (avctx
->height
+ 0) / 16;
534 avctx
->coded_frame
= (AVFrame
*)&a
->picture
;
538 static av_cold
int decode_init(AVCodecContext
*avctx
){
539 ASV1Context
* const a
= avctx
->priv_data
;
540 AVFrame
*p
= (AVFrame
*)&a
->picture
;
542 const int scale
= avctx
->codec_id
== CODEC_ID_ASV1
? 1 : 2;
546 ff_init_scantable(a
->dsp
.idct_permutation
, &a
->scantable
, scantab
);
547 avctx
->pix_fmt
= PIX_FMT_YUV420P
;
549 a
->inv_qscale
= ((uint8_t*)avctx
->extradata
)[0];
550 if(a
->inv_qscale
== 0){
551 av_log(avctx
, AV_LOG_ERROR
, "illegal qscale 0\n");
552 if(avctx
->codec_id
== CODEC_ID_ASV1
)
559 int index
= scantab
[i
];
561 a
->intra_matrix
[i
]= 64*scale
*ff_mpeg1_default_intra_matrix
[index
] / a
->inv_qscale
;
564 p
->qstride
= a
->mb_width
;
565 p
->qscale_table
= av_malloc( p
->qstride
* a
->mb_height
);
566 p
->quality
= (32*scale
+ a
->inv_qscale
/2)/a
->inv_qscale
;
567 memset(p
->qscale_table
, p
->quality
, p
->qstride
*a
->mb_height
);
572 #ifdef CONFIG_ENCODERS
573 static av_cold
int encode_init(AVCodecContext
*avctx
){
574 ASV1Context
* const a
= avctx
->priv_data
;
576 const int scale
= avctx
->codec_id
== CODEC_ID_ASV1
? 1 : 2;
580 if(avctx
->global_quality
== 0) avctx
->global_quality
= 4*FF_QUALITY_SCALE
;
582 a
->inv_qscale
= (32*scale
*FF_QUALITY_SCALE
+ avctx
->global_quality
/2) / avctx
->global_quality
;
584 avctx
->extradata
= av_mallocz(8);
585 avctx
->extradata_size
=8;
586 ((uint32_t*)avctx
->extradata
)[0]= le2me_32(a
->inv_qscale
);
587 ((uint32_t*)avctx
->extradata
)[1]= le2me_32(ff_get_fourcc("ASUS"));
590 int q
= 32*scale
*ff_mpeg1_default_intra_matrix
[i
];
591 a
->q_intra_matrix
[i
]= ((a
->inv_qscale
<<16) + q
/2) / q
;
598 static av_cold
int decode_end(AVCodecContext
*avctx
){
599 ASV1Context
* const a
= avctx
->priv_data
;
601 av_freep(&a
->bitstream_buffer
);
602 av_freep(&a
->picture
.qscale_table
);
603 a
->bitstream_buffer_size
=0;
608 AVCodec asv1_decoder
= {
618 .long_name
= "ASUS V1",
621 AVCodec asv2_decoder
= {
631 .long_name
= "ASUS V2",
634 #ifdef CONFIG_ENCODERS
636 AVCodec asv1_encoder
= {
644 .pix_fmts
= (enum PixelFormat
[]){PIX_FMT_YUV420P
, PIX_FMT_NONE
},
645 .long_name
= "ASUS V1",
648 AVCodec asv2_encoder
= {
656 .pix_fmts
= (enum PixelFormat
[]){PIX_FMT_YUV420P
, PIX_FMT_NONE
},
657 .long_name
= "ASUS V2",
660 #endif //CONFIG_ENCODERS