annotate 4xm.c @ 5533:8708867078ba libavcodec

use version instead of some random 32bit value to switch between 16 and 32bit versions (this is more reliable, the old code failed on some files)
author michael
date Mon, 13 Aug 2007 00:55:39 +0000
parents f0bee2532ecf
children 1c8999a3f193
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
1 /*
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
2 * 4XM codec
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
3 * Copyright (c) 2003 Michael Niedermayer
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
a918c7d38345 4xm 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: 3776
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
15 * Lesser General Public License for more details.
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
16 *
a918c7d38345 4xm 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: 3776
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
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
20 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
21
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
22 /**
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
23 * @file 4xm.c
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
24 * 4XM codec.
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
25 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
26
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
27 #include "avcodec.h"
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
28 #include "dsputil.h"
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
29 #include "mpegvideo.h"
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
30
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
31 //#undef NDEBUG
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
32 //#include <assert.h>
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
33
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
34 #define BLOCK_TYPE_VLC_BITS 5
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
35 #define ACDC_VLC_BITS 9
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
36
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
37 #define CFRAME_BUFFER_COUNT 100
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
38
5529
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
39 static const uint8_t block_type_tab[2][4][8][2]={
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
40 {
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
41 { //{8,4,2}x{8,4,2}
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
42 { 0,1}, { 2,2}, { 6,3}, {14,4}, {30,5}, {31,5}, { 0,0}
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
43 },{ //{8,4}x1
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
44 { 0,1}, { 0,0}, { 2,2}, { 6,3}, {14,4}, {15,4}, { 0,0}
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
45 },{ //1x{8,4}
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
46 { 0,1}, { 2,2}, { 0,0}, { 6,3}, {14,4}, {15,4}, { 0,0}
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
47 },{ //1x2, 2x1
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
48 { 0,1}, { 0,0}, { 0,0}, { 2,2}, { 6,3}, {14,4}, {15,4}
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
49 }
5529
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
50 },{
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
51 { //{8,4,2}x{8,4,2}
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
52 { 1,2}, { 4,3}, { 5,3}, {0,2}, {6,3}, {7,3}, {0,0}
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
53 },{//{8,4}x1
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
54 { 1,2}, { 0,0}, { 2,2}, {0,2}, {6,3}, {7,3}, {0,0}
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
55 },{//1x{8,4}
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
56 { 1,2}, { 2,2}, { 0,0}, {0,2}, {6,3}, {7,3}, {0,0}
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
57 },{//1x2, 2x1
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
58 { 1,2}, { 0,0}, { 0,0}, {0,2}, {2,2}, {6,3}, {7,3}
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
59 }
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
60 }
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
61 };
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
62
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
63 static const uint8_t size2index[4][4]={
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
64 {-1, 3, 1, 1},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
65 { 3, 0, 0, 0},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
66 { 2, 0, 0, 0},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
67 { 2, 0, 0, 0},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
68 };
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
69
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
70 static const int8_t mv[256][2]={
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
71 { 0, 0},{ 0, -1},{ -1, 0},{ 1, 0},{ 0, 1},{ -1, -1},{ 1, -1},{ -1, 1},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
72 { 1, 1},{ 0, -2},{ -2, 0},{ 2, 0},{ 0, 2},{ -1, -2},{ 1, -2},{ -2, -1},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
73 { 2, -1},{ -2, 1},{ 2, 1},{ -1, 2},{ 1, 2},{ -2, -2},{ 2, -2},{ -2, 2},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
74 { 2, 2},{ 0, -3},{ -3, 0},{ 3, 0},{ 0, 3},{ -1, -3},{ 1, -3},{ -3, -1},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
75 { 3, -1},{ -3, 1},{ 3, 1},{ -1, 3},{ 1, 3},{ -2, -3},{ 2, -3},{ -3, -2},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
76 { 3, -2},{ -3, 2},{ 3, 2},{ -2, 3},{ 2, 3},{ 0, -4},{ -4, 0},{ 4, 0},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
77 { 0, 4},{ -1, -4},{ 1, -4},{ -4, -1},{ 4, -1},{ 4, 1},{ -1, 4},{ 1, 4},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
78 { -3, -3},{ -3, 3},{ 3, 3},{ -2, -4},{ -4, -2},{ 4, -2},{ -4, 2},{ -2, 4},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
79 { 2, 4},{ -3, -4},{ 3, -4},{ 4, -3},{ -5, 0},{ -4, 3},{ -3, 4},{ 3, 4},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
80 { -1, -5},{ -5, -1},{ -5, 1},{ -1, 5},{ -2, -5},{ 2, -5},{ 5, -2},{ 5, 2},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
81 { -4, -4},{ -4, 4},{ -3, -5},{ -5, -3},{ -5, 3},{ 3, 5},{ -6, 0},{ 0, 6},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
82 { -6, -1},{ -6, 1},{ 1, 6},{ 2, -6},{ -6, 2},{ 2, 6},{ -5, -4},{ 5, 4},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
83 { 4, 5},{ -6, -3},{ 6, 3},{ -7, 0},{ -1, -7},{ 5, -5},{ -7, 1},{ -1, 7},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
84 { 4, -6},{ 6, 4},{ -2, -7},{ -7, 2},{ -3, -7},{ 7, -3},{ 3, 7},{ 6, -5},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
85 { 0, -8},{ -1, -8},{ -7, -4},{ -8, 1},{ 4, 7},{ 2, -8},{ -2, 8},{ 6, 6},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
86 { -8, 3},{ 5, -7},{ -5, 7},{ 8, -4},{ 0, -9},{ -9, -1},{ 1, 9},{ 7, -6},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
87 { -7, 6},{ -5, -8},{ -5, 8},{ -9, 3},{ 9, -4},{ 7, -7},{ 8, -6},{ 6, 8},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
88 { 10, 1},{-10, 2},{ 9, -5},{ 10, -3},{ -8, -7},{-10, -4},{ 6, -9},{-11, 0},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
89 { 11, 1},{-11, -2},{ -2, 11},{ 7, -9},{ -7, 9},{ 10, 6},{ -4, 11},{ 8, -9},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
90 { 8, 9},{ 5, 11},{ 7,-10},{ 12, -3},{ 11, 6},{ -9, -9},{ 8, 10},{ 5, 12},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
91 {-11, 7},{ 13, 2},{ 6,-12},{ 10, 9},{-11, 8},{ -7, 12},{ 0, 14},{ 14, -2},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
92 { -9, 11},{ -6, 13},{-14, -4},{ -5,-14},{ 5, 14},{-15, -1},{-14, -6},{ 3,-15},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
93 { 11,-11},{ -7, 14},{ -5, 15},{ 8,-14},{ 15, 6},{ 3, 16},{ 7,-15},{-16, 5},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
94 { 0, 17},{-16, -6},{-10, 14},{-16, 7},{ 12, 13},{-16, 8},{-17, 6},{-18, 3},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
95 { -7, 17},{ 15, 11},{ 16, 10},{ 2,-19},{ 3,-19},{-11,-16},{-18, 8},{-19, -6},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
96 { 2,-20},{-17,-11},{-10,-18},{ 8, 19},{-21, -1},{-20, 7},{ -4, 21},{ 21, 5},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
97 { 15, 16},{ 2,-22},{-10,-20},{-22, 5},{ 20,-11},{ -7,-22},{-12, 20},{ 23, -5},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
98 { 13,-20},{ 24, -2},{-15, 19},{-11, 22},{ 16, 19},{ 23,-10},{-18,-18},{ -9,-24},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
99 { 24,-10},{ -3, 26},{-23, 13},{-18,-20},{ 17, 21},{ -4, 27},{ 27, 6},{ 1,-28},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
100 {-11, 26},{-17,-23},{ 7, 28},{ 11,-27},{ 29, 5},{-23,-19},{-28,-11},{-21, 22},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
101 {-30, 7},{-17, 26},{-27, 16},{ 13, 29},{ 19,-26},{ 10,-31},{-14,-30},{ 20,-27},
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
102 {-29, 18},{-16,-31},{-28,-22},{ 21,-30},{-25, 28},{ 26,-29},{ 25,-32},{-32,-32}
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
103 };
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
104
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
105 // this is simply the scaled down elementwise product of the standard jpeg quantizer table and the AAN premul table
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
106 static const uint8_t dequant_table[64]={
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
107 16, 15, 13, 19, 24, 31, 28, 17,
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
108 17, 23, 25, 31, 36, 63, 45, 21,
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
109 18, 24, 27, 37, 52, 59, 49, 20,
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
110 16, 28, 34, 40, 60, 80, 51, 20,
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
111 18, 31, 48, 66, 68, 86, 56, 21,
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
112 19, 38, 56, 59, 64, 64, 48, 20,
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
113 27, 48, 55, 55, 56, 51, 35, 15,
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
114 20, 35, 34, 32, 31, 22, 15, 8,
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
115 };
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
116
5529
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
117 static VLC block_type_vlc[2][4];
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
118
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
119
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
120 typedef struct CFrameBuffer{
3776
1843a85123b7 fix some signedness warnings
mru
parents: 3303
diff changeset
121 unsigned int allocated_size;
1843a85123b7 fix some signedness warnings
mru
parents: 3303
diff changeset
122 unsigned int size;
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
123 int id;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
124 uint8_t *data;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
125 }CFrameBuffer;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
126
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
127 typedef struct FourXContext{
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
128 AVCodecContext *avctx;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
129 DSPContext dsp;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
130 AVFrame current_picture, last_picture;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
131 GetBitContext pre_gb; ///< ac/dc prefix
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
132 GetBitContext gb;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
133 uint8_t *bytestream;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
134 uint16_t *wordstream;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
135 int mv[256];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
136 VLC pre_vlc;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
137 int last_dc;
3089
072dbc669253 MSVC-compatible __align8/__align16 declaration
diego
parents: 3066
diff changeset
138 DECLARE_ALIGNED_8(DCTELEM, block[6][64]);
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
139 uint8_t *bitstream_buffer;
3066
04b924f8f5a5 warning fixes by Luca Abeni, lucabe72 ##@## email ##.## it
diego
parents: 3036
diff changeset
140 unsigned int bitstream_buffer_size;
5532
f0bee2532ecf replace vlc_type by version and set that from codec_tag which contains the
michael
parents: 5531
diff changeset
141 int version;
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
142 CFrameBuffer cfrm[CFRAME_BUFFER_COUNT];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
143 } FourXContext;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
144
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
145
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
146 #define FIX_1_082392200 70936
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
147 #define FIX_1_414213562 92682
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
148 #define FIX_1_847759065 121095
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
149 #define FIX_2_613125930 171254
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
150
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
151 #define MULTIPLY(var,const) (((var)*(const)) >> 16)
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
152
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
153 static void idct(DCTELEM block[64]){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
154 int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
155 int tmp10, tmp11, tmp12, tmp13;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
156 int z5, z10, z11, z12, z13;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
157 int i;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
158 int temp[64];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
159
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
160 for(i=0; i<8; i++){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
161 tmp10 = block[8*0 + i] + block[8*4 + i];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
162 tmp11 = block[8*0 + i] - block[8*4 + i];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
163
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
164 tmp13 = block[8*2 + i] + block[8*6 + i];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
165 tmp12 = MULTIPLY(block[8*2 + i] - block[8*6 + i], FIX_1_414213562) - tmp13;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
166
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
167 tmp0 = tmp10 + tmp13;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
168 tmp3 = tmp10 - tmp13;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
169 tmp1 = tmp11 + tmp12;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
170 tmp2 = tmp11 - tmp12;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
171
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
172 z13 = block[8*5 + i] + block[8*3 + i];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
173 z10 = block[8*5 + i] - block[8*3 + i];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
174 z11 = block[8*1 + i] + block[8*7 + i];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
175 z12 = block[8*1 + i] - block[8*7 + i];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
176
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
177 tmp7 = z11 + z13;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
178 tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
179
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
180 z5 = MULTIPLY(z10 + z12, FIX_1_847759065);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
181 tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
182 tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
183
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
184 tmp6 = tmp12 - tmp7;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
185 tmp5 = tmp11 - tmp6;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
186 tmp4 = tmp10 + tmp5;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
187
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
188 temp[8*0 + i] = tmp0 + tmp7;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
189 temp[8*7 + i] = tmp0 - tmp7;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
190 temp[8*1 + i] = tmp1 + tmp6;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
191 temp[8*6 + i] = tmp1 - tmp6;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
192 temp[8*2 + i] = tmp2 + tmp5;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
193 temp[8*5 + i] = tmp2 - tmp5;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
194 temp[8*4 + i] = tmp3 + tmp4;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
195 temp[8*3 + i] = tmp3 - tmp4;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
196 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
197
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
198 for(i=0; i<8*8; i+=8){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
199 tmp10 = temp[0 + i] + temp[4 + i];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
200 tmp11 = temp[0 + i] - temp[4 + i];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
201
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
202 tmp13 = temp[2 + i] + temp[6 + i];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
203 tmp12 = MULTIPLY(temp[2 + i] - temp[6 + i], FIX_1_414213562) - tmp13;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
204
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
205 tmp0 = tmp10 + tmp13;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
206 tmp3 = tmp10 - tmp13;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
207 tmp1 = tmp11 + tmp12;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
208 tmp2 = tmp11 - tmp12;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
209
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
210 z13 = temp[5 + i] + temp[3 + i];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
211 z10 = temp[5 + i] - temp[3 + i];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
212 z11 = temp[1 + i] + temp[7 + i];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
213 z12 = temp[1 + i] - temp[7 + i];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
214
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
215 tmp7 = z11 + z13;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
216 tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
217
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
218 z5 = MULTIPLY(z10 + z12, FIX_1_847759065);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
219 tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
220 tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
221
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
222 tmp6 = tmp12 - tmp7;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
223 tmp5 = tmp11 - tmp6;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
224 tmp4 = tmp10 + tmp5;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
225
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
226 block[0 + i] = (tmp0 + tmp7)>>6;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
227 block[7 + i] = (tmp0 - tmp7)>>6;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
228 block[1 + i] = (tmp1 + tmp6)>>6;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
229 block[6 + i] = (tmp1 - tmp6)>>6;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
230 block[2 + i] = (tmp2 + tmp5)>>6;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
231 block[5 + i] = (tmp2 - tmp5)>>6;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
232 block[4 + i] = (tmp3 + tmp4)>>6;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
233 block[3 + i] = (tmp3 - tmp4)>>6;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
234 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
235 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
236
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
237 static void init_vlcs(FourXContext *f){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
238 int i;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
239
5529
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
240 for(i=0; i<8; i++){
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
241 init_vlc(&block_type_vlc[0][i], BLOCK_TYPE_VLC_BITS, 7,
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
242 &block_type_tab[0][i][0][1], 2, 1,
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
243 &block_type_tab[0][i][0][0], 2, 1, 1);
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
244 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
245 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
246
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
247 static void init_mv(FourXContext *f){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
248 int i;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
249
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
250 for(i=0; i<256; i++){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
251 f->mv[i] = mv[i][0] + mv[i][1]*f->current_picture.linesize[0]/2;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
252 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
253 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
254
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
255 static inline void mcdc(uint16_t *dst, uint16_t *src, int log2w, int h, int stride, int scale, int dc){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
256 int i;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
257 dc*= 0x10001;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
258
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
259 switch(log2w){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
260 case 0:
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
261 for(i=0; i<h; i++){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
262 dst[0] = scale*src[0] + dc;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
263 if(scale) src += stride;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
264 dst += stride;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
265 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
266 break;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
267 case 1:
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
268 for(i=0; i<h; i++){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
269 ((uint32_t*)dst)[0] = scale*((uint32_t*)src)[0] + dc;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
270 if(scale) src += stride;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
271 dst += stride;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
272 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
273 break;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
274 case 2:
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
275 for(i=0; i<h; i++){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
276 ((uint32_t*)dst)[0] = scale*((uint32_t*)src)[0] + dc;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
277 ((uint32_t*)dst)[1] = scale*((uint32_t*)src)[1] + dc;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
278 if(scale) src += stride;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
279 dst += stride;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
280 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
281 break;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
282 case 3:
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
283 for(i=0; i<h; i++){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
284 ((uint32_t*)dst)[0] = scale*((uint32_t*)src)[0] + dc;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
285 ((uint32_t*)dst)[1] = scale*((uint32_t*)src)[1] + dc;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
286 ((uint32_t*)dst)[2] = scale*((uint32_t*)src)[2] + dc;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
287 ((uint32_t*)dst)[3] = scale*((uint32_t*)src)[3] + dc;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
288 if(scale) src += stride;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
289 dst += stride;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
290 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
291 break;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
292 default: assert(0);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
293 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
294 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
295
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
296 static void decode_p_block(FourXContext *f, uint16_t *dst, uint16_t *src, int log2w, int log2h, int stride){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
297 const int index= size2index[log2h][log2w];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
298 const int h= 1<<log2h;
5532
f0bee2532ecf replace vlc_type by version and set that from codec_tag which contains the
michael
parents: 5531
diff changeset
299 int code= get_vlc2(&f->gb, block_type_vlc[1-f->version][index].table, BLOCK_TYPE_VLC_BITS, 1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
300
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
301 assert(code>=0 && code<=6);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
302
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
303 if(code == 0){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
304 src += f->mv[ *f->bytestream++ ];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
305 mcdc(dst, src, log2w, h, stride, 1, 0);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
306 }else if(code == 1){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
307 log2h--;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
308 decode_p_block(f, dst , src , log2w, log2h, stride);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
309 decode_p_block(f, dst + (stride<<log2h), src + (stride<<log2h), log2w, log2h, stride);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
310 }else if(code == 2){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
311 log2w--;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
312 decode_p_block(f, dst , src , log2w, log2h, stride);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
313 decode_p_block(f, dst + (1<<log2w), src + (1<<log2w), log2w, log2h, stride);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
314 }else if(code == 4){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
315 src += f->mv[ *f->bytestream++ ];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
316 mcdc(dst, src, log2w, h, stride, 1, le2me_16(*f->wordstream++));
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
317 }else if(code == 5){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
318 mcdc(dst, src, log2w, h, stride, 0, le2me_16(*f->wordstream++));
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
319 }else if(code == 6){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
320 if(log2w){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
321 dst[0] = le2me_16(*f->wordstream++);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
322 dst[1] = le2me_16(*f->wordstream++);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
323 }else{
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
324 dst[0 ] = le2me_16(*f->wordstream++);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
325 dst[stride] = le2me_16(*f->wordstream++);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
326 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
327 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
328 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
329
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
330 static int get32(void *p){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
331 return le2me_32(*(uint32_t*)p);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
332 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
333
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
334 static int decode_p_frame(FourXContext *f, uint8_t *buf, int length){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
335 int x, y;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
336 const int width= f->avctx->width;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
337 const int height= f->avctx->height;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
338 uint16_t *src= (uint16_t*)f->last_picture.data[0];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
339 uint16_t *dst= (uint16_t*)f->current_picture.data[0];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
340 const int stride= f->current_picture.linesize[0]>>1;
5529
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
341 unsigned int bitstream_size, bytestream_size, wordstream_size, extra;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
342
5533
8708867078ba use version instead of some random 32bit value to switch between 16 and
michael
parents: 5532
diff changeset
343 if(f->version){
5529
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
344 extra=20;
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
345 bitstream_size= get32(buf+8);
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
346 wordstream_size= get32(buf+12);
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
347 bytestream_size= get32(buf+16);
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
348 }else{
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
349 extra=0;
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
350 bitstream_size = AV_RL16(buf-4);
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
351 wordstream_size= AV_RL16(buf-2);
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
352 bytestream_size= FFMAX(length - bitstream_size - wordstream_size, 0);
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
353 }
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
354
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
355 if(bitstream_size+ bytestream_size+ wordstream_size + extra != length
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
356 || bitstream_size > (1<<26)
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
357 || bytestream_size > (1<<26)
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
358 || wordstream_size > (1<<26)
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
359 ){
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
360 av_log(f->avctx, AV_LOG_ERROR, "lengths %d %d %d %d\n", bitstream_size, bytestream_size, wordstream_size,
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
361 bitstream_size+ bytestream_size+ wordstream_size - length);
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
362 return -1;
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
363 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
364
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
365 f->bitstream_buffer= av_fast_realloc(f->bitstream_buffer, &f->bitstream_buffer_size, bitstream_size + FF_INPUT_BUFFER_PADDING_SIZE);
5529
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
366 f->dsp.bswap_buf((uint32_t*)f->bitstream_buffer, (uint32_t*)(buf + extra), bitstream_size/4);
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
367 init_get_bits(&f->gb, f->bitstream_buffer, 8*bitstream_size);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
368
5529
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
369 f->wordstream= (uint16_t*)(buf + extra + bitstream_size);
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
370 f->bytestream= buf + extra + bitstream_size + wordstream_size;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
371
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
372 init_mv(f);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
373
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
374 for(y=0; y<height; y+=8){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
375 for(x=0; x<width; x+=8){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
376 decode_p_block(f, dst + x, src + x, 3, 3, stride);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
377 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
378 src += 8*stride;
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
379 dst += 8*stride;
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
380 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
381
5529
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
382 if( bitstream_size != (get_bits_count(&f->gb)+31)/32*4
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
383 || (((char*)f->wordstream - (char*)buf + 2)&~2) != extra + bitstream_size + wordstream_size
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
384 || (((char*)f->bytestream - (char*)buf + 3)&~3) != extra + bitstream_size + wordstream_size + bytestream_size)
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
385 av_log(f->avctx, AV_LOG_ERROR, " %d %td %td bytes left\n",
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
386 bitstream_size - (get_bits_count(&f->gb)+31)/32*4,
5529
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
387 -(((char*)f->bytestream - (char*)buf + 3)&~3) + (extra + bitstream_size + wordstream_size + bytestream_size),
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
388 -(((char*)f->wordstream - (char*)buf + 2)&~2) + (extra + bitstream_size + wordstream_size)
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
389 );
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
390
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
391 return 0;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
392 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
393
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
394 /**
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
395 * decode block and dequantize.
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
396 * Note this is allmost identical to mjpeg
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
397 */
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
398 static int decode_i_block(FourXContext *f, DCTELEM *block){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
399 int code, i, j, level, val;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
400
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
401 /* DC coef */
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
402 val = get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
403 if (val>>4){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1514
diff changeset
404 av_log(f->avctx, AV_LOG_ERROR, "error dc run != 0\n");
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
405 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
406
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
407 if(val)
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
408 val = get_xbits(&f->gb, val);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
409
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
410 val = val * dequant_table[0] + f->last_dc;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
411 f->last_dc =
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
412 block[0] = val;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
413 /* AC coefs */
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
414 i = 1;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
415 for(;;) {
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
416 code = get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
417
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
418 /* EOB */
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
419 if (code == 0)
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
420 break;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
421 if (code == 0xf0) {
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
422 i += 16;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
423 } else {
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
424 level = get_xbits(&f->gb, code & 0xf);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
425 i += code >> 4;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
426 if (i >= 64) {
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1514
diff changeset
427 av_log(f->avctx, AV_LOG_ERROR, "run %d oveflow\n", i);
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
428 return 0;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
429 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
430
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
431 j= ff_zigzag_direct[i];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
432 block[j] = level * dequant_table[j];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
433 i++;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
434 if (i >= 64)
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
435 break;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
436 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
437 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
438
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
439 return 0;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
440 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
441
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
442 static inline void idct_put(FourXContext *f, int x, int y){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
443 DCTELEM (*block)[64]= f->block;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
444 int stride= f->current_picture.linesize[0]>>1;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
445 int i;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
446 uint16_t *dst = ((uint16_t*)f->current_picture.data[0]) + y * stride + x;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
447
1295
5c67ef6498ed fix 4xm yuv->rgb565 transform
michaelni
parents: 1294
diff changeset
448 for(i=0; i<4; i++){
5c67ef6498ed fix 4xm yuv->rgb565 transform
michaelni
parents: 1294
diff changeset
449 block[i][0] += 0x80*8*8;
5c67ef6498ed fix 4xm yuv->rgb565 transform
michaelni
parents: 1294
diff changeset
450 idct(block[i]);
5c67ef6498ed fix 4xm yuv->rgb565 transform
michaelni
parents: 1294
diff changeset
451 }
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
452
1295
5c67ef6498ed fix 4xm yuv->rgb565 transform
michaelni
parents: 1294
diff changeset
453 if(!(f->avctx->flags&CODEC_FLAG_GRAY)){
5c67ef6498ed fix 4xm yuv->rgb565 transform
michaelni
parents: 1294
diff changeset
454 for(i=4; i<6; i++) idct(block[i]);
5c67ef6498ed fix 4xm yuv->rgb565 transform
michaelni
parents: 1294
diff changeset
455 }
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
456
1514
b1a0fc3ad09f forgot to commit, i hope its correct
michael
parents: 1478
diff changeset
457 /* Note transform is:
b1a0fc3ad09f forgot to commit, i hope its correct
michael
parents: 1478
diff changeset
458 y= ( 1b + 4g + 2r)/14
b1a0fc3ad09f forgot to commit, i hope its correct
michael
parents: 1478
diff changeset
459 cb=( 3b - 2g - 1r)/14
b1a0fc3ad09f forgot to commit, i hope its correct
michael
parents: 1478
diff changeset
460 cr=(-1b - 4g + 5r)/14
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
461 */
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
462 for(y=0; y<8; y++){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
463 for(x=0; x<8; x++){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
464 DCTELEM *temp= block[(x>>2) + 2*(y>>2)] + 2*(x&3) + 2*8*(y&3); //FIXME optimize
1295
5c67ef6498ed fix 4xm yuv->rgb565 transform
michaelni
parents: 1294
diff changeset
465 int cb= block[4][x + 8*y];
5c67ef6498ed fix 4xm yuv->rgb565 transform
michaelni
parents: 1294
diff changeset
466 int cr= block[5][x + 8*y];
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
467 int cg= (cb + cr)>>1;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
468 int y;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
469
1295
5c67ef6498ed fix 4xm yuv->rgb565 transform
michaelni
parents: 1294
diff changeset
470 cb+=cb;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
471
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
472 y = temp[0];
1295
5c67ef6498ed fix 4xm yuv->rgb565 transform
michaelni
parents: 1294
diff changeset
473 dst[0 ]= ((y+cb)>>3) + (((y-cg)&0xFC)<<3) + (((y+cr)&0xF8)<<8);
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
474 y = temp[1];
1295
5c67ef6498ed fix 4xm yuv->rgb565 transform
michaelni
parents: 1294
diff changeset
475 dst[1 ]= ((y+cb)>>3) + (((y-cg)&0xFC)<<3) + (((y+cr)&0xF8)<<8);
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
476 y = temp[8];
1295
5c67ef6498ed fix 4xm yuv->rgb565 transform
michaelni
parents: 1294
diff changeset
477 dst[ stride]= ((y+cb)>>3) + (((y-cg)&0xFC)<<3) + (((y+cr)&0xF8)<<8);
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
478 y = temp[9];
1295
5c67ef6498ed fix 4xm yuv->rgb565 transform
michaelni
parents: 1294
diff changeset
479 dst[1+stride]= ((y+cb)>>3) + (((y-cg)&0xFC)<<3) + (((y+cr)&0xF8)<<8);
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
480 dst += 2;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
481 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
482 dst += 2*stride - 2*8;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
483 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
484 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
485
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
486 static int decode_i_mb(FourXContext *f){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
487 int i;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
488
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
489 f->dsp.clear_blocks(f->block[0]);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
490
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
491 for(i=0; i<6; i++){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
492 if(decode_i_block(f, f->block[i]) < 0)
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
493 return -1;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
494 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
495
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
496 return 0;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
497 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
498
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
499 static uint8_t *read_huffman_tables(FourXContext *f, uint8_t * const buf){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
500 int frequency[512];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
501 uint8_t flag[512];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
502 int up[512];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
503 uint8_t len_tab[257];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
504 int bits_tab[257];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
505 int start, end;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
506 uint8_t *ptr= buf;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
507 int j;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
508
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
509 memset(frequency, 0, sizeof(frequency));
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
510 memset(up, -1, sizeof(up));
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
511
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
512 start= *ptr++;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
513 end= *ptr++;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
514 for(;;){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
515 int i;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
516
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
517 for(i=start; i<=end; i++){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
518 frequency[i]= *ptr++;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
519 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
520 start= *ptr++;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
521 if(start==0) break;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
522
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
523 end= *ptr++;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
524 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
525 frequency[256]=1;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
526
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
527 while((ptr - buf)&3) ptr++; // 4byte align
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
528
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
529 for(j=257; j<512; j++){
1294
6896bc2f3bf5 10l (array[-1] ...)
michaelni
parents: 1293
diff changeset
530 int min_freq[2]= {256*256, 256*256};
6896bc2f3bf5 10l (array[-1] ...)
michaelni
parents: 1293
diff changeset
531 int smallest[2]= {0, 0};
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
532 int i;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
533 for(i=0; i<j; i++){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
534 if(frequency[i] == 0) continue;
1294
6896bc2f3bf5 10l (array[-1] ...)
michaelni
parents: 1293
diff changeset
535 if(frequency[i] < min_freq[1]){
6896bc2f3bf5 10l (array[-1] ...)
michaelni
parents: 1293
diff changeset
536 if(frequency[i] < min_freq[0]){
6896bc2f3bf5 10l (array[-1] ...)
michaelni
parents: 1293
diff changeset
537 min_freq[1]= min_freq[0]; smallest[1]= smallest[0];
6896bc2f3bf5 10l (array[-1] ...)
michaelni
parents: 1293
diff changeset
538 min_freq[0]= frequency[i];smallest[0]= i;
6896bc2f3bf5 10l (array[-1] ...)
michaelni
parents: 1293
diff changeset
539 }else{
6896bc2f3bf5 10l (array[-1] ...)
michaelni
parents: 1293
diff changeset
540 min_freq[1]= frequency[i];smallest[1]= i;
6896bc2f3bf5 10l (array[-1] ...)
michaelni
parents: 1293
diff changeset
541 }
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
542 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
543 }
1294
6896bc2f3bf5 10l (array[-1] ...)
michaelni
parents: 1293
diff changeset
544 if(min_freq[1] == 256*256) break;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
545
1294
6896bc2f3bf5 10l (array[-1] ...)
michaelni
parents: 1293
diff changeset
546 frequency[j]= min_freq[0] + min_freq[1];
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
547 flag[ smallest[0] ]= 0;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
548 flag[ smallest[1] ]= 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
549 up[ smallest[0] ]=
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
550 up[ smallest[1] ]= j;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
551 frequency[ smallest[0] ]= frequency[ smallest[1] ]= 0;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
552 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
553
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
554 for(j=0; j<257; j++){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
555 int node;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
556 int len=0;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
557 int bits=0;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
558
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
559 for(node= j; up[node] != -1; node= up[node]){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
560 bits += flag[node]<<len;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
561 len++;
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1514
diff changeset
562 if(len > 31) av_log(f->avctx, AV_LOG_ERROR, "vlc length overflow\n"); //can this happen at all ?
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
563 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
564
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
565 bits_tab[j]= bits;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
566 len_tab[j]= len;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
567 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
568
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
569 init_vlc(&f->pre_vlc, ACDC_VLC_BITS, 257,
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
570 len_tab , 1, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2028
diff changeset
571 bits_tab, 4, 4, 0);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
572
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
573 return ptr;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
574 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
575
5531
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
576 static int mix(int c0, int c1){
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
577 int blue = 2*(c0&0x001F) + (c1&0x001F);
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
578 int green= (2*(c0&0x03E0) + (c1&0x03E0))>>5;
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
579 int red = 2*(c0>>10) + (c1>>10);
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
580 return red/3*1024 + green/3*32 + blue/3;
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
581 }
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
582
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
583 static int decode_i2_frame(FourXContext *f, uint8_t *buf, int length){
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
584 int x, y, x2, y2;
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
585 const int width= f->avctx->width;
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
586 const int height= f->avctx->height;
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
587 uint16_t *dst= (uint16_t*)f->current_picture.data[0];
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
588 const int stride= f->current_picture.linesize[0]>>1;
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
589
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
590 for(y=0; y<height; y+=16){
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
591 for(x=0; x<width; x+=16){
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
592 unsigned int color[4], bits;
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
593 memset(color, 0, sizeof(color));
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
594 //warning following is purely guessed ...
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
595 color[0]= AV_RN16(buf); buf+=2; //FIXME use bytestream
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
596 color[1]= AV_RN16(buf); buf+=2;
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
597
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
598 if(color[0]&0x8000) av_log(NULL, AV_LOG_ERROR, "unk bit 1\n");
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
599 if(color[1]&0x8000) av_log(NULL, AV_LOG_ERROR, "unk bit 2\n");
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
600
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
601 color[2]= mix(color[0], color[1]);
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
602 color[3]= mix(color[1], color[0]);
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
603
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
604 bits= AV_RL32(buf); buf+= 4;
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
605 for(y2=0; y2<16; y2++){
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
606 for(x2=0; x2<16; x2++){
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
607 int index= 2*(x2>>2) + 8*(y2>>2);
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
608 dst[y2*stride+x2]= color[(bits>>index)&3];
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
609 }
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
610 }
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
611 dst+=16;
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
612 }
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
613 dst += 16*stride - width;
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
614 }
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
615
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
616 return 0;
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
617 }
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
618
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
619 static int decode_i_frame(FourXContext *f, uint8_t *buf, int length){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
620 int x, y;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
621 const int width= f->avctx->width;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
622 const int height= f->avctx->height;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
623 uint16_t *dst= (uint16_t*)f->current_picture.data[0];
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
624 const int stride= f->current_picture.linesize[0]>>1;
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
625 const unsigned int bitstream_size= get32(buf);
5083
ce36118abbbb rename attribute_unused to av_unused and moves its declaration to common.h
benoit
parents: 5006
diff changeset
626 const int token_count av_unused = get32(buf + bitstream_size + 8);
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
627 unsigned int prestream_size= 4*get32(buf + bitstream_size + 4);
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
628 uint8_t *prestream= buf + bitstream_size + 12;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
629
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
630 if(prestream_size + bitstream_size + 12 != length
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
631 || bitstream_size > (1<<26)
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
632 || prestream_size > (1<<26)){
2628
511e3afc43e1 Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents: 2453
diff changeset
633 av_log(f->avctx, AV_LOG_ERROR, "size mismatch %d %d %d\n", prestream_size, bitstream_size, length);
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
634 return -1;
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2370
diff changeset
635 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
636
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
637 prestream= read_huffman_tables(f, prestream);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
638
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
639 init_get_bits(&f->gb, buf + 4, 8*bitstream_size);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
640
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
641 prestream_size= length + buf - prestream;
1294
6896bc2f3bf5 10l (array[-1] ...)
michaelni
parents: 1293
diff changeset
642
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
643 f->bitstream_buffer= av_fast_realloc(f->bitstream_buffer, &f->bitstream_buffer_size, prestream_size + FF_INPUT_BUFFER_PADDING_SIZE);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
644 f->dsp.bswap_buf((uint32_t*)f->bitstream_buffer, (uint32_t*)prestream, prestream_size/4);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
645 init_get_bits(&f->pre_gb, f->bitstream_buffer, 8*prestream_size);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
646
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
647 f->last_dc= 0*128*8*8;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
648
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
649 for(y=0; y<height; y+=16){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
650 for(x=0; x<width; x+=16){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
651 if(decode_i_mb(f) < 0)
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
652 return -1;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
653
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
654 idct_put(f, x, y);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
655 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
656 dst += 16*stride;
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
657 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
658
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
659 if(get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3) != 256)
2628
511e3afc43e1 Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents: 2453
diff changeset
660 av_log(f->avctx, AV_LOG_ERROR, "end mismatch\n");
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
661
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
662 return 0;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
663 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
664
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
665 static int decode_frame(AVCodecContext *avctx,
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
666 void *data, int *data_size,
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
667 uint8_t *buf, int buf_size)
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
668 {
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
669 FourXContext * const f = avctx->priv_data;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
670 AVFrame *picture = data;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
671 AVFrame *p, temp;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
672 int i, frame_4cc, frame_size;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
673
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
674 frame_4cc= get32(buf);
3303
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3089
diff changeset
675 if(buf_size != get32(buf+4)+8 || buf_size < 20){
2628
511e3afc43e1 Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents: 2453
diff changeset
676 av_log(f->avctx, AV_LOG_ERROR, "size mismatch %d %d\n", buf_size, get32(buf+4));
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
677 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
678
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
679 if(frame_4cc == ff_get_fourcc("cfrm")){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
680 int free_index=-1;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
681 const int data_size= buf_size - 20;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
682 const int id= get32(buf+12);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
683 const int whole_size= get32(buf+16);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
684 CFrameBuffer *cfrm;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
685
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
686 for(i=0; i<CFRAME_BUFFER_COUNT; i++){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
687 if(f->cfrm[i].id && f->cfrm[i].id < avctx->frame_number)
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1514
diff changeset
688 av_log(f->avctx, AV_LOG_ERROR, "lost c frame %d\n", f->cfrm[i].id);
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
689 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
690
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
691 for(i=0; i<CFRAME_BUFFER_COUNT; i++){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
692 if(f->cfrm[i].id == id) break;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
693 if(f->cfrm[i].size == 0 ) free_index= i;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
694 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
695
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
696 if(i>=CFRAME_BUFFER_COUNT){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
697 i= free_index;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
698 f->cfrm[i].id= id;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
699 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
700 cfrm= &f->cfrm[i];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
701
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
702 cfrm->data= av_fast_realloc(cfrm->data, &cfrm->allocated_size, cfrm->size + data_size + FF_INPUT_BUFFER_PADDING_SIZE);
3303
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3089
diff changeset
703 if(!cfrm->data){ //explicit check needed as memcpy below might not catch a NULL
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3089
diff changeset
704 av_log(f->avctx, AV_LOG_ERROR, "realloc falure");
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3089
diff changeset
705 return -1;
68721b62a528 sanity checks, some might have been exploitable ...
michael
parents: 3089
diff changeset
706 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
707
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
708 memcpy(cfrm->data + cfrm->size, buf+20, data_size);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
709 cfrm->size += data_size;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
710
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
711 if(cfrm->size >= whole_size){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
712 buf= cfrm->data;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
713 frame_size= cfrm->size;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
714
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
715 if(id != avctx->frame_number){
2628
511e3afc43e1 Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents: 2453
diff changeset
716 av_log(f->avctx, AV_LOG_ERROR, "cframe id mismatch %d %d\n", id, avctx->frame_number);
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
717 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
718
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
719 cfrm->size= cfrm->id= 0;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
720 frame_4cc= ff_get_fourcc("pfrm");
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
721 }else
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
722 return buf_size;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
723 }else{
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
724 buf= buf + 12;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
725 frame_size= buf_size - 12;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
726 }
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
727
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
728 temp= f->current_picture;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
729 f->current_picture= f->last_picture;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
730 f->last_picture= temp;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
731
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
732 p= &f->current_picture;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
733 avctx->coded_frame= p;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
734
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
735 avctx->flags |= CODEC_FLAG_EMU_EDGE; // alternatively we would have to use our own buffer management
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
736
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
737 if(p->data[0])
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
738 avctx->release_buffer(avctx, p);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
739
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
740 p->reference= 1;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
741 if(avctx->get_buffer(avctx, p) < 0){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1514
diff changeset
742 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
743 return -1;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
744 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
745
5531
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
746 if(frame_4cc == ff_get_fourcc("ifr2")){
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
747 p->pict_type= I_TYPE;
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
748 if(decode_i2_frame(f, buf-4, frame_size) < 0)
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
749 return -1;
80ee0d3dd53e support ifr2 from Toy-Story2_better-image-quality.4xa
michael
parents: 5529
diff changeset
750 }else if(frame_4cc == ff_get_fourcc("ifrm")){
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
751 p->pict_type= I_TYPE;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
752 if(decode_i_frame(f, buf, frame_size) < 0)
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
753 return -1;
5529
af68496af656 add second vlc table
michael
parents: 5083
diff changeset
754 }else if(frame_4cc == ff_get_fourcc("pfrm") || frame_4cc == ff_get_fourcc("pfr2")){
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
755 p->pict_type= P_TYPE;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
756 if(decode_p_frame(f, buf, frame_size) < 0)
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
757 return -1;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
758 }else if(frame_4cc == ff_get_fourcc("snd_")){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1514
diff changeset
759 av_log(avctx, AV_LOG_ERROR, "ignoring snd_ chunk length:%d\n", buf_size);
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
760 }else{
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1514
diff changeset
761 av_log(avctx, AV_LOG_ERROR, "ignoring unknown chunk length:%d\n", buf_size);
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
762 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
763
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
764 p->key_frame= p->pict_type == I_TYPE;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
765
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
766 *picture= *p;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
767 *data_size = sizeof(AVPicture);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
768
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
769 emms_c();
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
770
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
771 return buf_size;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
772 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
773
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
774
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
775 static void common_init(AVCodecContext *avctx){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
776 FourXContext * const f = avctx->priv_data;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
777
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
778 dsputil_init(&f->dsp, avctx);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
779
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
780 f->avctx= avctx;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
781 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
782
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
783 static int decode_init(AVCodecContext *avctx){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
784 FourXContext * const f = avctx->priv_data;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
785
5532
f0bee2532ecf replace vlc_type by version and set that from codec_tag which contains the
michael
parents: 5531
diff changeset
786 f->version= avctx->codec_tag == 0x40000;
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
787 common_init(avctx);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
788 init_vlcs(f);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
789
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
790 avctx->pix_fmt= PIX_FMT_RGB565;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
791
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
792 return 0;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
793 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
794
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
795
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
796 static int decode_end(AVCodecContext *avctx){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
797 FourXContext * const f = avctx->priv_data;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
798 int i;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
799
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
800 av_freep(&f->bitstream_buffer);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
801 f->bitstream_buffer_size=0;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
802 for(i=0; i<CFRAME_BUFFER_COUNT; i++){
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
803 av_freep(&f->cfrm[i].data);
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
804 f->cfrm[i].allocated_size= 0;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
805 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
806 free_vlc(&f->pre_vlc);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
807
1293
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
808 return 0;
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
809 }
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
810
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
811 AVCodec fourxm_decoder = {
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
812 "4xm",
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
813 CODEC_TYPE_VIDEO,
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
814 CODEC_ID_4XM,
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
815 sizeof(FourXContext),
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
816 decode_init,
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
817 NULL,
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
818 decode_end,
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
819 decode_frame,
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
820 /*CODEC_CAP_DR1,*/
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
821 };
a918c7d38345 4xm codec
michaelni
parents:
diff changeset
822