annotate asv1.c @ 5319:40af705cef7e libavcodec

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