annotate asv1.c @ 2497:69adfbbdcdeb libavcodec

- samples from mplayer ftp in the "adv" profile seem to have profile=2, which isn't the advanced one; and indeed, using adv. profile parser fails. Using normal parser works, and that's what is done - attempt at taking care of stride for NORM2 bitplane decoding - duplication of much code from msmpeg4.c; this code isn't yet used, but goes down as far as the block layer (mainly Transform Type stuff, the remains are wild editing without checking). Unusable yet, and lacks the AC decoding (but a step further in bitstream parsing) patch by anonymous
author michael
date Fri, 04 Feb 2005 02:20:38 +0000
parents f67b63ed036d
children 91e094c9dcdc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
1 /*
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
2 * ASUS V1/V2 codec
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
3 * Copyright (c) 2003 Michael Niedermayer
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
4 *
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
9 *
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
13 * Lesser General Public License for more details.
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
14 *
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
18 */
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
19
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
20 /**
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
21 * @file asv1.c
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
22 * ASUS V1/V2 codec.
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
23 */
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
24
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
25 #include "avcodec.h"
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
26 #include "dsputil.h"
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
27 #include "mpegvideo.h"
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
28
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
29 //#undef NDEBUG
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
30 //#include <assert.h>
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
31
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
32 #define VLC_BITS 6
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
33 #define ASV2_LEVEL_VLC_BITS 10
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
34
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
35 typedef struct ASV1Context{
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
36 AVCodecContext *avctx;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
37 DSPContext dsp;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
38 AVFrame picture;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
39 PutBitContext pb;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
40 GetBitContext gb;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
41 ScanTable scantable;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
42 int inv_qscale;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
43 int mb_width;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
44 int mb_height;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
45 int mb_width2;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
46 int mb_height2;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
47 DCTELEM __align8 block[6][64];
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
48 uint16_t __align8 intra_matrix[64];
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
49 int __align8 q_intra_matrix[64];
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
50 uint8_t *bitstream_buffer;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
51 int bitstream_buffer_size;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
52 } ASV1Context;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
53
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
54 static const uint8_t scantab[64]={
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
55 0x00,0x08,0x01,0x09,0x10,0x18,0x11,0x19,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
56 0x02,0x0A,0x03,0x0B,0x12,0x1A,0x13,0x1B,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
57 0x04,0x0C,0x05,0x0D,0x20,0x28,0x21,0x29,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
58 0x06,0x0E,0x07,0x0F,0x14,0x1C,0x15,0x1D,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
59 0x22,0x2A,0x23,0x2B,0x30,0x38,0x31,0x39,
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
60 0x16,0x1E,0x17,0x1F,0x24,0x2C,0x25,0x2D,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
61 0x32,0x3A,0x33,0x3B,0x26,0x2E,0x27,0x2F,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
62 0x34,0x3C,0x35,0x3D,0x36,0x3E,0x37,0x3F,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
63 };
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
64
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
65
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
66 static const uint8_t reverse[256]={
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
67 0x00,0x80,0x40,0xC0,0x20,0xA0,0x60,0xE0,0x10,0x90,0x50,0xD0,0x30,0xB0,0x70,0xF0,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
68 0x08,0x88,0x48,0xC8,0x28,0xA8,0x68,0xE8,0x18,0x98,0x58,0xD8,0x38,0xB8,0x78,0xF8,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
69 0x04,0x84,0x44,0xC4,0x24,0xA4,0x64,0xE4,0x14,0x94,0x54,0xD4,0x34,0xB4,0x74,0xF4,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
70 0x0C,0x8C,0x4C,0xCC,0x2C,0xAC,0x6C,0xEC,0x1C,0x9C,0x5C,0xDC,0x3C,0xBC,0x7C,0xFC,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
71 0x02,0x82,0x42,0xC2,0x22,0xA2,0x62,0xE2,0x12,0x92,0x52,0xD2,0x32,0xB2,0x72,0xF2,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
72 0x0A,0x8A,0x4A,0xCA,0x2A,0xAA,0x6A,0xEA,0x1A,0x9A,0x5A,0xDA,0x3A,0xBA,0x7A,0xFA,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
73 0x06,0x86,0x46,0xC6,0x26,0xA6,0x66,0xE6,0x16,0x96,0x56,0xD6,0x36,0xB6,0x76,0xF6,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
74 0x0E,0x8E,0x4E,0xCE,0x2E,0xAE,0x6E,0xEE,0x1E,0x9E,0x5E,0xDE,0x3E,0xBE,0x7E,0xFE,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
75 0x01,0x81,0x41,0xC1,0x21,0xA1,0x61,0xE1,0x11,0x91,0x51,0xD1,0x31,0xB1,0x71,0xF1,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
76 0x09,0x89,0x49,0xC9,0x29,0xA9,0x69,0xE9,0x19,0x99,0x59,0xD9,0x39,0xB9,0x79,0xF9,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
77 0x05,0x85,0x45,0xC5,0x25,0xA5,0x65,0xE5,0x15,0x95,0x55,0xD5,0x35,0xB5,0x75,0xF5,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
78 0x0D,0x8D,0x4D,0xCD,0x2D,0xAD,0x6D,0xED,0x1D,0x9D,0x5D,0xDD,0x3D,0xBD,0x7D,0xFD,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
79 0x03,0x83,0x43,0xC3,0x23,0xA3,0x63,0xE3,0x13,0x93,0x53,0xD3,0x33,0xB3,0x73,0xF3,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
80 0x0B,0x8B,0x4B,0xCB,0x2B,0xAB,0x6B,0xEB,0x1B,0x9B,0x5B,0xDB,0x3B,0xBB,0x7B,0xFB,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
81 0x07,0x87,0x47,0xC7,0x27,0xA7,0x67,0xE7,0x17,0x97,0x57,0xD7,0x37,0xB7,0x77,0xF7,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
82 0x0F,0x8F,0x4F,0xCF,0x2F,0xAF,0x6F,0xEF,0x1F,0x9F,0x5F,0xDF,0x3F,0xBF,0x7F,0xFF,
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
83 };
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
84
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
85 static const uint8_t ccp_tab[17][2]={
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
86 {0x2,2}, {0x7,5}, {0xB,5}, {0x3,5},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
87 {0xD,5}, {0x5,5}, {0x9,5}, {0x1,5},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
88 {0xE,5}, {0x6,5}, {0xA,5}, {0x2,5},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
89 {0xC,5}, {0x4,5}, {0x8,5}, {0x3,2},
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
90 {0xF,5}, //EOB
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
91 };
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
92
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
93 static const uint8_t level_tab[7][2]={
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
94 {3,4}, {3,3}, {3,2}, {0,3}, {2,2}, {2,3}, {2,4}
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
95 };
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
96
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
97 static const uint8_t dc_ccp_tab[8][2]={
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
98 {0x1,2}, {0xD,4}, {0xF,4}, {0xC,4},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
99 {0x5,3}, {0xE,4}, {0x4,3}, {0x0,2},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
100 };
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
101
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
102 static const uint8_t ac_ccp_tab[16][2]={
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
103 {0x00,2}, {0x3B,6}, {0x0A,4}, {0x3A,6},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
104 {0x02,3}, {0x39,6}, {0x3C,6}, {0x38,6},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
105 {0x03,3}, {0x3D,6}, {0x08,4}, {0x1F,5},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
106 {0x09,4}, {0x0B,4}, {0x0D,4}, {0x0C,4},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
107 };
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
108
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
109 static const uint8_t asv2_level_tab[63][2]={
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
110 {0x3F,10},{0x2F,10},{0x37,10},{0x27,10},{0x3B,10},{0x2B,10},{0x33,10},{0x23,10},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
111 {0x3D,10},{0x2D,10},{0x35,10},{0x25,10},{0x39,10},{0x29,10},{0x31,10},{0x21,10},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
112 {0x1F, 8},{0x17, 8},{0x1B, 8},{0x13, 8},{0x1D, 8},{0x15, 8},{0x19, 8},{0x11, 8},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
113 {0x0F, 6},{0x0B, 6},{0x0D, 6},{0x09, 6},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
114 {0x07, 4},{0x05, 4},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
115 {0x03, 2},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
116 {0x00, 5},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
117 {0x02, 2},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
118 {0x04, 4},{0x06, 4},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
119 {0x08, 6},{0x0C, 6},{0x0A, 6},{0x0E, 6},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
120 {0x10, 8},{0x18, 8},{0x14, 8},{0x1C, 8},{0x12, 8},{0x1A, 8},{0x16, 8},{0x1E, 8},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
121 {0x20,10},{0x30,10},{0x28,10},{0x38,10},{0x24,10},{0x34,10},{0x2C,10},{0x3C,10},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
122 {0x22,10},{0x32,10},{0x2A,10},{0x3A,10},{0x26,10},{0x36,10},{0x2E,10},{0x3E,10},
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
123 };
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
124
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
125
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
126 static VLC ccp_vlc;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
127 static VLC level_vlc;
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
128 static VLC dc_ccp_vlc;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
129 static VLC ac_ccp_vlc;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
130 static VLC asv2_level_vlc;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
131
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
132 static void init_vlcs(ASV1Context *a){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
133 static int done = 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
134
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
135 if (!done) {
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
136 done = 1;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
137
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
138 init_vlc(&ccp_vlc, VLC_BITS, 17,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
139 &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
140 &ccp_tab[0][0], 2, 1, 1);
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
141 init_vlc(&dc_ccp_vlc, VLC_BITS, 8,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
142 &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
143 &dc_ccp_tab[0][0], 2, 1, 1);
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
144 init_vlc(&ac_ccp_vlc, VLC_BITS, 16,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
145 &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
146 &ac_ccp_tab[0][0], 2, 1, 1);
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
147 init_vlc(&level_vlc, VLC_BITS, 7,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
148 &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
149 &level_tab[0][0], 2, 1, 1);
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
150 init_vlc(&asv2_level_vlc, ASV2_LEVEL_VLC_BITS, 63,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
151 &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
152 &asv2_level_tab[0][0], 2, 1, 1);
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
153 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
154 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
155
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
156 //FIXME write a reversed bitstream reader to avoid the double reverse
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
157 static inline int asv2_get_bits(GetBitContext *gb, int n){
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
158 return reverse[ get_bits(gb, n) << (8-n) ];
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
159 }
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
160
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
161 static inline void asv2_put_bits(PutBitContext *pb, int n, int v){
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
162 put_bits(pb, n, reverse[ v << (8-n) ]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
163 }
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
164
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
165 static inline int asv1_get_level(GetBitContext *gb){
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
166 int code= get_vlc2(gb, level_vlc.table, VLC_BITS, 1);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
167
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
168 if(code==3) return get_sbits(gb, 8);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
169 else return code - 3;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
170 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
171
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
172 static inline int asv2_get_level(GetBitContext *gb){
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
173 int code= get_vlc2(gb, asv2_level_vlc.table, ASV2_LEVEL_VLC_BITS, 1);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
174
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
175 if(code==31) return (int8_t)asv2_get_bits(gb, 8);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
176 else return code - 31;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
177 }
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
178
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
179 static inline void asv1_put_level(PutBitContext *pb, int level){
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
180 unsigned int index= level + 3;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
181
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
182 if(index <= 6) put_bits(pb, level_tab[index][1], level_tab[index][0]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
183 else{
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
184 put_bits(pb, level_tab[3][1], level_tab[3][0]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
185 put_bits(pb, 8, level&0xFF);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
186 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
187 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
188
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
189 static inline void asv2_put_level(PutBitContext *pb, int level){
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
190 unsigned int index= level + 31;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
191
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
192 if(index <= 62) put_bits(pb, asv2_level_tab[index][1], asv2_level_tab[index][0]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
193 else{
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
194 put_bits(pb, asv2_level_tab[31][1], asv2_level_tab[31][0]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
195 asv2_put_bits(pb, 8, level&0xFF);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
196 }
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
197 }
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
198
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
199 static inline int asv1_decode_block(ASV1Context *a, DCTELEM block[64]){
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
200 int i;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
201
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
202 block[0]= 8*get_bits(&a->gb, 8);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
203
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
204 for(i=0; i<11; i++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
205 const int ccp= get_vlc2(&a->gb, ccp_vlc.table, VLC_BITS, 1);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
206
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
207 if(ccp){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
208 if(ccp == 16) break;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
209 if(ccp < 0 || i>=10){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1522
diff changeset
210 av_log(a->avctx, AV_LOG_ERROR, "coded coeff pattern damaged\n");
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
211 return -1;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
212 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
213
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
214 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
215 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
216 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
217 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
218 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
219 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
220
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
221 return 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
222 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
223
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
224 static inline int asv2_decode_block(ASV1Context *a, DCTELEM block[64]){
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
225 int i, count, ccp;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
226
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
227 count= asv2_get_bits(&a->gb, 4);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
228
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
229 block[0]= 8*asv2_get_bits(&a->gb, 8);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
230
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
231 ccp= get_vlc2(&a->gb, dc_ccp_vlc.table, VLC_BITS, 1);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
232 if(ccp){
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
233 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
234 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
235 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
236 }
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
237
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
238 for(i=1; i<count+1; i++){
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
239 const int ccp= get_vlc2(&a->gb, ac_ccp_vlc.table, VLC_BITS, 1);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
240
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
241 if(ccp){
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
242 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
243 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
244 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
245 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
246 }
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
247 }
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
248
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
249 return 0;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
250 }
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
251
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
252 static inline void asv1_encode_block(ASV1Context *a, DCTELEM block[64]){
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
253 int i;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
254 int nc_count=0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
255
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
256 put_bits(&a->pb, 8, (block[0] + 32)>>6);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
257 block[0]= 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
258
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
259 for(i=0; i<10; i++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
260 const int index= scantab[4*i];
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
261 int ccp=0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
262
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
263 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
264 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
265 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
266 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
267
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
268 if(ccp){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
269 for(;nc_count; nc_count--)
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
270 put_bits(&a->pb, ccp_tab[0][1], ccp_tab[0][0]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
271
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
272 put_bits(&a->pb, ccp_tab[ccp][1], ccp_tab[ccp][0]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
273
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
274 if(ccp&8) asv1_put_level(&a->pb, block[index + 0]);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
275 if(ccp&4) asv1_put_level(&a->pb, block[index + 8]);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
276 if(ccp&2) asv1_put_level(&a->pb, block[index + 1]);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
277 if(ccp&1) asv1_put_level(&a->pb, block[index + 9]);
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
278 }else{
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
279 nc_count++;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
280 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
281 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
282 put_bits(&a->pb, ccp_tab[16][1], ccp_tab[16][0]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
283 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
284
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
285 static inline void asv2_encode_block(ASV1Context *a, DCTELEM block[64]){
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
286 int i;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
287 int count=0;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
288
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
289 for(count=63; count>3; count--){
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
290 const int index= scantab[count];
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
291
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
292 if( (block[index]*a->q_intra_matrix[index] + (1<<15))>>16 )
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
293 break;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
294 }
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
295
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
296 count >>= 2;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
297
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
298 asv2_put_bits(&a->pb, 4, count);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
299 asv2_put_bits(&a->pb, 8, (block[0] + 32)>>6);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
300 block[0]= 0;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
301
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
302 for(i=0; i<=count; i++){
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
303 const int index= scantab[4*i];
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
304 int ccp=0;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
305
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
306 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
307 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
308 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
309 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
310
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
311 if(i) put_bits(&a->pb, ac_ccp_tab[ccp][1], ac_ccp_tab[ccp][0]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
312 else put_bits(&a->pb, dc_ccp_tab[ccp][1], dc_ccp_tab[ccp][0]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
313
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
314 if(ccp){
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
315 if(ccp&8) asv2_put_level(&a->pb, block[index + 0]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
316 if(ccp&4) asv2_put_level(&a->pb, block[index + 8]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
317 if(ccp&2) asv2_put_level(&a->pb, block[index + 1]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
318 if(ccp&1) asv2_put_level(&a->pb, block[index + 9]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
319 }
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
320 }
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
321 }
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
322
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
323 static inline int decode_mb(ASV1Context *a, DCTELEM block[6][64]){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
324 int i;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
325
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
326 a->dsp.clear_blocks(block[0]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
327
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
328 if(a->avctx->codec_id == CODEC_ID_ASV1){
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
329 for(i=0; i<6; i++){
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
330 if( asv1_decode_block(a, block[i]) < 0)
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
331 return -1;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
332 }
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
333 }else{
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
334 for(i=0; i<6; i++){
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
335 if( asv2_decode_block(a, block[i]) < 0)
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
336 return -1;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
337 }
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
338 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
339 return 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
340 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
341
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
342 static inline int encode_mb(ASV1Context *a, DCTELEM block[6][64]){
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
343 int i;
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
344
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
345 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
346 av_log(a->avctx, AV_LOG_ERROR, "encoded frame too large\n");
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
347 return -1;
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
348 }
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
349
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
350 if(a->avctx->codec_id == CODEC_ID_ASV1){
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
351 for(i=0; i<6; i++)
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
352 asv1_encode_block(a, block[i]);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
353 }else{
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
354 for(i=0; i<6; i++)
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
355 asv2_encode_block(a, block[i]);
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
356 }
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
357 return 0;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
358 }
1274
95061e8c5ea9 CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents: 1273
diff changeset
359
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
360 static inline void idct_put(ASV1Context *a, int mb_x, int mb_y){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
361 DCTELEM (*block)[64]= a->block;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
362 int linesize= a->picture.linesize[0];
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
363
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
364 uint8_t *dest_y = a->picture.data[0] + (mb_y * 16* linesize ) + mb_x * 16;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
365 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
366 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
367
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
368 a->dsp.idct_put(dest_y , linesize, block[0]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
369 a->dsp.idct_put(dest_y + 8, linesize, block[1]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
370 a->dsp.idct_put(dest_y + 8*linesize , linesize, block[2]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
371 a->dsp.idct_put(dest_y + 8*linesize + 8, linesize, block[3]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
372
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
373 if(!(a->avctx->flags&CODEC_FLAG_GRAY)){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
374 a->dsp.idct_put(dest_cb, a->picture.linesize[1], block[4]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
375 a->dsp.idct_put(dest_cr, a->picture.linesize[2], block[5]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
376 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
377 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
378
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
379 static inline void dct_get(ASV1Context *a, int mb_x, int mb_y){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
380 DCTELEM (*block)[64]= a->block;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
381 int linesize= a->picture.linesize[0];
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
382 int i;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
383
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
384 uint8_t *ptr_y = a->picture.data[0] + (mb_y * 16* linesize ) + mb_x * 16;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
385 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
386 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
387
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
388 a->dsp.get_pixels(block[0], ptr_y , linesize);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
389 a->dsp.get_pixels(block[1], ptr_y + 8, linesize);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
390 a->dsp.get_pixels(block[2], ptr_y + 8*linesize , linesize);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
391 a->dsp.get_pixels(block[3], ptr_y + 8*linesize + 8, linesize);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
392 for(i=0; i<4; i++)
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
393 a->dsp.fdct(block[i]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
394
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
395 if(!(a->avctx->flags&CODEC_FLAG_GRAY)){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
396 a->dsp.get_pixels(block[4], ptr_cb, a->picture.linesize[1]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
397 a->dsp.get_pixels(block[5], ptr_cr, a->picture.linesize[2]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
398 for(i=4; i<6; i++)
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
399 a->dsp.fdct(block[i]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
400 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
401 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
402
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
403 static int decode_frame(AVCodecContext *avctx,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
404 void *data, int *data_size,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
405 uint8_t *buf, int buf_size)
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
406 {
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
407 ASV1Context * const a = avctx->priv_data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
408 AVFrame *picture = data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
409 AVFrame * const p= (AVFrame*)&a->picture;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
410 int mb_x, mb_y;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
411
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
412 if(p->data[0])
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
413 avctx->release_buffer(avctx, p);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
414
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
415 p->reference= 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
416 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
417 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
418 return -1;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
419 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
420 p->pict_type= I_TYPE;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
421 p->key_frame= 1;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
422
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
423 a->bitstream_buffer= av_fast_realloc(a->bitstream_buffer, &a->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
424
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
425 if(avctx->codec_id == CODEC_ID_ASV1)
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
426 a->dsp.bswap_buf((uint32_t*)a->bitstream_buffer, (uint32_t*)buf, buf_size/4);
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
427 else{
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
428 int i;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
429 for(i=0; i<buf_size; i++)
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
430 a->bitstream_buffer[i]= reverse[ buf[i] ];
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
431 }
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
432
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
433 init_get_bits(&a->gb, a->bitstream_buffer, buf_size*8);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
434
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
435 for(mb_y=0; mb_y<a->mb_height2; mb_y++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
436 for(mb_x=0; mb_x<a->mb_width2; mb_x++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
437 if( decode_mb(a, a->block) <0)
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
438 return -1;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
439
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
440 idct_put(a, mb_x, mb_y);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
441 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
442 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
443
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
444 if(a->mb_width2 != a->mb_width){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
445 mb_x= a->mb_width2;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
446 for(mb_y=0; mb_y<a->mb_height2; mb_y++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
447 if( decode_mb(a, a->block) <0)
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
448 return -1;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
449
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
450 idct_put(a, mb_x, mb_y);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
451 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
452 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
453
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
454 if(a->mb_height2 != a->mb_height){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
455 mb_y= a->mb_height2;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
456 for(mb_x=0; mb_x<a->mb_width; mb_x++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
457 if( decode_mb(a, a->block) <0)
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
458 return -1;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
459
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
460 idct_put(a, mb_x, mb_y);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
461 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
462 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
463 #if 0
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
464 int i;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
465 printf("%d %d\n", 8*buf_size, get_bits_count(&a->gb));
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
466 for(i=get_bits_count(&a->gb); i<8*buf_size; i++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
467 printf("%d", get_bits1(&a->gb));
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
468 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
469
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
470 for(i=0; i<s->avctx->extradata_size; i++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
471 printf("%c\n", ((uint8_t*)s->avctx->extradata)[i]);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
472 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
473 #endif
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
474
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
475 *picture= *(AVFrame*)&a->picture;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
476 *data_size = sizeof(AVPicture);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
477
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
478 emms_c();
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
479
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
480 return (get_bits_count(&a->gb)+31)/32*4;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
481 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
482
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
483 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
484 ASV1Context * const a = avctx->priv_data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
485 AVFrame *pict = data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
486 AVFrame * const p= (AVFrame*)&a->picture;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
487 int size;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
488 int mb_x, mb_y;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
489
1522
79dddc5cd990 removed the obsolete and unused parameters of init_put_bits
alex
parents: 1434
diff changeset
490 init_put_bits(&a->pb, buf, buf_size);
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
491
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
492 *p = *pict;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
493 p->pict_type= I_TYPE;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
494 p->key_frame= 1;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
495
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
496 for(mb_y=0; mb_y<a->mb_height2; mb_y++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
497 for(mb_x=0; mb_x<a->mb_width2; mb_x++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
498 dct_get(a, mb_x, mb_y);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
499 encode_mb(a, a->block);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
500 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
501 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
502
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
503 if(a->mb_width2 != a->mb_width){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
504 mb_x= a->mb_width2;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
505 for(mb_y=0; mb_y<a->mb_height2; mb_y++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
506 dct_get(a, mb_x, mb_y);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
507 encode_mb(a, a->block);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
508 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
509 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
510
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
511 if(a->mb_height2 != a->mb_height){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
512 mb_y= a->mb_height2;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
513 for(mb_x=0; mb_x<a->mb_width; mb_x++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
514 dct_get(a, mb_x, mb_y);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
515 encode_mb(a, a->block);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
516 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
517 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
518 emms_c();
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
519
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
520 align_put_bits(&a->pb);
1786
b7340afa261a get_bit_count -> put_bits_count
alex
parents: 1598
diff changeset
521 while(put_bits_count(&a->pb)&31)
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
522 put_bits(&a->pb, 8, 0);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
523
1786
b7340afa261a get_bit_count -> put_bits_count
alex
parents: 1598
diff changeset
524 size= put_bits_count(&a->pb)/32;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
525
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
526 if(avctx->codec_id == CODEC_ID_ASV1)
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
527 a->dsp.bswap_buf((uint32_t*)buf, (uint32_t*)buf, size);
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
528 else{
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
529 int i;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
530 for(i=0; i<4*size; i++)
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
531 buf[i]= reverse[ buf[i] ];
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
532 }
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
533
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
534 return size*4;
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 void common_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
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
540 dsputil_init(&a->dsp, avctx);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
541
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
542 a->mb_width = (avctx->width + 15) / 16;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
543 a->mb_height = (avctx->height + 15) / 16;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
544 a->mb_width2 = (avctx->width + 0) / 16;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
545 a->mb_height2 = (avctx->height + 0) / 16;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
546
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
547 avctx->coded_frame= (AVFrame*)&a->picture;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
548 a->avctx= avctx;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
549 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
550
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
551 static int decode_init(AVCodecContext *avctx){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
552 ASV1Context * const a = avctx->priv_data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
553 AVFrame *p= (AVFrame*)&a->picture;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
554 int i;
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
555 const int scale= avctx->codec_id == CODEC_ID_ASV1 ? 1 : 2;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
556
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
557 common_init(avctx);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
558 init_vlcs(a);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
559 ff_init_scantable(a->dsp.idct_permutation, &a->scantable, scantab);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
560
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
561 a->inv_qscale= ((uint8_t*)avctx->extradata)[0];
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
562 if(a->inv_qscale == 0){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1522
diff changeset
563 av_log(avctx, AV_LOG_ERROR, "illegal qscale 0\n");
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
564 if(avctx->codec_id == CODEC_ID_ASV1)
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
565 a->inv_qscale= 6;
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
566 else
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
567 a->inv_qscale= 10;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
568 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
569
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
570 for(i=0; i<64; i++){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
571 int index= scantab[i];
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
572
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
573 a->intra_matrix[i]= 64*scale*ff_mpeg1_default_intra_matrix[index] / a->inv_qscale;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
574 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
575
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
576 p->qstride= a->mb_width;
2426
1ee03f2a6cd5 av_malloc vs av_mallocz patch by (Kurosu <kurosu inforezo org>)
michael
parents: 2422
diff changeset
577 p->qscale_table= av_malloc( p->qstride * a->mb_height);
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
578 p->quality= (32*scale + a->inv_qscale/2)/a->inv_qscale;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
579 memset(p->qscale_table, p->quality, p->qstride*a->mb_height);
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
580
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
581 return 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
582 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
583
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
584 static int encode_init(AVCodecContext *avctx){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
585 ASV1Context * const a = avctx->priv_data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
586 int i;
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
587 const int scale= avctx->codec_id == CODEC_ID_ASV1 ? 1 : 2;
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
588
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
589 common_init(avctx);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
590
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
591 if(avctx->global_quality == 0) avctx->global_quality= 4*FF_QUALITY_SCALE;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
592
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
593 a->inv_qscale= (32*scale*FF_QUALITY_SCALE + avctx->global_quality/2) / avctx->global_quality;
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
594
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
595 avctx->extradata= av_mallocz(8);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
596 avctx->extradata_size=8;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
597 ((uint32_t*)avctx->extradata)[0]= le2me_32(a->inv_qscale);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
598 ((uint32_t*)avctx->extradata)[1]= le2me_32(ff_get_fourcc("ASUS"));
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
599
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
600 for(i=0; i<64; i++){
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
601 int q= 32*scale*ff_mpeg1_default_intra_matrix[i];
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
602 a->q_intra_matrix[i]= ((a->inv_qscale<<16) + q/2) / q;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
603 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
604
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
605 return 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
606 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
607
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
608 static int decode_end(AVCodecContext *avctx){
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
609 ASV1Context * const a = avctx->priv_data;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
610
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
611 av_freep(&a->bitstream_buffer);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
612 av_freep(&a->picture.qscale_table);
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
613 a->bitstream_buffer_size=0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
614
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
615 return 0;
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
616 }
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
617
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
618 AVCodec asv1_decoder = {
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
619 "asv1",
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
620 CODEC_TYPE_VIDEO,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
621 CODEC_ID_ASV1,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
622 sizeof(ASV1Context),
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
623 decode_init,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
624 NULL,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
625 decode_end,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
626 decode_frame,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
627 CODEC_CAP_DR1,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
628 };
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
629
1433
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
630 AVCodec asv2_decoder = {
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
631 "asv2",
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
632 CODEC_TYPE_VIDEO,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
633 CODEC_ID_ASV2,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
634 sizeof(ASV1Context),
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
635 decode_init,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
636 NULL,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
637 decode_end,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
638 decode_frame,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
639 CODEC_CAP_DR1,
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
640 };
46d3fa8501cd ASV2 decoder
michaelni
parents: 1325
diff changeset
641
1274
95061e8c5ea9 CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents: 1273
diff changeset
642 #ifdef CONFIG_ENCODERS
95061e8c5ea9 CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents: 1273
diff changeset
643
1273
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
644 AVCodec asv1_encoder = {
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
645 "asv1",
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
646 CODEC_TYPE_VIDEO,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
647 CODEC_ID_ASV1,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
648 sizeof(ASV1Context),
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
649 encode_init,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
650 encode_frame,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
651 //encode_end,
a979fab41ed8 ASV1 codec
michaelni
parents:
diff changeset
652 };
1274
95061e8c5ea9 CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents: 1273
diff changeset
653
1434
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
654 AVCodec asv2_encoder = {
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
655 "asv2",
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
656 CODEC_TYPE_VIDEO,
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
657 CODEC_ID_ASV2,
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
658 sizeof(ASV1Context),
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
659 encode_init,
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
660 encode_frame,
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
661 //encode_end,
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
662 };
f98e81331a6f asv2 encoding
michaelni
parents: 1433
diff changeset
663
1274
95061e8c5ea9 CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents: 1273
diff changeset
664 #endif //CONFIG_ENCODERS