annotate 4xm.c @ 8520:a0164882aa38 libavcodec

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