annotate fraps.c @ 11560:8a4984c5cacc libavcodec

Define AVMediaType enum, and use it instead of enum CodecType, which is deprecated and will be dropped at the next major bump.
author stefano
date Tue, 30 Mar 2010 23:30:55 +0000
parents 4cab394c16ea
children 7dd2a45249a9
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 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
22
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
23 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 8257
diff changeset
24 * @file libavcodec/fraps.c
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
25 * Lossless Fraps 'FPS1' decoder
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
26 * @author Roine Gustafsson <roine at users sf net>
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
27 * @author Konstantin Shishkov
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
28 *
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
29 * 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
30 *
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
31 * Version 2 files support by Konstantin Shishkov
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
32 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
33
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
34 #include "avcodec.h"
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9355
diff changeset
35 #include "get_bits.h"
5820
ffac546a3861 moves fraps huffman decoder to its own file, making it more generic
aurel
parents: 5215
diff changeset
36 #include "huffman.h"
ffac546a3861 moves fraps huffman decoder to its own file, making it more generic
aurel
parents: 5215
diff changeset
37 #include "bytestream.h"
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
38 #include "dsputil.h"
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
39
2701
6a22fbe16d6d signature has an 'x'
melanson
parents: 2700
diff changeset
40 #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
41
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
42 /**
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
43 * local variable storage
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
44 */
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
45 typedef struct FrapsContext{
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
46 AVCodecContext *avctx;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
47 AVFrame frame;
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
48 uint8_t *tmpbuf;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
49 DSPContext dsp;
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
50 } FrapsContext;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
51
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
52
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
53 /**
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
54 * initializes decoder
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
55 * @param avctx codec context
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
56 * @return 0 on success or negative if fails
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
57 */
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6477
diff changeset
58 static av_cold int decode_init(AVCodecContext *avctx)
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
59 {
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
60 FrapsContext * const s = avctx->priv_data;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
61
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
62 avctx->coded_frame = (AVFrame*)&s->frame;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
63 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
64
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
65 s->avctx = avctx;
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
66 s->tmpbuf = NULL;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
67
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
68 dsputil_init(&s->dsp, avctx);
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
69
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
70 return 0;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
71 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
72
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
73 /**
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
74 * Comparator - our nodes should ascend by count
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
75 * but with preserved symbol order
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
76 */
5157
1d116d421bbb correct type of qsort() comparison callback
mru
parents: 4801
diff changeset
77 static int huff_cmp(const void *va, const void *vb){
1d116d421bbb correct type of qsort() comparison callback
mru
parents: 4801
diff changeset
78 const Node *a = va, *b = vb;
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
79 return (a->count - b->count)*256 + a->sym - b->sym;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
80 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
81
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
82 /**
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
83 * decode Fraps v2 packed plane
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
84 */
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
85 static int fraps2_decode_plane(FrapsContext *s, uint8_t *dst, int stride, int w,
6476
e9aa4dc2d937 Add step variable (for future v5 decoding)
kostya
parents: 6473
diff changeset
86 int h, const uint8_t *src, int size, int Uoff,
e9aa4dc2d937 Add step variable (for future v5 decoding)
kostya
parents: 6473
diff changeset
87 const int step)
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 int i, j;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
90 GetBitContext gb;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
91 VLC vlc;
5820
ffac546a3861 moves fraps huffman decoder to its own file, making it more generic
aurel
parents: 5215
diff changeset
92 Node nodes[512];
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
93
5820
ffac546a3861 moves fraps huffman decoder to its own file, making it more generic
aurel
parents: 5215
diff changeset
94 for(i = 0; i < 256; i++)
ffac546a3861 moves fraps huffman decoder to its own file, making it more generic
aurel
parents: 5215
diff changeset
95 nodes[i].count = bytestream_get_le32(&src);
ffac546a3861 moves fraps huffman decoder to its own file, making it more generic
aurel
parents: 5215
diff changeset
96 size -= 1024;
6473
e0cd9697ac6d huffman: add a zero_count flag and use it in fraps
aurel
parents: 6374
diff changeset
97 if (ff_huff_build_tree(s->avctx, &vlc, 256, nodes, huff_cmp,
e0cd9697ac6d huffman: add a zero_count flag and use it in fraps
aurel
parents: 6374
diff changeset
98 FF_HUFFMAN_FLAG_ZERO_COUNT) < 0)
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
99 return -1;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
100 /* we have built Huffman table and are ready to decode plane */
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
101
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
102 /* convert bits so they may be used by standard bitreader */
6374
3356be010cfe Add casts to avoid warnings:
reimar
parents: 6270
diff changeset
103 s->dsp.bswap_buf((uint32_t *)s->tmpbuf, (const uint32_t *)src, size >> 2);
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
104
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
105 init_get_bits(&gb, s->tmpbuf, size * 8);
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
106 for(j = 0; j < h; j++){
6476
e9aa4dc2d937 Add step variable (for future v5 decoding)
kostya
parents: 6473
diff changeset
107 for(i = 0; i < w*step; i += step){
5820
ffac546a3861 moves fraps huffman decoder to its own file, making it more generic
aurel
parents: 5215
diff changeset
108 dst[i] = get_vlc2(&gb, vlc.table, 9, 3);
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
109 /* lines are stored as deltas between previous lines
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
110 * and we need to add 0x80 to the first lines of chroma planes
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
111 */
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
112 if(j) dst[i] += dst[i - stride];
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
113 else if(Uoff) dst[i] += 0x80;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
114 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
115 dst += stride;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
116 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
117 free_vlc(&vlc);
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
118 return 0;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
119 }
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
120
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
121 /**
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
122 * decode a frame
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
123 * @param avctx codec context
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
124 * @param data output AVFrame
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
125 * @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
126 * @param buf input data frame
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
127 * @param buf_size size of input data frame
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
128 * @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
129 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
130 static int decode_frame(AVCodecContext *avctx,
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
131 void *data, int *data_size,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
132 AVPacket *avpkt)
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
133 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
134 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
135 int buf_size = avpkt->size;
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
136 FrapsContext * const s = avctx->priv_data;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
137 AVFrame *frame = data;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
138 AVFrame * const f = (AVFrame*)&s->frame;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
139 uint32_t header;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
140 unsigned int version,header_size;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
141 unsigned int x, y;
6270
michael
parents: 5820
diff changeset
142 const uint32_t *buf32;
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
143 uint32_t *luma1,*luma2,*cb,*cr;
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
144 uint32_t offs[4];
7529
6b13ee6a63ca R and B components are stored as a differences to G component in Fraps v5.
kostya
parents: 7040
diff changeset
145 int i, j, is_chroma, planes;
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
146
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
147
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4148
diff changeset
148 header = AV_RL32(buf);
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
149 version = header & 0xff;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
150 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
151
8257
6f0821e1f899 Fraps version 3 seems to be the same as Fraps v5
kostya
parents: 7535
diff changeset
152 if (version > 5) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
153 av_log(avctx, AV_LOG_ERROR,
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
154 "This file is encoded with Fraps version %d. " \
8257
6f0821e1f899 Fraps version 3 seems to be the same as Fraps v5
kostya
parents: 7535
diff changeset
155 "This codec can only decode versions <= 5.\n", version);
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
156 return -1;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
157 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
158
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
159 buf+=4;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
160 if (header_size == 8)
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
161 buf+=4;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
162
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
163 switch(version) {
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
164 case 0:
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
165 default:
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
166 /* Fraps v0 is a reordered YUV420 */
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
167 avctx->pix_fmt = PIX_FMT_YUV420P;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
168
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
169 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
170 (buf_size != header_size) ) {
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
171 av_log(avctx, AV_LOG_ERROR,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
172 "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
173 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
174 return -1;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
175 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
176
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
177 if (( (avctx->width % 8) != 0) || ( (avctx->height % 2) != 0 )) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
178 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
179 avctx->width, avctx->height);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
180 return -1;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
181 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
182
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
183 f->reference = 1;
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
184 f->buffer_hints = FF_BUFFER_HINTS_VALID |
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
185 FF_BUFFER_HINTS_PRESERVE |
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
186 FF_BUFFER_HINTS_REUSABLE;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
187 if (avctx->reget_buffer(avctx, f)) {
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
188 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
189 return -1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
190 }
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
191 /* bit 31 means same as previous pic */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
192 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
193 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
194
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
195 if (f->pict_type == FF_I_TYPE) {
6270
michael
parents: 5820
diff changeset
196 buf32=(const uint32_t*)buf;
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
197 for(y=0; y<avctx->height/2; y++){
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
198 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
199 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
200 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
201 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
202 for(x=0; x<avctx->width; x+=8){
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
203 *(luma1++) = *(buf32++);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
204 *(luma1++) = *(buf32++);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
205 *(luma2++) = *(buf32++);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
206 *(luma2++) = *(buf32++);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
207 *(cr++) = *(buf32++);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
208 *(cb++) = *(buf32++);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
209 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
210 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
211 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
212 break;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
213
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
214 case 1:
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
215 /* Fraps v1 is an upside-down BGR24 */
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
216 avctx->pix_fmt = PIX_FMT_BGR24;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
217
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
218 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
219 (buf_size != header_size) ) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2701
diff changeset
220 av_log(avctx, AV_LOG_ERROR,
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
221 "Invalid frame length %d (should be %d)\n",
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
222 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
223 return -1;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
224 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
225
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
226 f->reference = 1;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
227 f->buffer_hints = FF_BUFFER_HINTS_VALID |
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
228 FF_BUFFER_HINTS_PRESERVE |
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
229 FF_BUFFER_HINTS_REUSABLE;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
230 if (avctx->reget_buffer(avctx, f)) {
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
231 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
232 return -1;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
233 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
234 /* bit 31 means same as previous pic */
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
235 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
236 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
237
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
238 if (f->pict_type == FF_I_TYPE) {
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
239 for(y=0; y<avctx->height; y++)
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
240 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
241 &buf[y*avctx->width*3],
9438
7f84bce8dd26 For every line, copy 3*width bytes instead of linesize[0] to avoid
vitor
parents: 9428
diff changeset
242 3*avctx->width);
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
243 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
244 break;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
245
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
246 case 2:
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
247 case 4:
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
248 /**
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
249 * 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
250 * Fraps v4 is virtually the same
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
251 */
4142
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
252 avctx->pix_fmt = PIX_FMT_YUV420P;
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
253 planes = 3;
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
254 f->reference = 1;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
255 f->buffer_hints = FF_BUFFER_HINTS_VALID |
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
256 FF_BUFFER_HINTS_PRESERVE |
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
257 FF_BUFFER_HINTS_REUSABLE;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
258 if (avctx->reget_buffer(avctx, f)) {
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
259 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
260 return -1;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
261 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
262 /* skip frame */
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
263 if(buf_size == 8) {
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
264 f->pict_type = FF_P_TYPE;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
265 f->key_frame = 0;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
266 break;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
267 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
268 f->pict_type = FF_I_TYPE;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
269 f->key_frame = 1;
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4148
diff changeset
270 if ((AV_RL32(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
271 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
272 return -1;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
273 }
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
274 for(i = 0; i < planes; i++) {
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4148
diff changeset
275 offs[i] = AV_RL32(buf + 4 + i * 4);
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
276 if(offs[i] >= buf_size || (i && offs[i] <= offs[i - 1] + 1024)) {
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
277 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
278 return -1;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
279 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
280 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
281 offs[planes] = buf_size;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
282 for(i = 0; i < planes; i++){
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
283 is_chroma = !!i;
4142
79ddfdee291d Correct support for Fraps v4 (and Huffman tree for < 256 symbols)
kostya
parents: 4141
diff changeset
284 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
285 if(fraps2_decode_plane(s, f->data[i], f->linesize[i], avctx->width >> is_chroma,
6476
e9aa4dc2d937 Add step variable (for future v5 decoding)
kostya
parents: 6473
diff changeset
286 avctx->height >> is_chroma, buf + offs[i], offs[i + 1] - offs[i], is_chroma, 1) < 0) {
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
287 av_log(avctx, AV_LOG_ERROR, "Error decoding plane %i\n", i);
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
288 return -1;
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
289 }
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
290 }
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
291 break;
8257
6f0821e1f899 Fraps version 3 seems to be the same as Fraps v5
kostya
parents: 7535
diff changeset
292 case 3:
6477
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
293 case 5:
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
294 /* Virtually the same as version 4, but is for RGB24 */
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
295 avctx->pix_fmt = PIX_FMT_BGR24;
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
296 planes = 3;
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
297 f->reference = 1;
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
298 f->buffer_hints = FF_BUFFER_HINTS_VALID |
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
299 FF_BUFFER_HINTS_PRESERVE |
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
300 FF_BUFFER_HINTS_REUSABLE;
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
301 if (avctx->reget_buffer(avctx, f)) {
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
302 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
303 return -1;
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
304 }
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
305 /* skip frame */
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
306 if(buf_size == 8) {
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
307 f->pict_type = FF_P_TYPE;
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
308 f->key_frame = 0;
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
309 break;
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
310 }
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
311 f->pict_type = FF_I_TYPE;
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
312 f->key_frame = 1;
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
313 if ((AV_RL32(buf) != FPS_TAG)||(buf_size < (planes*1024 + 24))) {
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
314 av_log(avctx, AV_LOG_ERROR, "Fraps: error in data stream\n");
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
315 return -1;
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
316 }
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
317 for(i = 0; i < planes; i++) {
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
318 offs[i] = AV_RL32(buf + 4 + i * 4);
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
319 if(offs[i] >= buf_size || (i && offs[i] <= offs[i - 1] + 1024)) {
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
320 av_log(avctx, AV_LOG_ERROR, "Fraps: plane %i offset is out of bounds\n", i);
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
321 return -1;
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
322 }
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
323 }
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
324 offs[planes] = buf_size;
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
325 for(i = 0; i < planes; i++){
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
326 s->tmpbuf = av_realloc(s->tmpbuf, offs[i + 1] - offs[i] - 1024 + FF_INPUT_BUFFER_PADDING_SIZE);
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
327 if(fraps2_decode_plane(s, f->data[0] + i + (f->linesize[0] * (avctx->height - 1)), -f->linesize[0],
7529
6b13ee6a63ca R and B components are stored as a differences to G component in Fraps v5.
kostya
parents: 7040
diff changeset
328 avctx->width, avctx->height, buf + offs[i], offs[i + 1] - offs[i], 0, 3) < 0) {
6477
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
329 av_log(avctx, AV_LOG_ERROR, "Error decoding plane %i\n", i);
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
330 return -1;
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
331 }
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
332 }
7529
6b13ee6a63ca R and B components are stored as a differences to G component in Fraps v5.
kostya
parents: 7040
diff changeset
333 // convert pseudo-YUV into real RGB
6b13ee6a63ca R and B components are stored as a differences to G component in Fraps v5.
kostya
parents: 7040
diff changeset
334 for(j = 0; j < avctx->height; j++){
6b13ee6a63ca R and B components are stored as a differences to G component in Fraps v5.
kostya
parents: 7040
diff changeset
335 for(i = 0; i < avctx->width; i++){
7535
699c33b2eabf Simplify colour conversion in Fraps as suggested by Michael
kostya
parents: 7529
diff changeset
336 f->data[0][0 + i*3 + j*f->linesize[0]] += f->data[0][1 + i*3 + j*f->linesize[0]];
699c33b2eabf Simplify colour conversion in Fraps as suggested by Michael
kostya
parents: 7529
diff changeset
337 f->data[0][2 + i*3 + j*f->linesize[0]] += f->data[0][1 + i*3 + j*f->linesize[0]];
7529
6b13ee6a63ca R and B components are stored as a differences to G component in Fraps v5.
kostya
parents: 7040
diff changeset
338 }
6b13ee6a63ca R and B components are stored as a differences to G component in Fraps v5.
kostya
parents: 7040
diff changeset
339 }
6477
36fb492f44cc Fraps v5 decoding support
kostya
parents: 6476
diff changeset
340 break;
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
341 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
342
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
343 *frame = *f;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
344 *data_size = sizeof(AVFrame);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
345
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
346 return buf_size;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
347 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
348
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
349
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
350 /**
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
351 * closes decoder
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
352 * @param avctx codec context
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
353 * @return 0 on success or negative if fails
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
354 */
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6477
diff changeset
355 static av_cold int decode_end(AVCodecContext *avctx)
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
356 {
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
357 FrapsContext *s = (FrapsContext*)avctx->priv_data;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
358
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
359 if (s->frame.data[0])
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
360 avctx->release_buffer(avctx, &s->frame);
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
361
4140
a2247f4db5aa Fraps v2 and v4 support
kostya
parents: 3947
diff changeset
362 av_freep(&s->tmpbuf);
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
363 return 0;
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
364 }
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
365
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 AVCodec fraps_decoder = {
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
368 "fraps",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 9553
diff changeset
369 AVMEDIA_TYPE_VIDEO,
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
370 CODEC_ID_FRAPS,
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
371 sizeof(FrapsContext),
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
372 decode_init,
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
373 NULL,
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
374 decode_end,
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
375 decode_frame,
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
376 CODEC_CAP_DR1,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6710
diff changeset
377 .long_name = NULL_IF_CONFIG_SMALL("Fraps"),
2700
485571c9182f Fraps FPS1 video decoder (v1 & v2), courtesy of Roine Gustafsson <roine
melanson
parents:
diff changeset
378 };