annotate asv1.c @ 3198:6b9f0c4fbdbe libavcodec

First part of a series of speed-enchancing patches. This one sets up a snow.h and makes snow use the dsputil function pointer framework to access the three functions that will be implemented in asm in the other parts of the patchset. Patch by Robert Edele < yartrebo AH earthlink POIS net> Original thread: Subject: [Ffmpeg-devel] [PATCH] Snow mmx+sse2 asm optimizations Date: Sun, 05 Feb 2006 12:47:14 -0500
author gpoirier
date Thu, 16 Mar 2006 19:18:18 +0000
parents 8e00b10aeb0a
children 0082fb8c77b6
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
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2967
diff changeset
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
18 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
19
1273
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 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
24
1273
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
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
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;
3089
072dbc669253 MSVC-compatible __align8/__align16 declaration
diego
parents: 3066
diff changeset
47 DECLARE_ALIGNED_8(DCTELEM, block[6][64]);
072dbc669253 MSVC-compatible __align8/__align16 declaration
diego
parents: 3066
diff changeset
48 DECLARE_ALIGNED_8(uint16_t, intra_matrix[64]);
072dbc669253 MSVC-compatible __align8/__align16 declaration
diego
parents: 3066
diff changeset
49 DECLARE_ALIGNED_8(int, q_intra_matrix[64]);
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
50 uint8_t *bitstream_buffer;
3066
04b924f8f5a5 warning fixes by Luca Abeni, lucabe72 ##@## email ##.## it
diego
parents: 3036
diff changeset
51 unsigned int bitstream_buffer_size;
1273
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},
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
69 {0xE,5}, {0x6,5}, {0xA,5}, {0x2,5},
1433
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
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
119 init_vlc(&ccp_vlc, VLC_BITS, 17,
1273
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);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
122 init_vlc(&dc_ccp_vlc, VLC_BITS, 8,
1433
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);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
125 init_vlc(&ac_ccp_vlc, VLC_BITS, 16,
1433
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);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
128 init_vlc(&level_vlc, VLC_BITS, 7,
1273
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);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
131 init_vlc(&asv2_level_vlc, ASV2_LEVEL_VLC_BITS, 63,
1433
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);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
184
1273
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);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
209
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
210 block[0]= 8*asv2_get_bits(&a->gb, 8);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
211
1433
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 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
229
1433
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;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
236
1273
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;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
239
1273
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){
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
250 for(;nc_count; nc_count--)
1273
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]);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
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;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
269
1434
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
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
273 if( (block[index]*a->q_intra_matrix[index] + (1<<15))>>16 )
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
274 break;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
275 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
276
1434
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;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
282
1434
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
3183
8e00b10aeb0a add assert to clarify that we know what we are doing
michael
parents: 3089
diff changeset
292 assert(i || ccp<8);
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
293 if(i) put_bits(&a->pb, ac_ccp_tab[ccp][1], ac_ccp_tab[ccp][0]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
294 else put_bits(&a->pb, dc_ccp_tab[ccp][1], dc_ccp_tab[ccp][0]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
295
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
296 if(ccp){
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
297 if(ccp&8) asv2_put_level(&a->pb, block[index + 0]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
298 if(ccp&4) asv2_put_level(&a->pb, block[index + 8]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
299 if(ccp&2) asv2_put_level(&a->pb, block[index + 1]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
300 if(ccp&1) asv2_put_level(&a->pb, block[index + 9]);
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 }
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
304
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
305 static inline int decode_mb(ASV1Context *a, DCTELEM block[6][64]){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
306 int i;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
307
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
308 a->dsp.clear_blocks(block[0]);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
309
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
310 if(a->avctx->codec_id == CODEC_ID_ASV1){
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
311 for(i=0; i<6; i++){
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
312 if( asv1_decode_block(a, block[i]) < 0)
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
313 return -1;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
314 }
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
315 }else{
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
316 for(i=0; i<6; i++){
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
317 if( asv2_decode_block(a, block[i]) < 0)
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
318 return -1;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
319 }
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
320 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
321 return 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
322 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
323
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
324 static inline int encode_mb(ASV1Context *a, DCTELEM block[6][64]){
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
325 int i;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
326
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
327 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
328 av_log(a->avctx, AV_LOG_ERROR, "encoded frame too large\n");
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
329 return -1;
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
330 }
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
331
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
332 if(a->avctx->codec_id == CODEC_ID_ASV1){
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
333 for(i=0; i<6; i++)
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
334 asv1_encode_block(a, block[i]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
335 }else{
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
336 for(i=0; i<6; i++)
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
337 asv2_encode_block(a, block[i]);
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
338 }
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
339 return 0;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
340 }
1274
95061e8c5ea9 CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents: 1273
diff changeset
341
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
342 static inline void idct_put(ASV1Context *a, int mb_x, int mb_y){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
343 DCTELEM (*block)[64]= a->block;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
344 int linesize= a->picture.linesize[0];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
345
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
346 uint8_t *dest_y = a->picture.data[0] + (mb_y * 16* linesize ) + mb_x * 16;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
347 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
348 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
349
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
350 a->dsp.idct_put(dest_y , linesize, block[0]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
351 a->dsp.idct_put(dest_y + 8, linesize, block[1]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
352 a->dsp.idct_put(dest_y + 8*linesize , linesize, block[2]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
353 a->dsp.idct_put(dest_y + 8*linesize + 8, linesize, block[3]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
354
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
355 if(!(a->avctx->flags&CODEC_FLAG_GRAY)){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
356 a->dsp.idct_put(dest_cb, a->picture.linesize[1], block[4]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
357 a->dsp.idct_put(dest_cr, a->picture.linesize[2], block[5]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
358 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
359 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
360
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
361 static inline void dct_get(ASV1Context *a, int mb_x, int mb_y){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
362 DCTELEM (*block)[64]= a->block;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
363 int linesize= a->picture.linesize[0];
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
364 int i;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
365
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
366 uint8_t *ptr_y = a->picture.data[0] + (mb_y * 16* linesize ) + mb_x * 16;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
367 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
368 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
369
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
370 a->dsp.get_pixels(block[0], ptr_y , linesize);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
371 a->dsp.get_pixels(block[1], ptr_y + 8, linesize);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
372 a->dsp.get_pixels(block[2], ptr_y + 8*linesize , linesize);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
373 a->dsp.get_pixels(block[3], ptr_y + 8*linesize + 8, linesize);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
374 for(i=0; i<4; i++)
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
375 a->dsp.fdct(block[i]);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
376
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
377 if(!(a->avctx->flags&CODEC_FLAG_GRAY)){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
378 a->dsp.get_pixels(block[4], ptr_cb, a->picture.linesize[1]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
379 a->dsp.get_pixels(block[5], ptr_cr, a->picture.linesize[2]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
380 for(i=4; i<6; i++)
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
381 a->dsp.fdct(block[i]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
382 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
383 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
384
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
385 static int decode_frame(AVCodecContext *avctx,
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
386 void *data, int *data_size,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
387 uint8_t *buf, int buf_size)
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
388 {
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
389 ASV1Context * const a = avctx->priv_data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
390 AVFrame *picture = data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
391 AVFrame * const p= (AVFrame*)&a->picture;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
392 int mb_x, mb_y;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
393
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
394 if(p->data[0])
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
395 avctx->release_buffer(avctx, p);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
396
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
397 p->reference= 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
398 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
399 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
400 return -1;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
401 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
402 p->pict_type= I_TYPE;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
403 p->key_frame= 1;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
404
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
405 a->bitstream_buffer= av_fast_realloc(a->bitstream_buffer, &a->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
406
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
407 if(avctx->codec_id == CODEC_ID_ASV1)
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
408 a->dsp.bswap_buf((uint32_t*)a->bitstream_buffer, (uint32_t*)buf, buf_size/4);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
409 else{
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
410 int i;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
411 for(i=0; i<buf_size; i++)
2578
91e094c9dcdc make reverse[] non static
michael
parents: 2453
diff changeset
412 a->bitstream_buffer[i]= ff_reverse[ buf[i] ];
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
413 }
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
414
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
415 init_get_bits(&a->gb, a->bitstream_buffer, buf_size*8);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
416
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
417 for(mb_y=0; mb_y<a->mb_height2; mb_y++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
418 for(mb_x=0; mb_x<a->mb_width2; mb_x++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
419 if( decode_mb(a, a->block) <0)
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
420 return -1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
421
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
422 idct_put(a, mb_x, mb_y);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
423 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
424 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
425
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
426 if(a->mb_width2 != a->mb_width){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
427 mb_x= a->mb_width2;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
428 for(mb_y=0; mb_y<a->mb_height2; mb_y++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
429 if( decode_mb(a, a->block) <0)
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
430 return -1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
431
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
432 idct_put(a, mb_x, mb_y);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
433 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
434 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
435
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
436 if(a->mb_height2 != a->mb_height){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
437 mb_y= a->mb_height2;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
438 for(mb_x=0; mb_x<a->mb_width; mb_x++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
439 if( decode_mb(a, a->block) <0)
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
440 return -1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
441
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
442 idct_put(a, mb_x, mb_y);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
443 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
444 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
445 #if 0
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
446 int i;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
447 printf("%d %d\n", 8*buf_size, get_bits_count(&a->gb));
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
448 for(i=get_bits_count(&a->gb); i<8*buf_size; i++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
449 printf("%d", get_bits1(&a->gb));
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
450 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
451
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
452 for(i=0; i<s->avctx->extradata_size; i++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
453 printf("%c\n", ((uint8_t*)s->avctx->extradata)[i]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
454 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
455 #endif
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
456
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
457 *picture= *(AVFrame*)&a->picture;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
458 *data_size = sizeof(AVPicture);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
459
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
460 emms_c();
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
461
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
462 return (get_bits_count(&a->gb)+31)/32*4;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
463 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
464
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
465 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
466 ASV1Context * const a = avctx->priv_data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
467 AVFrame *pict = data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
468 AVFrame * const p= (AVFrame*)&a->picture;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
469 int size;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
470 int mb_x, mb_y;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
471
1522
79dddc5cd990 removed the obsolete and unused parameters of init_put_bits
alex
parents: 1434
diff changeset
472 init_put_bits(&a->pb, buf, buf_size);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
473
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
474 *p = *pict;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
475 p->pict_type= I_TYPE;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
476 p->key_frame= 1;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
477
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
478 for(mb_y=0; mb_y<a->mb_height2; mb_y++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
479 for(mb_x=0; mb_x<a->mb_width2; mb_x++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
480 dct_get(a, mb_x, mb_y);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
481 encode_mb(a, a->block);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
482 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
483 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
484
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
485 if(a->mb_width2 != a->mb_width){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
486 mb_x= a->mb_width2;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
487 for(mb_y=0; mb_y<a->mb_height2; mb_y++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
488 dct_get(a, mb_x, mb_y);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
489 encode_mb(a, a->block);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
490 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
491 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
492
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
493 if(a->mb_height2 != a->mb_height){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
494 mb_y= a->mb_height2;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
495 for(mb_x=0; mb_x<a->mb_width; mb_x++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
496 dct_get(a, mb_x, mb_y);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
497 encode_mb(a, a->block);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
498 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
499 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
500 emms_c();
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
501
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
502 align_put_bits(&a->pb);
1786
b7340afa261a get_bit_count -> put_bits_count
alex
parents: 1598
diff changeset
503 while(put_bits_count(&a->pb)&31)
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
504 put_bits(&a->pb, 8, 0);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
505
1786
b7340afa261a get_bit_count -> put_bits_count
alex
parents: 1598
diff changeset
506 size= put_bits_count(&a->pb)/32;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
507
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
508 if(avctx->codec_id == CODEC_ID_ASV1)
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
509 a->dsp.bswap_buf((uint32_t*)buf, (uint32_t*)buf, size);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
510 else{
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
511 int i;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
512 for(i=0; i<4*size; i++)
2578
91e094c9dcdc make reverse[] non static
michael
parents: 2453
diff changeset
513 buf[i]= ff_reverse[ buf[i] ];
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
514 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
515
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
516 return size*4;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
517 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
518
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
519 static void common_init(AVCodecContext *avctx){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
520 ASV1Context * const a = avctx->priv_data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
521
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
522 dsputil_init(&a->dsp, avctx);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
523
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
524 a->mb_width = (avctx->width + 15) / 16;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
525 a->mb_height = (avctx->height + 15) / 16;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
526 a->mb_width2 = (avctx->width + 0) / 16;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
527 a->mb_height2 = (avctx->height + 0) / 16;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
528
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
529 avctx->coded_frame= (AVFrame*)&a->picture;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
530 a->avctx= avctx;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
531 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
532
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
533 static int decode_init(AVCodecContext *avctx){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
534 ASV1Context * const a = avctx->priv_data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
535 AVFrame *p= (AVFrame*)&a->picture;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
536 int i;
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
537 const int scale= avctx->codec_id == CODEC_ID_ASV1 ? 1 : 2;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
538
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
539 common_init(avctx);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
540 init_vlcs(a);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
541 ff_init_scantable(a->dsp.idct_permutation, &a->scantable, scantab);
2635
eaa57c3336fc PIX_FMT_NONE and related fixes
michael
parents: 2578
diff changeset
542 avctx->pix_fmt= PIX_FMT_YUV420P;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
543
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
544 a->inv_qscale= ((uint8_t*)avctx->extradata)[0];
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
545 if(a->inv_qscale == 0){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1522
diff changeset
546 av_log(avctx, AV_LOG_ERROR, "illegal qscale 0\n");
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
547 if(avctx->codec_id == CODEC_ID_ASV1)
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
548 a->inv_qscale= 6;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
549 else
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
550 a->inv_qscale= 10;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
551 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
552
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
553 for(i=0; i<64; i++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
554 int index= scantab[i];
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
555
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
556 a->intra_matrix[i]= 64*scale*ff_mpeg1_default_intra_matrix[index] / a->inv_qscale;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
557 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
558
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
559 p->qstride= a->mb_width;
2426
1ee03f2a6cd5 av_malloc vs av_mallocz patch by (Kurosu <kurosu inforezo org>)
michael
parents: 2422
diff changeset
560 p->qscale_table= av_malloc( p->qstride * a->mb_height);
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
561 p->quality= (32*scale + a->inv_qscale/2)/a->inv_qscale;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
562 memset(p->qscale_table, p->quality, p->qstride*a->mb_height);
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
563
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
564 return 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
565 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
566
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
567 static int encode_init(AVCodecContext *avctx){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
568 ASV1Context * const a = avctx->priv_data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
569 int i;
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
570 const int scale= avctx->codec_id == CODEC_ID_ASV1 ? 1 : 2;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
571
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
572 common_init(avctx);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
573
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
574 if(avctx->global_quality == 0) avctx->global_quality= 4*FF_QUALITY_SCALE;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
575
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
576 a->inv_qscale= (32*scale*FF_QUALITY_SCALE + avctx->global_quality/2) / avctx->global_quality;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
577
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
578 avctx->extradata= av_mallocz(8);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
579 avctx->extradata_size=8;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
580 ((uint32_t*)avctx->extradata)[0]= le2me_32(a->inv_qscale);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
581 ((uint32_t*)avctx->extradata)[1]= le2me_32(ff_get_fourcc("ASUS"));
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
582
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
583 for(i=0; i<64; i++){
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
584 int q= 32*scale*ff_mpeg1_default_intra_matrix[i];
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
585 a->q_intra_matrix[i]= ((a->inv_qscale<<16) + q/2) / q;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
586 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
587
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
588 return 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
589 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
590
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
591 static int decode_end(AVCodecContext *avctx){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
592 ASV1Context * const a = avctx->priv_data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
593
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
594 av_freep(&a->bitstream_buffer);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
595 av_freep(&a->picture.qscale_table);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
596 a->bitstream_buffer_size=0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2652
diff changeset
597
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
598 return 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
599 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
600
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
601 AVCodec asv1_decoder = {
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
602 "asv1",
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
603 CODEC_TYPE_VIDEO,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
604 CODEC_ID_ASV1,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
605 sizeof(ASV1Context),
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
606 decode_init,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
607 NULL,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
608 decode_end,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
609 decode_frame,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
610 CODEC_CAP_DR1,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
611 };
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
612
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
613 AVCodec asv2_decoder = {
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
614 "asv2",
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
615 CODEC_TYPE_VIDEO,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
616 CODEC_ID_ASV2,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
617 sizeof(ASV1Context),
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
618 decode_init,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
619 NULL,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
620 decode_end,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
621 decode_frame,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
622 CODEC_CAP_DR1,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
623 };
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
624
1274
95061e8c5ea9 CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents: 1273
diff changeset
625 #ifdef CONFIG_ENCODERS
95061e8c5ea9 CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents: 1273
diff changeset
626
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
627 AVCodec asv1_encoder = {
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
628 "asv1",
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
629 CODEC_TYPE_VIDEO,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
630 CODEC_ID_ASV1,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
631 sizeof(ASV1Context),
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
632 encode_init,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
633 encode_frame,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
634 //encode_end,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
635 };
1274
95061e8c5ea9 CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents: 1273
diff changeset
636
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
637 AVCodec asv2_encoder = {
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
638 "asv2",
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
639 CODEC_TYPE_VIDEO,
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
640 CODEC_ID_ASV2,
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
641 sizeof(ASV1Context),
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
642 encode_init,
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
643 encode_frame,
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
644 //encode_end,
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
645 };
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
646
1274
95061e8c5ea9 CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents: 1273
diff changeset
647 #endif //CONFIG_ENCODERS