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
23 * @file libavcodec/asv1.c
31 #include "mpeg12data.h"
37 #define ASV2_LEVEL_VLC_BITS 10
39 typedef struct ASV1Context
{
40 AVCodecContext
*avctx
;
51 DECLARE_ALIGNED_16(DCTELEM
, block
[6][64]);
52 uint16_t intra_matrix
[64];
53 int q_intra_matrix
[64];
54 uint8_t *bitstream_buffer
;
55 unsigned int bitstream_buffer_size
;
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,
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,
70 static const uint8_t ccp_tab
[17][2]={
71 {0x2,2}, {0x7,5}, {0xB,5}, {0x3,5},
72 {0xD,5}, {0x5,5}, {0x9,5}, {0x1,5},
73 {0xE,5}, {0x6,5}, {0xA,5}, {0x2,5},
74 {0xC,5}, {0x4,5}, {0x8,5}, {0x3,2},
78 static const uint8_t level_tab
[7][2]={
79 {3,4}, {3,3}, {3,2}, {0,3}, {2,2}, {2,3}, {2,4}
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},
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},
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},
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},
112 static VLC level_vlc
;
113 static VLC dc_ccp_vlc
;
114 static VLC ac_ccp_vlc
;
115 static VLC asv2_level_vlc
;
117 static av_cold
void init_vlcs(ASV1Context
*a
){
123 INIT_VLC_STATIC(&ccp_vlc
, VLC_BITS
, 17,
124 &ccp_tab
[0][1], 2, 1,
125 &ccp_tab
[0][0], 2, 1, 64);
126 INIT_VLC_STATIC(&dc_ccp_vlc
, VLC_BITS
, 8,
127 &dc_ccp_tab
[0][1], 2, 1,
128 &dc_ccp_tab
[0][0], 2, 1, 64);
129 INIT_VLC_STATIC(&ac_ccp_vlc
, VLC_BITS
, 16,
130 &ac_ccp_tab
[0][1], 2, 1,
131 &ac_ccp_tab
[0][0], 2, 1, 64);
132 INIT_VLC_STATIC(&level_vlc
, VLC_BITS
, 7,
133 &level_tab
[0][1], 2, 1,
134 &level_tab
[0][0], 2, 1, 64);
135 INIT_VLC_STATIC(&asv2_level_vlc
, ASV2_LEVEL_VLC_BITS
, 63,
136 &asv2_level_tab
[0][1], 2, 1,
137 &asv2_level_tab
[0][0], 2, 1, 1024);
141 //FIXME write a reversed bitstream reader to avoid the double reverse
142 static inline int asv2_get_bits(GetBitContext
*gb
, int n
){
143 return ff_reverse
[ get_bits(gb
, n
) << (8-n
) ];
146 static inline void asv2_put_bits(PutBitContext
*pb
, int n
, int v
){
147 put_bits(pb
, n
, ff_reverse
[ v
<< (8-n
) ]);
150 static inline int asv1_get_level(GetBitContext
*gb
){
151 int code
= get_vlc2(gb
, level_vlc
.table
, VLC_BITS
, 1);
153 if(code
==3) return get_sbits(gb
, 8);
154 else return code
- 3;
157 static inline int asv2_get_level(GetBitContext
*gb
){
158 int code
= get_vlc2(gb
, asv2_level_vlc
.table
, ASV2_LEVEL_VLC_BITS
, 1);
160 if(code
==31) return (int8_t)asv2_get_bits(gb
, 8);
161 else return code
- 31;
164 static inline void asv1_put_level(PutBitContext
*pb
, int level
){
165 unsigned int index
= level
+ 3;
167 if(index
<= 6) put_bits(pb
, level_tab
[index
][1], level_tab
[index
][0]);
169 put_bits(pb
, level_tab
[3][1], level_tab
[3][0]);
170 put_sbits(pb
, 8, level
);
174 static inline void asv2_put_level(PutBitContext
*pb
, int level
){
175 unsigned int index
= level
+ 31;
177 if(index
<= 62) put_bits(pb
, asv2_level_tab
[index
][1], asv2_level_tab
[index
][0]);
179 put_bits(pb
, asv2_level_tab
[31][1], asv2_level_tab
[31][0]);
180 asv2_put_bits(pb
, 8, level
&0xFF);
184 static inline int asv1_decode_block(ASV1Context
*a
, DCTELEM block
[64]){
187 block
[0]= 8*get_bits(&a
->gb
, 8);
190 const int ccp
= get_vlc2(&a
->gb
, ccp_vlc
.table
, VLC_BITS
, 1);
194 if(ccp
< 0 || i
>=10){
195 av_log(a
->avctx
, AV_LOG_ERROR
, "coded coeff pattern damaged\n");
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;
209 static inline int asv2_decode_block(ASV1Context
*a
, DCTELEM block
[64]){
212 count
= asv2_get_bits(&a
->gb
, 4);
214 block
[0]= 8*asv2_get_bits(&a
->gb
, 8);
216 ccp
= get_vlc2(&a
->gb
, dc_ccp_vlc
.table
, VLC_BITS
, 1);
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;
223 for(i
=1; i
<count
+1; i
++){
224 const int ccp
= get_vlc2(&a
->gb
, ac_ccp_vlc
.table
, VLC_BITS
, 1);
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;
237 static inline void asv1_encode_block(ASV1Context
*a
, DCTELEM block
[64]){
241 put_bits(&a
->pb
, 8, (block
[0] + 32)>>6);
245 const int index
= scantab
[4*i
];
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;
254 for(;nc_count
; nc_count
--)
255 put_bits(&a
->pb
, ccp_tab
[0][1], ccp_tab
[0][0]);
257 put_bits(&a
->pb
, ccp_tab
[ccp
][1], ccp_tab
[ccp
][0]);
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]);
267 put_bits(&a
->pb
, ccp_tab
[16][1], ccp_tab
[16][0]);
270 static inline void asv2_encode_block(ASV1Context
*a
, DCTELEM block
[64]){
274 for(count
=63; count
>3; count
--){
275 const int index
= scantab
[count
];
277 if( (block
[index
]*a
->q_intra_matrix
[index
] + (1<<15))>>16 )
283 asv2_put_bits(&a
->pb
, 4, count
);
284 asv2_put_bits(&a
->pb
, 8, (block
[0] + 32)>>6);
287 for(i
=0; i
<=count
; i
++){
288 const int index
= scantab
[4*i
];
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;
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]);
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]);
309 static inline int decode_mb(ASV1Context
*a
, DCTELEM block
[6][64]){
312 a
->dsp
.clear_blocks(block
[0]);
314 if(a
->avctx
->codec_id
== CODEC_ID_ASV1
){
316 if( asv1_decode_block(a
, block
[i
]) < 0)
321 if( asv2_decode_block(a
, block
[i
]) < 0)
328 static inline int encode_mb(ASV1Context
*a
, DCTELEM block
[6][64]){
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");
336 if(a
->avctx
->codec_id
== CODEC_ID_ASV1
){
338 asv1_encode_block(a
, block
[i
]);
341 asv2_encode_block(a
, block
[i
]);
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];
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;
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]);
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]);
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];
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;
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
);
379 a
->dsp
.fdct(block
[i
]);
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]);
385 a
->dsp
.fdct(block
[i
]);
389 static int decode_frame(AVCodecContext
*avctx
,
390 void *data
, int *data_size
,
393 const uint8_t *buf
= avpkt
->data
;
394 int buf_size
= avpkt
->size
;
395 ASV1Context
* const a
= avctx
->priv_data
;
396 AVFrame
*picture
= data
;
397 AVFrame
* const p
= (AVFrame
*)&a
->picture
;
401 avctx
->release_buffer(avctx
, p
);
404 if(avctx
->get_buffer(avctx
, p
) < 0){
405 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
408 p
->pict_type
= FF_I_TYPE
;
411 av_fast_malloc(&a
->bitstream_buffer
, &a
->bitstream_buffer_size
, buf_size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
412 if (!a
->bitstream_buffer
)
413 return AVERROR(ENOMEM
);
415 if(avctx
->codec_id
== CODEC_ID_ASV1
)
416 a
->dsp
.bswap_buf((uint32_t*)a
->bitstream_buffer
, (const uint32_t*)buf
, buf_size
/4);
419 for(i
=0; i
<buf_size
; i
++)
420 a
->bitstream_buffer
[i
]= ff_reverse
[ buf
[i
] ];
423 init_get_bits(&a
->gb
, a
->bitstream_buffer
, buf_size
*8);
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)
430 idct_put(a
, mb_x
, mb_y
);
434 if(a
->mb_width2
!= a
->mb_width
){
436 for(mb_y
=0; mb_y
<a
->mb_height2
; mb_y
++){
437 if( decode_mb(a
, a
->block
) <0)
440 idct_put(a
, mb_x
, mb_y
);
444 if(a
->mb_height2
!= a
->mb_height
){
446 for(mb_x
=0; mb_x
<a
->mb_width
; mb_x
++){
447 if( decode_mb(a
, a
->block
) <0)
450 idct_put(a
, mb_x
, mb_y
);
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
));
460 for(i
=0; i
<s
->avctx
->extradata_size
; i
++){
461 printf("%c\n", ((uint8_t*)s
->avctx
->extradata
)[i
]);
465 *picture
= *(AVFrame
*)&a
->picture
;
466 *data_size
= sizeof(AVPicture
);
470 return (get_bits_count(&a
->gb
)+31)/32*4;
473 #if CONFIG_ASV1_ENCODER || CONFIG_ASV2_ENCODER
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
;
477 AVFrame
* const p
= (AVFrame
*)&a
->picture
;
481 init_put_bits(&a
->pb
, buf
, buf_size
);
484 p
->pict_type
= FF_I_TYPE
;
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
);
494 if(a
->mb_width2
!= a
->mb_width
){
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
);
502 if(a
->mb_height2
!= a
->mb_height
){
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
);
511 align_put_bits(&a
->pb
);
512 while(put_bits_count(&a
->pb
)&31)
513 put_bits(&a
->pb
, 8, 0);
515 size
= put_bits_count(&a
->pb
)/32;
517 if(avctx
->codec_id
== CODEC_ID_ASV1
)
518 a
->dsp
.bswap_buf((uint32_t*)buf
, (uint32_t*)buf
, size
);
521 for(i
=0; i
<4*size
; i
++)
522 buf
[i
]= ff_reverse
[ buf
[i
] ];
527 #endif /* CONFIG_ASV1_ENCODER || CONFIG_ASV2_ENCODER */
529 static av_cold
void common_init(AVCodecContext
*avctx
){
530 ASV1Context
* const a
= avctx
->priv_data
;
532 dsputil_init(&a
->dsp
, avctx
);
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;
539 avctx
->coded_frame
= (AVFrame
*)&a
->picture
;
543 static av_cold
int decode_init(AVCodecContext
*avctx
){
544 ASV1Context
* const a
= avctx
->priv_data
;
545 AVFrame
*p
= (AVFrame
*)&a
->picture
;
547 const int scale
= avctx
->codec_id
== CODEC_ID_ASV1
? 1 : 2;
551 ff_init_scantable(a
->dsp
.idct_permutation
, &a
->scantable
, scantab
);
552 avctx
->pix_fmt
= PIX_FMT_YUV420P
;
554 a
->inv_qscale
= ((uint8_t*)avctx
->extradata
)[0];
555 if(a
->inv_qscale
== 0){
556 av_log(avctx
, AV_LOG_ERROR
, "illegal qscale 0\n");
557 if(avctx
->codec_id
== CODEC_ID_ASV1
)
564 int index
= scantab
[i
];
566 a
->intra_matrix
[i
]= 64*scale
*ff_mpeg1_default_intra_matrix
[index
] / a
->inv_qscale
;
569 p
->qstride
= a
->mb_width
;
570 p
->qscale_table
= av_malloc( p
->qstride
* a
->mb_height
);
571 p
->quality
= (32*scale
+ a
->inv_qscale
/2)/a
->inv_qscale
;
572 memset(p
->qscale_table
, p
->quality
, p
->qstride
*a
->mb_height
);
577 #if CONFIG_ASV1_ENCODER || CONFIG_ASV2_ENCODER
578 static av_cold
int encode_init(AVCodecContext
*avctx
){
579 ASV1Context
* const a
= avctx
->priv_data
;
581 const int scale
= avctx
->codec_id
== CODEC_ID_ASV1
? 1 : 2;
585 if(avctx
->global_quality
== 0) avctx
->global_quality
= 4*FF_QUALITY_SCALE
;
587 a
->inv_qscale
= (32*scale
*FF_QUALITY_SCALE
+ avctx
->global_quality
/2) / avctx
->global_quality
;
589 avctx
->extradata
= av_mallocz(8);
590 avctx
->extradata_size
=8;
591 ((uint32_t*)avctx
->extradata
)[0]= le2me_32(a
->inv_qscale
);
592 ((uint32_t*)avctx
->extradata
)[1]= le2me_32(AV_RL32("ASUS"));
595 int q
= 32*scale
*ff_mpeg1_default_intra_matrix
[i
];
596 a
->q_intra_matrix
[i
]= ((a
->inv_qscale
<<16) + q
/2) / q
;
601 #endif /* CONFIG_ASV1_ENCODER || CONFIG_ASV2_ENCODER */
603 static av_cold
int decode_end(AVCodecContext
*avctx
){
604 ASV1Context
* const a
= avctx
->priv_data
;
606 av_freep(&a
->bitstream_buffer
);
607 av_freep(&a
->picture
.qscale_table
);
608 a
->bitstream_buffer_size
=0;
613 AVCodec asv1_decoder
= {
623 .long_name
= NULL_IF_CONFIG_SMALL("ASUS V1"),
626 AVCodec asv2_decoder
= {
636 .long_name
= NULL_IF_CONFIG_SMALL("ASUS V2"),
639 #if CONFIG_ASV1_ENCODER
640 AVCodec asv1_encoder
= {
648 .pix_fmts
= (const enum PixelFormat
[]){PIX_FMT_YUV420P
, PIX_FMT_NONE
},
649 .long_name
= NULL_IF_CONFIG_SMALL("ASUS V1"),
653 #if CONFIG_ASV2_ENCODER
654 AVCodec asv2_encoder
= {
662 .pix_fmts
= (const enum PixelFormat
[]){PIX_FMT_YUV420P
, PIX_FMT_NONE
},
663 .long_name
= NULL_IF_CONFIG_SMALL("ASUS V2"),