annotate fraps.c @ 4166:eced83504436 libavcodec

mp3 header (de)compression bitstream filter this will make mp3 frames 4 bytes smaller, it will not give you binary identical mp3 files, but it will give you mp3 files which decode to binary identical output this will only work in containers providing at least packet size, sample_rate and number of channels bugreports about mp3 files for which this fails are welcome and this is experimental (dont expect compatibility and dont even expect to be able to decompress what you compressed, hell dont even expect this to work without editing the source a little)
author michael
date Fri, 10 Nov 2006 01:41:53 +0000
parents 228252c41929
children 05e932ddaaa9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
1 /*
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
2 * Fraps FPS1 decoder
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
3 * Copyright (c) 2005 Roine Gustafsson
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
4 * Copyright (c) 2006 Konstantin Shishkov
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
5 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
6 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
7 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
10 * 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: 3036
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
12 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
16 * Lesser General Public License for more details.
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
17 *
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
18 * 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: 3036
diff changeset
19 * 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
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
21 *
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
22 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
23
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
24 /**
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
25 * @file fraps.c
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
26 * Lossless Fraps 'FPS1' decoder
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
27 * @author Roine Gustafsson <roine at users sf net>
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
28 * @author Konstantin Shishkov
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
29 *
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
30 * Codec algorithm for version 0 is taken from Transcode <www.transcoding.org>
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
31 *
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
32 * Version 2 files support by Konstantin Shishkov
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
33 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
34
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
35 #include "avcodec.h"
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
36 #include "bitstream.h"
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
37 #include "dsputil.h"
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
38
2701
6a22fbe16d6d signature has an 'x'
melanson
parents: 2700
diff changeset
39 #define FPS_TAG MKTAG('F', 'P', 'S', 'x')
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
40
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
41 /* symbol for Huffman tree node */
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
42 #define HNODE -1
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
43
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
44 /**
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
45 * Huffman node
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
46 * FIXME one day this should belong to one general framework
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
47 */
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
48 typedef struct Node{
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
49 int16_t sym;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
50 int16_t n0;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
51 int count;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
52 }Node;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
53
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
54 /**
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
55 * local variable storage
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
56 */
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
57 typedef struct FrapsContext{
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
58 AVCodecContext *avctx;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
59 AVFrame frame;
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
60 Node nodes[512];
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
61 uint8_t *tmpbuf;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
62 DSPContext dsp;
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
63 } FrapsContext;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
64
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
65
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
66 /**
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
67 * initializes decoder
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
68 * @param avctx codec context
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
69 * @return 0 on success or negative if fails
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
70 */
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
71 static int decode_init(AVCodecContext *avctx)
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
72 {
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
73 FrapsContext * const s = avctx->priv_data;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
74
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
75 avctx->coded_frame = (AVFrame*)&s->frame;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
76 avctx->has_b_frames = 0;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
77 avctx->pix_fmt= PIX_FMT_NONE; /* set in decode_frame */
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
78
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
79 s->avctx = avctx;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
80 s->frame.data[0] = NULL;
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
81 s->tmpbuf = NULL;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
82
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
83 dsputil_init(&s->dsp, avctx);
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
84
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
85 return 0;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
86 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
87
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
88 /**
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
89 * Comparator - our nodes should ascend by count
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
90 * but with preserved symbol order
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
91 */
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
92 static int huff_cmp(const Node *a, const Node *b){
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
93 return (a->count - b->count)*256 + a->sym - b->sym;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
94 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
95
4142
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
96 static void get_tree_codes(uint32_t *bits, int16_t *lens, uint8_t *xlat, Node *nodes, int node, uint32_t pfx, int pl, int *pos)
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
97 {
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
98 int s;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
99
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
100 s = nodes[node].sym;
4142
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
101 if(s != HNODE || !nodes[node].count){
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
102 bits[*pos] = pfx;
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
103 lens[*pos] = pl;
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
104 xlat[*pos] = s;
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
105 (*pos)++;
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
106 }else{
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
107 pfx <<= 1;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
108 pl++;
4142
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
109 get_tree_codes(bits, lens, xlat, nodes, nodes[node].n0, pfx, pl, pos);
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
110 pfx |= 1;
4142
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
111 get_tree_codes(bits, lens, xlat, nodes, nodes[node].n0+1, pfx, pl, pos);
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
112 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
113 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
114
4142
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
115 static int build_huff_tree(VLC *vlc, Node *nodes, uint8_t *xlat)
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
116 {
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
117 uint32_t bits[256];
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
118 int16_t lens[256];
4142
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
119 int pos = 0;
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
120
4142
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
121 get_tree_codes(bits, lens, xlat, nodes, 510, 0, 0, &pos);
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
122 return init_vlc(vlc, 9, pos, lens, 2, 2, bits, 4, 4, 0);
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
123 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
124
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
125
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
126 /**
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
127 * decode Fraps v2 packed plane
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
128 */
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
129 static int fraps2_decode_plane(FrapsContext *s, uint8_t *dst, int stride, int w,
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
130 int h, uint8_t *src, int size, int Uoff)
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
131 {
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
132 int i, j;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
133 int cur_node;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
134 GetBitContext gb;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
135 VLC vlc;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
136 int64_t sum = 0;
4142
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
137 uint8_t recode[256];
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
138
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
139 for(i = 0; i < 256; i++){
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
140 s->nodes[i].sym = i;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
141 s->nodes[i].count = LE_32(src);
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
142 s->nodes[i].n0 = -2;
4148
228252c41929 Check for symbol count
kostya
parents: 4142
diff changeset
143 if(s->nodes[i].count < 0) {
228252c41929 Check for symbol count
kostya
parents: 4142
diff changeset
144 av_log(s->avctx, AV_LOG_ERROR, "Symbol count < 0\n");
228252c41929 Check for symbol count
kostya
parents: 4142
diff changeset
145 return -1;
228252c41929 Check for symbol count
kostya
parents: 4142
diff changeset
146 }
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
147 src += 4;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
148 sum += s->nodes[i].count;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
149 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
150 size -= 1024;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
151
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
152 if(sum >> 31) {
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
153 av_log(s->avctx, AV_LOG_ERROR, "Too high symbol frequencies. Tree construction is not possible\n");
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
154 return -1;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
155 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
156 qsort(s->nodes, 256, sizeof(Node), huff_cmp);
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
157 cur_node = 256;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
158 for(i = 0; i < 511; i += 2){
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
159 s->nodes[cur_node].sym = HNODE;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
160 s->nodes[cur_node].count = s->nodes[i].count + s->nodes[i+1].count;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
161 s->nodes[cur_node].n0 = i;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
162 for(j = cur_node; j > 0; j--){
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
163 if(s->nodes[j].count >= s->nodes[j - 1].count) break;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
164 FFSWAP(Node, s->nodes[j], s->nodes[j - 1]);
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
165 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
166 cur_node++;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
167 }
4142
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
168 if(build_huff_tree(&vlc, s->nodes, recode) < 0){
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
169 av_log(s->avctx, AV_LOG_ERROR, "Error building tree\n");
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
170 return -1;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
171 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
172 /* we have built Huffman table and are ready to decode plane */
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
173
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
174 /* convert bits so they may be used by standard bitreader */
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
175 s->dsp.bswap_buf(s->tmpbuf, src, size >> 2);
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
176
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
177 init_get_bits(&gb, s->tmpbuf, size * 8);
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
178 for(j = 0; j < h; j++){
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
179 for(i = 0; i < w; i++){
4142
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
180 dst[i] = recode[get_vlc2(&gb, vlc.table, 9, 3)];
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
181 /* lines are stored as deltas between previous lines
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
182 * and we need to add 0x80 to the first lines of chroma planes
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
183 */
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
184 if(j) dst[i] += dst[i - stride];
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
185 else if(Uoff) dst[i] += 0x80;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
186 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
187 dst += stride;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
188 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
189 free_vlc(&vlc);
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
190 return 0;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
191 }
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
192
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
193 /**
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
194 * decode a frame
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
195 * @param avctx codec context
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
196 * @param data output AVFrame
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
197 * @param data_size size of output data or 0 if no picture is returned
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
198 * @param buf input data frame
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
199 * @param buf_size size of input data frame
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
200 * @return number of consumed bytes on success or negative if decode fails
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
201 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
202 static int decode_frame(AVCodecContext *avctx,
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
203 void *data, int *data_size,
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
204 uint8_t *buf, int buf_size)
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
205 {
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
206 FrapsContext * const s = avctx->priv_data;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
207 AVFrame *frame = data;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
208 AVFrame * const f = (AVFrame*)&s->frame;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
209 uint32_t header;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
210 unsigned int version,header_size;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
211 unsigned int x, y;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
212 uint32_t *buf32;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
213 uint32_t *luma1,*luma2,*cb,*cr;
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
214 uint32_t offs[4];
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
215 int i, is_chroma, planes;
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
216
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
217
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
218 header = LE_32(buf);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
219 version = header & 0xff;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
220 header_size = (header & (1<<30))? 8 : 4; /* bit 30 means pad to 8 bytes */
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
221
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
222 if (version > 2 && version != 4) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
223 av_log(avctx, AV_LOG_ERROR,
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
224 "This file is encoded with Fraps version %d. " \
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
225 "This codec can only decode version 0, 1, 2 and 4.\n", version);
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
226 return -1;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
227 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
228
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
229 buf+=4;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
230 if (header_size == 8)
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
231 buf+=4;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
232
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
233 switch(version) {
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
234 case 0:
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
235 default:
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
236 /* Fraps v0 is a reordered YUV420 */
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
237 avctx->pix_fmt = PIX_FMT_YUV420P;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
238
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
239 if ( (buf_size != avctx->width*avctx->height*3/2+header_size) &&
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
240 (buf_size != header_size) ) {
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
241 av_log(avctx, AV_LOG_ERROR,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
242 "Invalid frame length %d (should be %d)\n",
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
243 buf_size, avctx->width*avctx->height*3/2+header_size);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
244 return -1;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
245 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
246
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
247 if (( (avctx->width % 8) != 0) || ( (avctx->height % 2) != 0 )) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
248 av_log(avctx, AV_LOG_ERROR, "Invalid frame size %dx%d\n",
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
249 avctx->width, avctx->height);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
250 return -1;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
251 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
252
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
253 f->reference = 1;
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
254 f->buffer_hints = FF_BUFFER_HINTS_VALID |
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
255 FF_BUFFER_HINTS_PRESERVE |
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
256 FF_BUFFER_HINTS_REUSABLE;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
257 if (avctx->reget_buffer(avctx, f)) {
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
258 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
259 return -1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
260 }
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
261 /* bit 31 means same as previous pic */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
262 f->pict_type = (header & (1<<31))? FF_P_TYPE : FF_I_TYPE;
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
263 f->key_frame = f->pict_type == FF_I_TYPE;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
264
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
265 if (f->pict_type == FF_I_TYPE) {
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
266 buf32=(uint32_t*)buf;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
267 for(y=0; y<avctx->height/2; y++){
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
268 luma1=(uint32_t*)&f->data[0][ y*2*f->linesize[0] ];
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
269 luma2=(uint32_t*)&f->data[0][ (y*2+1)*f->linesize[0] ];
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
270 cr=(uint32_t*)&f->data[1][ y*f->linesize[1] ];
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
271 cb=(uint32_t*)&f->data[2][ y*f->linesize[2] ];
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
272 for(x=0; x<avctx->width; x+=8){
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
273 *(luma1++) = *(buf32++);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
274 *(luma1++) = *(buf32++);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
275 *(luma2++) = *(buf32++);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
276 *(luma2++) = *(buf32++);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
277 *(cr++) = *(buf32++);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
278 *(cb++) = *(buf32++);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
279 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
280 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
281 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
282 break;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
283
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
284 case 1:
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
285 /* Fraps v1 is an upside-down BGR24 */
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
286 avctx->pix_fmt = PIX_FMT_BGR24;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
287
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
288 if ( (buf_size != avctx->width*avctx->height*3+header_size) &&
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
289 (buf_size != header_size) ) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
290 av_log(avctx, AV_LOG_ERROR,
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
291 "Invalid frame length %d (should be %d)\n",
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
292 buf_size, avctx->width*avctx->height*3+header_size);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
293 return -1;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
294 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
295
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
296 f->reference = 1;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
297 f->buffer_hints = FF_BUFFER_HINTS_VALID |
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
298 FF_BUFFER_HINTS_PRESERVE |
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
299 FF_BUFFER_HINTS_REUSABLE;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
300 if (avctx->reget_buffer(avctx, f)) {
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
301 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
302 return -1;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
303 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
304 /* bit 31 means same as previous pic */
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
305 f->pict_type = (header & (1<<31))? FF_P_TYPE : FF_I_TYPE;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
306 f->key_frame = f->pict_type == FF_I_TYPE;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
307
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
308 if (f->pict_type == FF_I_TYPE) {
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
309 for(y=0; y<avctx->height; y++)
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
310 memcpy(&f->data[0][ (avctx->height-y)*f->linesize[0] ],
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
311 &buf[y*avctx->width*3],
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
312 f->linesize[0]);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
313 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
314 break;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
315
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
316 case 2:
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
317 case 4:
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
318 /**
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
319 * Fraps v2 is Huffman-coded YUV420 planes
4142
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
320 * Fraps v4 is virtually the same
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
321 */
4142
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
322 avctx->pix_fmt = PIX_FMT_YUV420P;
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
323 planes = 3;
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
324 f->reference = 1;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
325 f->buffer_hints = FF_BUFFER_HINTS_VALID |
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
326 FF_BUFFER_HINTS_PRESERVE |
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
327 FF_BUFFER_HINTS_REUSABLE;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
328 if (avctx->reget_buffer(avctx, f)) {
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
329 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
330 return -1;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
331 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
332 /* skip frame */
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
333 if(buf_size == 8) {
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
334 f->pict_type = FF_P_TYPE;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
335 f->key_frame = 0;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
336 break;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
337 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
338 f->pict_type = FF_I_TYPE;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
339 f->key_frame = 1;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
340 if ((LE_32(buf) != FPS_TAG)||(buf_size < (planes*1024 + 24))) {
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
341 av_log(avctx, AV_LOG_ERROR, "Fraps: error in data stream\n");
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
342 return -1;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
343 }
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
344 for(i = 0; i < planes; i++) {
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
345 offs[i] = LE_32(buf + 4 + i * 4);
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
346 if(offs[i] >= buf_size || (i && offs[i] <= offs[i - 1] + 1024)) {
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
347 av_log(avctx, AV_LOG_ERROR, "Fraps: plane %i offset is out of bounds\n", i);
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
348 return -1;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
349 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
350 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
351 offs[planes] = buf_size;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
352 for(i = 0; i < planes; i++){
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
353 is_chroma = !!i;
4142
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
354 s->tmpbuf = av_realloc(s->tmpbuf, offs[i + 1] - offs[i] - 1024 + FF_INPUT_BUFFER_PADDING_SIZE);
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
355 if(fraps2_decode_plane(s, f->data[i], f->linesize[i], avctx->width >> is_chroma,
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
356 avctx->height >> is_chroma, buf + offs[i], offs[i + 1] - offs[i], is_chroma) < 0) {
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
357 av_log(avctx, AV_LOG_ERROR, "Error decoding plane %i\n", i);
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
358 return -1;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
359 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
360 }
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
361 break;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
362 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
363
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
364 *frame = *f;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
365 *data_size = sizeof(AVFrame);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
366
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
367 return buf_size;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
368 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
369
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
370
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
371 /**
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
372 * closes decoder
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
373 * @param avctx codec context
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
374 * @return 0 on success or negative if fails
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
375 */
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
376 static int decode_end(AVCodecContext *avctx)
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
377 {
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
378 FrapsContext *s = (FrapsContext*)avctx->priv_data;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
379
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
380 if (s->frame.data[0])
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
381 avctx->release_buffer(avctx, &s->frame);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
382
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
383 av_freep(&s->tmpbuf);
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
384 return 0;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
385 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
386
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
387
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
388 AVCodec fraps_decoder = {
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
389 "fraps",
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
390 CODEC_TYPE_VIDEO,
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
391 CODEC_ID_FRAPS,
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
392 sizeof(FrapsContext),
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
393 decode_init,
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
394 NULL,
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
395 decode_end,
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
396 decode_frame,
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
397 CODEC_CAP_DR1,
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
398 };