annotate asv1.c @ 2918:13dcd22f0816 libavcodec

Add DTS_INC to the CFLAGS for DTS. This is only set by external configure programs (such as the MPlayer one) and thus somewhat hackish. We already do this for things like MLIB_INC and IPP_INC so it should be acceptable.
author diego
date Sun, 23 Oct 2005 18:16:53 +0000
parents 659b92488061
children ef2149182f1c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
1 /*
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
2 * ASUS V1/V2 codec
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
3 * Copyright (c) 2003 Michael Niedermayer
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
4 *
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
9 *
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
13 * Lesser General Public License for more details.
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
14 *
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
18 */
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
19
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
20 /**
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
21 * @file asv1.c
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
22 * ASUS V1/V2 codec.
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
23 */
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
24
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
25 #include "avcodec.h"
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
26 #include "dsputil.h"
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
27 #include "mpegvideo.h"
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
28
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
29 //#undef NDEBUG
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
30 //#include <assert.h>
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
31
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
32 #define VLC_BITS 6
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
33 #define ASV2_LEVEL_VLC_BITS 10
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
34
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
35 typedef struct ASV1Context{
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
36 AVCodecContext *avctx;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
37 DSPContext dsp;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
38 AVFrame picture;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
39 PutBitContext pb;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
40 GetBitContext gb;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
41 ScanTable scantable;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
42 int inv_qscale;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
43 int mb_width;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
44 int mb_height;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
45 int mb_width2;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
46 int mb_height2;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
47 DCTELEM __align8 block[6][64];
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
48 uint16_t __align8 intra_matrix[64];
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
49 int __align8 q_intra_matrix[64];
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
50 uint8_t *bitstream_buffer;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
51 int bitstream_buffer_size;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
52 } ASV1Context;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
53
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
54 static const uint8_t scantab[64]={
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
55 0x00,0x08,0x01,0x09,0x10,0x18,0x11,0x19,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
56 0x02,0x0A,0x03,0x0B,0x12,0x1A,0x13,0x1B,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
57 0x04,0x0C,0x05,0x0D,0x20,0x28,0x21,0x29,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
58 0x06,0x0E,0x07,0x0F,0x14,0x1C,0x15,0x1D,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
59 0x22,0x2A,0x23,0x2B,0x30,0x38,0x31,0x39,
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
60 0x16,0x1E,0x17,0x1F,0x24,0x2C,0x25,0x2D,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
61 0x32,0x3A,0x33,0x3B,0x26,0x2E,0x27,0x2F,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
62 0x34,0x3C,0x35,0x3D,0x36,0x3E,0x37,0x3F,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
63 };
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
64
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
65
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
66 static const uint8_t ccp_tab[17][2]={
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
67 {0x2,2}, {0x7,5}, {0xB,5}, {0x3,5},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
68 {0xD,5}, {0x5,5}, {0x9,5}, {0x1,5},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
69 {0xE,5}, {0x6,5}, {0xA,5}, {0x2,5},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
70 {0xC,5}, {0x4,5}, {0x8,5}, {0x3,2},
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
71 {0xF,5}, //EOB
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
72 };
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
73
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
74 static const uint8_t level_tab[7][2]={
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
75 {3,4}, {3,3}, {3,2}, {0,3}, {2,2}, {2,3}, {2,4}
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
76 };
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
77
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
78 static const uint8_t dc_ccp_tab[8][2]={
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
79 {0x1,2}, {0xD,4}, {0xF,4}, {0xC,4},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
80 {0x5,3}, {0xE,4}, {0x4,3}, {0x0,2},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
81 };
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
82
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
83 static const uint8_t ac_ccp_tab[16][2]={
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
84 {0x00,2}, {0x3B,6}, {0x0A,4}, {0x3A,6},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
85 {0x02,3}, {0x39,6}, {0x3C,6}, {0x38,6},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
86 {0x03,3}, {0x3D,6}, {0x08,4}, {0x1F,5},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
87 {0x09,4}, {0x0B,4}, {0x0D,4}, {0x0C,4},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
88 };
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
89
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
90 static const uint8_t asv2_level_tab[63][2]={
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
91 {0x3F,10},{0x2F,10},{0x37,10},{0x27,10},{0x3B,10},{0x2B,10},{0x33,10},{0x23,10},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
92 {0x3D,10},{0x2D,10},{0x35,10},{0x25,10},{0x39,10},{0x29,10},{0x31,10},{0x21,10},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
93 {0x1F, 8},{0x17, 8},{0x1B, 8},{0x13, 8},{0x1D, 8},{0x15, 8},{0x19, 8},{0x11, 8},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
94 {0x0F, 6},{0x0B, 6},{0x0D, 6},{0x09, 6},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
95 {0x07, 4},{0x05, 4},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
96 {0x03, 2},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
97 {0x00, 5},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
98 {0x02, 2},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
99 {0x04, 4},{0x06, 4},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
100 {0x08, 6},{0x0C, 6},{0x0A, 6},{0x0E, 6},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
101 {0x10, 8},{0x18, 8},{0x14, 8},{0x1C, 8},{0x12, 8},{0x1A, 8},{0x16, 8},{0x1E, 8},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
102 {0x20,10},{0x30,10},{0x28,10},{0x38,10},{0x24,10},{0x34,10},{0x2C,10},{0x3C,10},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
103 {0x22,10},{0x32,10},{0x2A,10},{0x3A,10},{0x26,10},{0x36,10},{0x2E,10},{0x3E,10},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
104 };
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
105
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
106
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
107 static VLC ccp_vlc;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
108 static VLC level_vlc;
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
109 static VLC dc_ccp_vlc;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
110 static VLC ac_ccp_vlc;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
111 static VLC asv2_level_vlc;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
112
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
113 static void init_vlcs(ASV1Context *a){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
114 static int done = 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
115
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
116 if (!done) {
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
117 done = 1;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
118
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
119 init_vlc(&ccp_vlc, VLC_BITS, 17,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
120 &ccp_tab[0][1], 2, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2028
diff changeset
121 &ccp_tab[0][0], 2, 1, 1);
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
122 init_vlc(&dc_ccp_vlc, VLC_BITS, 8,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
123 &dc_ccp_tab[0][1], 2, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2028
diff changeset
124 &dc_ccp_tab[0][0], 2, 1, 1);
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
125 init_vlc(&ac_ccp_vlc, VLC_BITS, 16,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
126 &ac_ccp_tab[0][1], 2, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2028
diff changeset
127 &ac_ccp_tab[0][0], 2, 1, 1);
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
128 init_vlc(&level_vlc, VLC_BITS, 7,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
129 &level_tab[0][1], 2, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2028
diff changeset
130 &level_tab[0][0], 2, 1, 1);
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
131 init_vlc(&asv2_level_vlc, ASV2_LEVEL_VLC_BITS, 63,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
132 &asv2_level_tab[0][1], 2, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2028
diff changeset
133 &asv2_level_tab[0][0], 2, 1, 1);
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
134 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
135 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
136
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
137 //FIXME write a reversed bitstream reader to avoid the double reverse
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
138 static inline int asv2_get_bits(GetBitContext *gb, int n){
2578
91e094c9dcdc make reverse[] non static
michael
parents: 2453
diff changeset
139 return ff_reverse[ get_bits(gb, n) << (8-n) ];
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
140 }
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
141
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
142 static inline void asv2_put_bits(PutBitContext *pb, int n, int v){
2578
91e094c9dcdc make reverse[] non static
michael
parents: 2453
diff changeset
143 put_bits(pb, n, ff_reverse[ v << (8-n) ]);
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
144 }
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
145
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
146 static inline int asv1_get_level(GetBitContext *gb){
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
147 int code= get_vlc2(gb, level_vlc.table, VLC_BITS, 1);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
148
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
149 if(code==3) return get_sbits(gb, 8);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
150 else return code - 3;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
151 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
152
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
153 static inline int asv2_get_level(GetBitContext *gb){
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
154 int code= get_vlc2(gb, asv2_level_vlc.table, ASV2_LEVEL_VLC_BITS, 1);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
155
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
156 if(code==31) return (int8_t)asv2_get_bits(gb, 8);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
157 else return code - 31;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
158 }
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
159
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
160 static inline void asv1_put_level(PutBitContext *pb, int level){
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
161 unsigned int index= level + 3;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
162
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
163 if(index <= 6) put_bits(pb, level_tab[index][1], level_tab[index][0]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
164 else{
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
165 put_bits(pb, level_tab[3][1], level_tab[3][0]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
166 put_bits(pb, 8, level&0xFF);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
167 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
168 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
169
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
170 static inline void asv2_put_level(PutBitContext *pb, int level){
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
171 unsigned int index= level + 31;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
172
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
173 if(index <= 62) put_bits(pb, asv2_level_tab[index][1], asv2_level_tab[index][0]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
174 else{
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
175 put_bits(pb, asv2_level_tab[31][1], asv2_level_tab[31][0]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
176 asv2_put_bits(pb, 8, level&0xFF);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
177 }
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
178 }
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
179
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
180 static inline int asv1_decode_block(ASV1Context *a, DCTELEM block[64]){
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
181 int i;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
182
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
183 block[0]= 8*get_bits(&a->gb, 8);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
184
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
185 for(i=0; i<11; i++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
186 const int ccp= get_vlc2(&a->gb, ccp_vlc.table, VLC_BITS, 1);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
187
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
188 if(ccp){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
189 if(ccp == 16) break;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
190 if(ccp < 0 || i>=10){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1522
diff changeset
191 av_log(a->avctx, AV_LOG_ERROR, "coded coeff pattern damaged\n");
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
192 return -1;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
193 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
194
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
195 if(ccp&8) block[a->scantable.permutated[4*i+0]]= (asv1_get_level(&a->gb) * a->intra_matrix[4*i+0])>>4;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
196 if(ccp&4) block[a->scantable.permutated[4*i+1]]= (asv1_get_level(&a->gb) * a->intra_matrix[4*i+1])>>4;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
197 if(ccp&2) block[a->scantable.permutated[4*i+2]]= (asv1_get_level(&a->gb) * a->intra_matrix[4*i+2])>>4;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
198 if(ccp&1) block[a->scantable.permutated[4*i+3]]= (asv1_get_level(&a->gb) * a->intra_matrix[4*i+3])>>4;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
199 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
200 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
201
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
202 return 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
203 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
204
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
205 static inline int asv2_decode_block(ASV1Context *a, DCTELEM block[64]){
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
206 int i, count, ccp;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
207
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
208 count= asv2_get_bits(&a->gb, 4);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
209
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
210 block[0]= 8*asv2_get_bits(&a->gb, 8);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
211
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
212 ccp= get_vlc2(&a->gb, dc_ccp_vlc.table, VLC_BITS, 1);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
213 if(ccp){
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
214 if(ccp&4) block[a->scantable.permutated[1]]= (asv2_get_level(&a->gb) * a->intra_matrix[1])>>4;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
215 if(ccp&2) block[a->scantable.permutated[2]]= (asv2_get_level(&a->gb) * a->intra_matrix[2])>>4;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
216 if(ccp&1) block[a->scantable.permutated[3]]= (asv2_get_level(&a->gb) * a->intra_matrix[3])>>4;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
217 }
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
218
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
219 for(i=1; i<count+1; i++){
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
220 const int ccp= get_vlc2(&a->gb, ac_ccp_vlc.table, VLC_BITS, 1);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
221
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
222 if(ccp){
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
223 if(ccp&8) block[a->scantable.permutated[4*i+0]]= (asv2_get_level(&a->gb) * a->intra_matrix[4*i+0])>>4;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
224 if(ccp&4) block[a->scantable.permutated[4*i+1]]= (asv2_get_level(&a->gb) * a->intra_matrix[4*i+1])>>4;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
225 if(ccp&2) block[a->scantable.permutated[4*i+2]]= (asv2_get_level(&a->gb) * a->intra_matrix[4*i+2])>>4;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
226 if(ccp&1) block[a->scantable.permutated[4*i+3]]= (asv2_get_level(&a->gb) * a->intra_matrix[4*i+3])>>4;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
227 }
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
228 }
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
229
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
230 return 0;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
231 }
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
232
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
233 static inline void asv1_encode_block(ASV1Context *a, DCTELEM block[64]){
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
234 int i;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
235 int nc_count=0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
236
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
237 put_bits(&a->pb, 8, (block[0] + 32)>>6);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
238 block[0]= 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
239
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
240 for(i=0; i<10; i++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
241 const int index= scantab[4*i];
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
242 int ccp=0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
243
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
244 if( (block[index + 0] = (block[index + 0]*a->q_intra_matrix[index + 0] + (1<<15))>>16) ) ccp |= 8;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
245 if( (block[index + 8] = (block[index + 8]*a->q_intra_matrix[index + 8] + (1<<15))>>16) ) ccp |= 4;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
246 if( (block[index + 1] = (block[index + 1]*a->q_intra_matrix[index + 1] + (1<<15))>>16) ) ccp |= 2;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
247 if( (block[index + 9] = (block[index + 9]*a->q_intra_matrix[index + 9] + (1<<15))>>16) ) ccp |= 1;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
248
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
249 if(ccp){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
250 for(;nc_count; nc_count--)
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
251 put_bits(&a->pb, ccp_tab[0][1], ccp_tab[0][0]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
252
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
253 put_bits(&a->pb, ccp_tab[ccp][1], ccp_tab[ccp][0]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
254
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
255 if(ccp&8) asv1_put_level(&a->pb, block[index + 0]);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
256 if(ccp&4) asv1_put_level(&a->pb, block[index + 8]);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
257 if(ccp&2) asv1_put_level(&a->pb, block[index + 1]);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
258 if(ccp&1) asv1_put_level(&a->pb, block[index + 9]);
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
259 }else{
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
260 nc_count++;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
261 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
262 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
263 put_bits(&a->pb, ccp_tab[16][1], ccp_tab[16][0]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
264 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
265
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
266 static inline void asv2_encode_block(ASV1Context *a, DCTELEM block[64]){
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
267 int i;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
268 int count=0;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
269
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
270 for(count=63; count>3; count--){
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
271 const int index= scantab[count];
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
272
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
273 if( (block[index]*a->q_intra_matrix[index] + (1<<15))>>16 )
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
274 break;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
275 }
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
276
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
277 count >>= 2;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
278
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
279 asv2_put_bits(&a->pb, 4, count);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
280 asv2_put_bits(&a->pb, 8, (block[0] + 32)>>6);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
281 block[0]= 0;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
282
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
283 for(i=0; i<=count; i++){
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
284 const int index= scantab[4*i];
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
285 int ccp=0;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
286
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
287 if( (block[index + 0] = (block[index + 0]*a->q_intra_matrix[index + 0] + (1<<15))>>16) ) ccp |= 8;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
288 if( (block[index + 8] = (block[index + 8]*a->q_intra_matrix[index + 8] + (1<<15))>>16) ) ccp |= 4;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
289 if( (block[index + 1] = (block[index + 1]*a->q_intra_matrix[index + 1] + (1<<15))>>16) ) ccp |= 2;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
290 if( (block[index + 9] = (block[index + 9]*a->q_intra_matrix[index + 9] + (1<<15))>>16) ) ccp |= 1;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
291
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
292 if(i) put_bits(&a->pb, ac_ccp_tab[ccp][1], ac_ccp_tab[ccp][0]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
293 else put_bits(&a->pb, dc_ccp_tab[ccp][1], dc_ccp_tab[ccp][0]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
294
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
295 if(ccp){
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
296 if(ccp&8) asv2_put_level(&a->pb, block[index + 0]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
297 if(ccp&4) asv2_put_level(&a->pb, block[index + 8]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
298 if(ccp&2) asv2_put_level(&a->pb, block[index + 1]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
299 if(ccp&1) asv2_put_level(&a->pb, block[index + 9]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
300 }
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
301 }
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
302 }
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
303
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
304 static inline int decode_mb(ASV1Context *a, DCTELEM block[6][64]){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
305 int i;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
306
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
307 a->dsp.clear_blocks(block[0]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
308
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
309 if(a->avctx->codec_id == CODEC_ID_ASV1){
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
310 for(i=0; i<6; i++){
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
311 if( asv1_decode_block(a, block[i]) < 0)
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
312 return -1;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
313 }
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
314 }else{
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
315 for(i=0; i<6; i++){
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
316 if( asv2_decode_block(a, block[i]) < 0)
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
317 return -1;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
318 }
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
319 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
320 return 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
321 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
322
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
323 static inline int encode_mb(ASV1Context *a, DCTELEM block[6][64]){
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
324 int i;
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
325
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
326 if(a->pb.buf_end - a->pb.buf - (put_bits_count(&a->pb)>>3) < 30*16*16*3/2/8){
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
327 av_log(a->avctx, AV_LOG_ERROR, "encoded frame too large\n");
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
328 return -1;
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
329 }
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
330
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
331 if(a->avctx->codec_id == CODEC_ID_ASV1){
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
332 for(i=0; i<6; i++)
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
333 asv1_encode_block(a, block[i]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
334 }else{
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
335 for(i=0; i<6; i++)
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
336 asv2_encode_block(a, block[i]);
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
337 }
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
338 return 0;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
339 }
1274
95061e8c5ea9 CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents: 1273
diff changeset
340
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
341 static inline void idct_put(ASV1Context *a, int mb_x, int mb_y){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
342 DCTELEM (*block)[64]= a->block;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
343 int linesize= a->picture.linesize[0];
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
344
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
345 uint8_t *dest_y = a->picture.data[0] + (mb_y * 16* linesize ) + mb_x * 16;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
346 uint8_t *dest_cb = a->picture.data[1] + (mb_y * 8 * a->picture.linesize[1]) + mb_x * 8;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
347 uint8_t *dest_cr = a->picture.data[2] + (mb_y * 8 * a->picture.linesize[2]) + mb_x * 8;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
348
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
349 a->dsp.idct_put(dest_y , linesize, block[0]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
350 a->dsp.idct_put(dest_y + 8, linesize, block[1]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
351 a->dsp.idct_put(dest_y + 8*linesize , linesize, block[2]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
352 a->dsp.idct_put(dest_y + 8*linesize + 8, linesize, block[3]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
353
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
354 if(!(a->avctx->flags&CODEC_FLAG_GRAY)){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
355 a->dsp.idct_put(dest_cb, a->picture.linesize[1], block[4]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
356 a->dsp.idct_put(dest_cr, a->picture.linesize[2], block[5]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
357 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
358 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
359
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
360 static inline void dct_get(ASV1Context *a, int mb_x, int mb_y){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
361 DCTELEM (*block)[64]= a->block;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
362 int linesize= a->picture.linesize[0];
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
363 int i;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
364
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
365 uint8_t *ptr_y = a->picture.data[0] + (mb_y * 16* linesize ) + mb_x * 16;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
366 uint8_t *ptr_cb = a->picture.data[1] + (mb_y * 8 * a->picture.linesize[1]) + mb_x * 8;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
367 uint8_t *ptr_cr = a->picture.data[2] + (mb_y * 8 * a->picture.linesize[2]) + mb_x * 8;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
368
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
369 a->dsp.get_pixels(block[0], ptr_y , linesize);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
370 a->dsp.get_pixels(block[1], ptr_y + 8, linesize);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
371 a->dsp.get_pixels(block[2], ptr_y + 8*linesize , linesize);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
372 a->dsp.get_pixels(block[3], ptr_y + 8*linesize + 8, linesize);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
373 for(i=0; i<4; i++)
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
374 a->dsp.fdct(block[i]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
375
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
376 if(!(a->avctx->flags&CODEC_FLAG_GRAY)){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
377 a->dsp.get_pixels(block[4], ptr_cb, a->picture.linesize[1]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
378 a->dsp.get_pixels(block[5], ptr_cr, a->picture.linesize[2]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
379 for(i=4; i<6; i++)
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
380 a->dsp.fdct(block[i]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
381 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
382 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
383
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
384 static int decode_frame(AVCodecContext *avctx,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
385 void *data, int *data_size,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
386 uint8_t *buf, int buf_size)
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
387 {
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
388 ASV1Context * const a = avctx->priv_data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
389 AVFrame *picture = data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
390 AVFrame * const p= (AVFrame*)&a->picture;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
391 int mb_x, mb_y;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
392
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
393 if(p->data[0])
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
394 avctx->release_buffer(avctx, p);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
395
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
396 p->reference= 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
397 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
398 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
399 return -1;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
400 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
401 p->pict_type= I_TYPE;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
402 p->key_frame= 1;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
403
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
404 a->bitstream_buffer= av_fast_realloc(a->bitstream_buffer, &a->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
405
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
406 if(avctx->codec_id == CODEC_ID_ASV1)
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
407 a->dsp.bswap_buf((uint32_t*)a->bitstream_buffer, (uint32_t*)buf, buf_size/4);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
408 else{
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
409 int i;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
410 for(i=0; i<buf_size; i++)
2578
91e094c9dcdc make reverse[] non static
michael
parents: 2453
diff changeset
411 a->bitstream_buffer[i]= ff_reverse[ buf[i] ];
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
412 }
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
413
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
414 init_get_bits(&a->gb, a->bitstream_buffer, buf_size*8);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
415
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
416 for(mb_y=0; mb_y<a->mb_height2; mb_y++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
417 for(mb_x=0; mb_x<a->mb_width2; mb_x++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
418 if( decode_mb(a, a->block) <0)
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
419 return -1;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
420
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
421 idct_put(a, mb_x, mb_y);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
422 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
423 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
424
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
425 if(a->mb_width2 != a->mb_width){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
426 mb_x= a->mb_width2;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
427 for(mb_y=0; mb_y<a->mb_height2; mb_y++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
428 if( decode_mb(a, a->block) <0)
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
429 return -1;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
430
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
431 idct_put(a, mb_x, mb_y);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
432 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
433 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
434
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
435 if(a->mb_height2 != a->mb_height){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
436 mb_y= a->mb_height2;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
437 for(mb_x=0; mb_x<a->mb_width; mb_x++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
438 if( decode_mb(a, a->block) <0)
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
439 return -1;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
440
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
441 idct_put(a, mb_x, mb_y);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
442 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
443 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
444 #if 0
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
445 int i;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
446 printf("%d %d\n", 8*buf_size, get_bits_count(&a->gb));
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
447 for(i=get_bits_count(&a->gb); i<8*buf_size; i++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
448 printf("%d", get_bits1(&a->gb));
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
449 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
450
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
451 for(i=0; i<s->avctx->extradata_size; i++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
452 printf("%c\n", ((uint8_t*)s->avctx->extradata)[i]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
453 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
454 #endif
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
455
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
456 *picture= *(AVFrame*)&a->picture;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
457 *data_size = sizeof(AVPicture);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
458
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
459 emms_c();
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
460
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
461 return (get_bits_count(&a->gb)+31)/32*4;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
462 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
463
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
464 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
465 ASV1Context * const a = avctx->priv_data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
466 AVFrame *pict = data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
467 AVFrame * const p= (AVFrame*)&a->picture;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
468 int size;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
469 int mb_x, mb_y;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
470
1522
79dddc5cd990 removed the obsolete and unused parameters of init_put_bits
alex
parents: 1434
diff changeset
471 init_put_bits(&a->pb, buf, buf_size);
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
472
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
473 *p = *pict;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
474 p->pict_type= I_TYPE;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
475 p->key_frame= 1;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
476
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
477 for(mb_y=0; mb_y<a->mb_height2; mb_y++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
478 for(mb_x=0; mb_x<a->mb_width2; mb_x++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
479 dct_get(a, mb_x, mb_y);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
480 encode_mb(a, a->block);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
481 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
482 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
483
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
484 if(a->mb_width2 != a->mb_width){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
485 mb_x= a->mb_width2;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
486 for(mb_y=0; mb_y<a->mb_height2; mb_y++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
487 dct_get(a, mb_x, mb_y);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
488 encode_mb(a, a->block);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
489 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
490 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
491
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
492 if(a->mb_height2 != a->mb_height){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
493 mb_y= a->mb_height2;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
494 for(mb_x=0; mb_x<a->mb_width; mb_x++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
495 dct_get(a, mb_x, mb_y);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
496 encode_mb(a, a->block);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
497 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
498 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
499 emms_c();
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
500
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
501 align_put_bits(&a->pb);
1786
b7340afa261a get_bit_count -> put_bits_count
alex
parents: 1598
diff changeset
502 while(put_bits_count(&a->pb)&31)
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
503 put_bits(&a->pb, 8, 0);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
504
1786
b7340afa261a get_bit_count -> put_bits_count
alex
parents: 1598
diff changeset
505 size= put_bits_count(&a->pb)/32;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
506
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
507 if(avctx->codec_id == CODEC_ID_ASV1)
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
508 a->dsp.bswap_buf((uint32_t*)buf, (uint32_t*)buf, size);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
509 else{
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
510 int i;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
511 for(i=0; i<4*size; i++)
2578
91e094c9dcdc make reverse[] non static
michael
parents: 2453
diff changeset
512 buf[i]= ff_reverse[ buf[i] ];
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
513 }
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
514
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
515 return size*4;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
516 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
517
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
518 static void common_init(AVCodecContext *avctx){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
519 ASV1Context * const a = avctx->priv_data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
520
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
521 dsputil_init(&a->dsp, avctx);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
522
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
523 a->mb_width = (avctx->width + 15) / 16;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
524 a->mb_height = (avctx->height + 15) / 16;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
525 a->mb_width2 = (avctx->width + 0) / 16;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
526 a->mb_height2 = (avctx->height + 0) / 16;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
527
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
528 avctx->coded_frame= (AVFrame*)&a->picture;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
529 a->avctx= avctx;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
530 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
531
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
532 static int decode_init(AVCodecContext *avctx){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
533 ASV1Context * const a = avctx->priv_data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
534 AVFrame *p= (AVFrame*)&a->picture;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
535 int i;
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
536 const int scale= avctx->codec_id == CODEC_ID_ASV1 ? 1 : 2;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
537
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
538 common_init(avctx);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
539 init_vlcs(a);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
540 ff_init_scantable(a->dsp.idct_permutation, &a->scantable, scantab);
2635
eaa57c3336fc PIX_FMT_NONE and related fixes
michael
parents: 2578
diff changeset
541 avctx->pix_fmt= PIX_FMT_YUV420P;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
542
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
543 a->inv_qscale= ((uint8_t*)avctx->extradata)[0];
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
544 if(a->inv_qscale == 0){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1522
diff changeset
545 av_log(avctx, AV_LOG_ERROR, "illegal qscale 0\n");
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
546 if(avctx->codec_id == CODEC_ID_ASV1)
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
547 a->inv_qscale= 6;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
548 else
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
549 a->inv_qscale= 10;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
550 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
551
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
552 for(i=0; i<64; i++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
553 int index= scantab[i];
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
554
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
555 a->intra_matrix[i]= 64*scale*ff_mpeg1_default_intra_matrix[index] / a->inv_qscale;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
556 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
557
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
558 p->qstride= a->mb_width;
2426
1ee03f2a6cd5 av_malloc vs av_mallocz patch by (Kurosu <kurosu inforezo org>)
michael
parents: 2422
diff changeset
559 p->qscale_table= av_malloc( p->qstride * a->mb_height);
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
560 p->quality= (32*scale + a->inv_qscale/2)/a->inv_qscale;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
561 memset(p->qscale_table, p->quality, p->qstride*a->mb_height);
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
562
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
563 return 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
564 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
565
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
566 static int encode_init(AVCodecContext *avctx){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
567 ASV1Context * const a = avctx->priv_data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
568 int i;
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
569 const int scale= avctx->codec_id == CODEC_ID_ASV1 ? 1 : 2;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
570
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
571 common_init(avctx);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
572
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
573 if(avctx->global_quality == 0) avctx->global_quality= 4*FF_QUALITY_SCALE;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
574
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
575 a->inv_qscale= (32*scale*FF_QUALITY_SCALE + avctx->global_quality/2) / avctx->global_quality;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
576
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
577 avctx->extradata= av_mallocz(8);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
578 avctx->extradata_size=8;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
579 ((uint32_t*)avctx->extradata)[0]= le2me_32(a->inv_qscale);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
580 ((uint32_t*)avctx->extradata)[1]= le2me_32(ff_get_fourcc("ASUS"));
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
581
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
582 for(i=0; i<64; i++){
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
583 int q= 32*scale*ff_mpeg1_default_intra_matrix[i];
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
584 a->q_intra_matrix[i]= ((a->inv_qscale<<16) + q/2) / q;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
585 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
586
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
587 return 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
588 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
589
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
590 static int decode_end(AVCodecContext *avctx){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
591 ASV1Context * const a = avctx->priv_data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
592
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
593 av_freep(&a->bitstream_buffer);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
594 av_freep(&a->picture.qscale_table);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
595 a->bitstream_buffer_size=0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
596
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
597 return 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
598 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
599
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
600 AVCodec asv1_decoder = {
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
601 "asv1",
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
602 CODEC_TYPE_VIDEO,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
603 CODEC_ID_ASV1,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
604 sizeof(ASV1Context),
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
605 decode_init,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
606 NULL,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
607 decode_end,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
608 decode_frame,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
609 CODEC_CAP_DR1,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
610 };
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
611
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
612 AVCodec asv2_decoder = {
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
613 "asv2",
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
614 CODEC_TYPE_VIDEO,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
615 CODEC_ID_ASV2,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
616 sizeof(ASV1Context),
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
617 decode_init,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
618 NULL,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
619 decode_end,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
620 decode_frame,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
621 CODEC_CAP_DR1,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
622 };
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
623
1274
95061e8c5ea9 CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents: 1273
diff changeset
624 #ifdef CONFIG_ENCODERS
95061e8c5ea9 CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents: 1273
diff changeset
625
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
626 AVCodec asv1_encoder = {
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
627 "asv1",
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
628 CODEC_TYPE_VIDEO,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
629 CODEC_ID_ASV1,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
630 sizeof(ASV1Context),
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
631 encode_init,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
632 encode_frame,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
633 //encode_end,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
634 };
1274
95061e8c5ea9 CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents: 1273
diff changeset
635
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
636 AVCodec asv2_encoder = {
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
637 "asv2",
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
638 CODEC_TYPE_VIDEO,
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
639 CODEC_ID_ASV2,
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
640 sizeof(ASV1Context),
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
641 encode_init,
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
642 encode_frame,
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
643 //encode_end,
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
644 };
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
645
1274
95061e8c5ea9 CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents: 1273
diff changeset
646 #endif //CONFIG_ENCODERS