1 /*
2 * ATI VCR1 codec
3 * Copyright (c) 2003 Michael Niedermayer
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * ATI VCR1 codec
25 */
26
31
36
38 {
40
44 }
45
46 return 0;
47 }
48
51 {
55 const uint8_t *bytestream_end = bytestream + avpkt->
size;
57
61 }
62
67
68 for (i = 0; i < 16; i++) {
69 a->
delta[i] = *bytestream++;
70 bytestream++;
71 }
72
73 for (y = 0; y < avctx->
height; y++) {
76
77 if ((y & 3) == 0) {
80
82
83 for (i = 0; i < 4; i++)
84 a->
offset[i] = *bytestream++;
85
86 offset = a->
offset[0] - a->
delta[bytestream[2] & 0xF];
87 for (x = 0; x < avctx->
width; x += 4) {
88 luma[0] = offset += a->
delta[bytestream[2] & 0xF];
89 luma[1] = offset += a->
delta[bytestream[2] >> 4];
90 luma[2] = offset += a->
delta[bytestream[0] & 0xF];
91 luma[3] = offset += a->
delta[bytestream[0] >> 4];
92 luma += 4;
93
94 *cb++ = bytestream[3];
95 *
cr++ = bytestream[1];
96
97 bytestream += 4;
98 }
99 } else {
101
102 offset = a->
offset[y & 3] - a->
delta[bytestream[2] & 0xF];
103
104 for (x = 0; x < avctx->
width; x += 8) {
105 luma[0] = offset += a->
delta[bytestream[2] & 0xF];
106 luma[1] = offset += a->
delta[bytestream[2] >> 4];
107 luma[2] = offset += a->
delta[bytestream[3] & 0xF];
108 luma[3] = offset += a->
delta[bytestream[3] >> 4];
109 luma[4] = offset += a->
delta[bytestream[0] & 0xF];
110 luma[5] = offset += a->
delta[bytestream[0] >> 4];
111 luma[6] = offset += a->
delta[bytestream[1] & 0xF];
112 luma[7] = offset += a->
delta[bytestream[1] >> 4];
113 luma += 8;
114 bytestream += 4;
115 }
116 }
117 }
118
119 *got_frame = 1;
120
121 return bytestream - avpkt->
data;
122 }
123
133 };